본문 바로가기
파이썬 (Python)/파이썬 크래시 코스 - 에릭 마테스

[Python] 실습편 - 외계인 침공 : 불을 뿜는 우주선 5

by Minkyu Lee 2024. 3. 22.

 

개요

우주선을 좌우로 움직이게 해본다.
꾹 눌러도 동작하게 하는게 핵심이다.

연타해야만 움직이는 예는
책에서 이전 챕터를 참고하기 바람

- 핵심
매프레임 이벤트를 감지하여서
우주선 위치를 업데이트 한 후,
화면에 그린다.
 
- 우주선 위치 업데이트
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) #지정된 위치에 이미지 그리기

댓글