반응형

@35 : 점프게임 만들기 - pygame 사용

 

1. 게임화면 구성하고 스페이스 키 입력 확인하기

2. 게임 플레이어 만들기 - 스페이스 키 입력시 점프

3. 적 만들고 닿으면 종료하기

 


1. 게임화면 구성하고 스페이스 키 입력 확인하기

import sys
import pygame
import sys

FPS = 60
MAX_WIDTH = 600
MAX_HEIGHT = 400

# 파이게임 초기화
pygame.init()
# clock 설정
clock = pygame.time.Clock()
screen = pygame.display.set_mode((MAX_WIDTH, MAX_HEIGHT))

def main():
    while True:
        # 파이게임에서 발생하는 이벤트 가져옴
        for event in pygame.event.get():
            # x 누르면 꺼짐
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            # 키 눌려서 스페이스 바면 출력
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    print('space')
                else:
                    print('others')
            
        # 1초에 몇 프레임으로 동작할 지 결정
        clock.tick(FPS)
        
        # 화면 흰색으로 채우기
        screen.fill((255,255,255))
        
        # 화면 업데이트
        pygame.display.update()
        
if __name__ == '__main__':
    main()

결과.

- 스페이스 키를 누르면 'space' 표시

- 다른 키를 누르면 'others' 표시


2. 게임 플레이어 만들기 - 스페이스 키 입력시 점프

import sys
import pygame

FPS = 60
MAX_WIDTH = 600
MAX_HEIGHT = 400

# 파이게임 초기화
pygame.init()
# clock 설정
clock = pygame.time.Clock()
screen = pygame.display.set_mode((MAX_WIDTH, MAX_HEIGHT))

# 플레이어 클래스 만들기
class Player():
    # 클래스 생성되면 무조건 실행되는 함수
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.isJump = False
        self.jumpCount = 10
        
    # 파란색 사각형을 x,y 좌표에 40x40 크기로 그림
    def draw(self):
        return pygame.draw.rect(screen, (0, 0, 255), (self.x, self.y, 40, 40))
    
    # 플레이어가 점프하는 모양을 그림 (y좌표가 바뀜)
    def jump(self):
        # 스페이스키가 눌려서 isJump 가 True가 되면 update될 때마다 y좌표가 바뀜
        # 점프가 끝난 뒤 isJump가 False로 변경됨
        if self.isJump:
            if self.jumpCount >= -10:
                neg = 1
                if self.jumpCount < 0:
                    neg = -1
                self.y -= self.jumpCount**2*0.7*neg
                self.jumpCount -= 1
            else:
                self.isJump = False
                self.jumpCount = 10
                
# 플레이어 만들기 (x좌표는 50, y좌표는 바닥)                
player = Player(50, MAX_HEIGHT - 40)
        

def main():
    while True:
        # 파이게임에서 발생하는 이벤트 가져옴
        for event in pygame.event.get():
            # x 누르면 꺼짐
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            # 키 눌려서 스페이스 바면 출력
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    player.isJump = True
            
        # 1초에 몇 프레임으로 동작할 지 결정
        clock.tick(FPS)
        
        # 화면 흰색으로 채우기
        screen.fill((255,255,255))
        
        # x,y에 네모 그리고
        player_rect = player.draw()
        # isJump가 True라면, 새로운 좌표 얻어옴
        player.jump()
        
        print(player_rect)
        
        
        # 화면 업데이트
        pygame.display.update()
        
if __name__ == '__main__':
    main()

결과.

- 스페이스 키를 누르면 점프하는 플레이어의 좌표가 출력됨


3. 적 만들고 닿으면 종료하기

import sys
import pygame

FPS = 60
MAX_WIDTH = 600
MAX_HEIGHT = 400

# 파이게임 초기화
pygame.init()
# clock 설정
clock = pygame.time.Clock()
screen = pygame.display.set_mode((MAX_WIDTH, MAX_HEIGHT))

# 플레이어 클래스 만들기
class Player():
    # 클래스 생성되면 무조건 실행되는 함수
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.isJump = False
        self.jumpCount = 10
        
    # 파란색 사각형을 x,y 좌표에 40x40 크기로 그림
    def draw(self):
        return pygame.draw.rect(screen, (0, 0, 255), (self.x, self.y, 40, 40))
    
    # 플레이어가 점프하는 모양을 그림 (y좌표가 바뀜)
    def jump(self):
        # 스페이스키가 눌려서 isJump 가 True가 되면 update될 때마다 y좌표가 바뀜
        # 점프가 끝난 뒤 isJump가 False로 변경됨
        if self.isJump:
            if self.jumpCount >= -10:
                neg = 1
                if self.jumpCount < 0:
                    neg = -1
                self.y -= self.jumpCount**2*0.7*neg
                self.jumpCount -= 1
            else:
                self.isJump = False
                self.jumpCount = 10
        
# 적 클래스
class Enemy():
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    # 빨간색 사각형
    def draw(self):
        return pygame.draw.rect(screen, (255, 0, 0), (self.x, self.y, 20, 40))
    
    # 가로로 움직이기
    def move(self, speed):
        self.x = self.x - speed
        if self.x <= 0:
            self.x = MAX_WIDTH
                    
                
# 플레이어 만들기 (x좌표는 50, y좌표는 바닥)                
player = Player(50, MAX_HEIGHT - 40)

# 적 만들기
enemy = Enemy(MAX_WIDTH, MAX_HEIGHT - 40)
        

def main():
    
    speed = 7
    
    while True:
        # 파이게임에서 발생하는 이벤트 가져옴
        for event in pygame.event.get():
            # x 누르면 꺼짐
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            # 키 눌려서 스페이스 바면 출력
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    player.isJump = True
            
        # 1초에 몇 프레임으로 동작할 지 결정
        clock.tick(FPS)
        
        # 화면 흰색으로 채우기
        screen.fill((255,255,255))
        
        # x,y에 플레이어 네모 그리기
        player_rect = player.draw()
        # isJump가 True라면, 새로운 좌표 얻어옴
        player.jump()
        
        # 적군 그리기
        enemy_rect = enemy.draw()        
        enemy.move(speed)
        speed = speed + 0.01
        
        # 플레이어랑 에너미랑 충돌하면
        if player_rect.colliderect(enemy_rect):
            print('충돌')
            pygame.quit()
            sys.exit()
        
        # 화면 업데이트
        pygame.display.update()
        
if __name__ == '__main__':
    main()

 

결과.

- 스페이스키를 눌러 빨간색 적군을 피한다.

- 적군은 점점 빨라진다 (0.01만큼)

- 부딪히면 '충돌'이 출력되며 게임 창이 닫힌다.


단순한데 재밌네~

 

엔트리나 스크래치에서 게임을 만들었을 때는

점프하는 함수를 만들어 놓고, 메인쓰레드에서 호출하면 메인과 별개로 점프를 하게 된다.

그렇기 때문에 다른 플레이어나 적군들의 움직임이 멈출 일이 없는데,

 

이렇게 줄코딩으로 하다보니...

물론 이것도 쓰레드로 돌리면 되겠지만

점프플래그(isJump)를 만들어서 점프중이면 좌표만 바꿔주고

적군도 움직임의 좌표만 바꿔주고

한꺼번에 화면을 업데이트 하게 되는 구조다.

 

물론 쓰레드로 돌렸어도 각자 알아서 좌표를 바꾸면

화면 업데이트는 한 곳에서 해야하겠지?

 

뭐, 게임 개발자가 아니라서 모르겠지만...

그쪽에서는 더 나이스한 방법이 있을지도.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기