개요
우주선을 좌우로 움직이게 해본다.
꾹 눌러도 동작하게 하는게 핵심이다.
연타해야만 움직이는 예는
책에서 이전 챕터를 참고하기 바람
- 핵심
매프레임 이벤트를 감지하여서
우주선 위치를 업데이트 한 후,
화면에 그린다.
- 우주선 위치 업데이트
KEYDOWN과 KEYUP으로 키보드 눌렀다 뗐다를 감지한다.
불린값을 이용해 키 입력의 참, 거짓을 판별하며
이동량만큼 이동한다.
+ 챕터 12.6.3 까지의 내용이다.
코드
alien_invasion.py
import sys
import pygame
from settings import Settings
from ship import Ship
class AlienInvasion :
"""게임 자원과 동작을 전체적으로 관리하는 클래스"""
def __init__(self) :
"""게임을 초기화하고 게임 자원을 만듭니다"""
pygame.init()
self.clock = pygame.time.Clock()
self.settings = Settings()
self.screen = pygame.display.set_mode(
(self.settings.screen_width, self.settings.screen_height))
pygame.display.set_caption("Alien Invasion")
self.ship = Ship(self)
def run_game(self) :
"""게임의 메인 루프를 시작합니다"""
while True :
self._check_event() # 키 입력을 체크하고
self.ship.update() # 3. 우주선 위치를 업데이트 하여서
self._update_screen() # 화면에 그린다.
self.clock.tick(60)
def _check_event(self) :
'''키 입력과 마우스 이벤트에 응답합니다.'''
for event in pygame.event.get() :
if event.type == pygame.QUIT :
sys.exit()
elif event.type == pygame.KEYDOWN : # 1. 눌렀을 때
if event.key == pygame.K_RIGHT :
self.ship.moving_right = True
elif event.key == pygame.K_LEFT : # 각 이벤트와 키가 1:1 대응하므로 elif를 써도 된다.
self.ship.moving_left = True
elif event.type == pygame.KEYUP : # 2. 뗐을 때
if event.key == pygame.K_RIGHT :
self.ship.moving_right = False
elif event.key == pygame.K_LEFT :
self.ship.moving_left = False
def _update_screen(self) :
'''화면의 이미지를 업데이트하고 화면을 새로 그립니다.'''
self.screen.fill(self.settings.bg_color)
self.ship.blitme()
pygame.display.flip()
if __name__ == '__main__' :
ai = AlienInvasion()
ai.run_game()
ship.py
import pygame
class Ship :
"""우주선을 관리하는 클래스"""
def __init__(self, ai_game) : # AlienInvasion 클래스에서 정의하는 모든 것에 접근 가능
'''우주선 초기화, 시작 위치 설정'''
self.screen = ai_game.screen # 화면을 속성으로 할당
self.screen_rect = ai_game.screen.get_rect() # 메서드를 사용
#우주선 이미지를 불러오고 사각형을 가져옵니다.
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect() # 우주선 rect 속성 가져오기
#우주선의 초기 위치는 화면 하단 중앙입니다.
self.rect.midbottom = self.screen_rect.midbottom # 우주선 위치 설정
#움직임 플래그는 정지 상태로 시작합니다.
self.moving_right = False # 1. 움직임 불린 초기값
self.moving_left = False
def update(self) :
'''움직임 플래그를 바탕으로 우주선 위치를 업데이트합니다.'''
if self.moving_right : # 2. 움직임이 참일 때
self.rect.x += 1 # 3. 이동량
if self.moving_left : # 좌우 키 동시에 누를 때도 있으므로 elif를 쓰지 않는다.
self.rect.x -= 1
def blitme(self) :
'''우주선을 현재 위치에 그립니다'''
self.screen.blit(self.image, self.rect) #지정된 위치에 이미지 그리기
'파이썬 (Python) > 파이썬 크래시 코스 - 에릭 마테스' 카테고리의 다른 글
[Python] 실습편 - 외계인 침공 : 불을 뿜는 우주선 4 (0) | 2024.03.17 |
---|---|
[Python] 실습편 - 외계인 침공 : 불을 뿜는 우주선 3 (0) | 2024.03.15 |
[Python] 실습편 - 외계인 침공 : 불을 뿜는 우주선 2 (0) | 2024.03.10 |
[Python] 실습편 - 외계인 침공 : 불을 뿜는 우주선 1 (0) | 2024.03.10 |
댓글