파이썬 우주선게임 코드 분석 [1]

이정민·2021년 4월 26일
0
<script>
import random
from time import sleep

import pygame
from pygame.locals import*

WINDOW_WIDTH = 480
WINDOW_HEIGHT = 640

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
YELLOW = (250, 250, 50)
RED = (250, 50, 50)

FPS = 60

class Fighter(pygame.sprite.Sprite):
	def __init__(self):
    	super(Fighter, self).__init__()
        self.image = pygame.image.load('fighter.png')
        self.rect = self.image.get_rect()
        self.rect.x = int(WINDOW_WIDTH / 2)
        self.rect.y = WINDOW_HEIGHT - self.rect.height
        self.dx = 0
        self.dy = 0
    
    def update(self):
    	self.rect.x += self.dx
        self.rect.y += self.dy
        
        if self.rect.x < 0 or self.rect.x + self.rect.width > WINDOW_WIDTH:
        	self.rect.x -= self.dx
        
        if self.rect.y < 0 or self.rect.y + self.rect.height > WINDOW_HEIGHT:
        	self.rect.y -= self.dy
    
    def draw(self, screen):
    	screen.blit(self.image, self.rect)
    
    def collide(self, sprites):
    	for sprite in sprites:
        	if pygame.sprite.collide_rect(self, sprite):
            	return sprite
</script>

class Fighter(pygame.sprite.Sprite) 비행기 클레스를 만든다.
pygame의 sprite를 상속받는다.

(( 여기서 깨달은 점.. def init(self):에서 무조건 매개변수가 있어야된다는 생각이 있었는데 꼭 필요한건 아니었다. ))

pygame.sprite.Sprite.__init__(self) 대신 super이용해서 클래스를 상속받는다. 대신 super.__init__()에는 self를 넣지 않는다.

self.image, self.rect 등의 변수들에게 pygame객체를 이용해 각각 초기화시켜준다.

pygame.image.load('fighter.png')를 통해 이미지를 불러와서 self.image변수에 저장한다.

self.image.get_rect()를 통해 self.image의 크기만한 사각형을 get_rect()함수를 사용하여 만들어준다.

self.rect.x 와 self.rect.y 변수를 만들어서 처음 비행기가 시작하는 지점을 설정해준다.

x축 가운데로 위치 (int(WINDOW_WIDTH / 2))
y축 화면 바로 밑에서 시작 WINDOW_HEIGHT - self.rect.height 화면의 위쪽이 0 아래쪽이 640이라서
640 - 사각형의 크기 만큼 빼면 바로 밑에서 시작한다.
(( 왜 위쪽이 0인지 모르겠다. ))

self.dx 와 self.dy 을 통해 키보드 방향 초기값을 0으로 잡는다.

def update(self): 메서드 안에 포함되어있는 self.rect.x += self.dx 식을 이용해서
어떤 방향으로 움직일때 마다 rect.x가 계속 증가하거나 감소하게 만든다.

그리고 화면을 벗어나는 것을 방지하기 위해 if문을 사용한다.
오른쪽이 + 왼쪽이 - 일때 키보드 좌,우방향을 나타내는 변수 self.dx를 통해 rect.x에 계속 숫자를 더해준다. 그렇게 됬을때 왼쪽으로 계속 갈 경우 0보다 작거나, 480보다 클 때 self.rect.x -= self.dx를 이용하여 반대로 빼줘서 화면을 벗어나지 못하게 한다.

(( update 메서드는 실시간으로 rect.x값이 변하는거 같다. self.dx 값을 0이 아닌 1로 넣고 시작하면 내가 오른쪽 키를 누르지 않아도 자기 스스로 오른쪽으로 간다. ))

위 아래를 담당하는 self.rect.y도 마찬가지로 설정해준다.

def draw(self, screen): 안에 있는 screen.blit()를 통해 비행기 이미지와 앞에 만들었던 사각형self.rect를 넣어주어 스크린화면 상에 띄운다.

((def draw 안에 있는 매개변수 screen은 뒤에 만들게 될 def main(): 메서드 안에 포함된 실제 디스플레이 세팅값을 넣어준 screen변수를 이용 !!))

def collide(self, sprites):메서드는 비행기가 충돌했을 경우를 생각해서 만든다.
pygame에 있는 sprites들을 for문을 통해 한개씩 검사한다.

pygame.sprite에 있는 collide_rect()를 시용하여 비행기와 sprite와 관련된 물체들과의 충돌이 있으면 sprite를 리턴시켜주게 만든다.

다음에 계속.....

profile
안녕하세요.

0개의 댓글