ai-creator

[파이썬 간단한 게임 만들기] 0. 기본기 - 글자 출력과 이벤트 본문

유치한 게임

[파이썬 간단한 게임 만들기] 0. 기본기 - 글자 출력과 이벤트

ai-creator 2021. 3. 13. 15:49
반응형

0. 복습하기

1. 파란색 원을 그려보자.

2. 포물선을 그려 공이 튀기는 형상을 만들어보자.

 

더보기
# 4. pygame 무한루프
def runGame():
    global done
    draw_circle = False
    x= 0
    y = size[1]
    to_x = 5
    to_y = -18
    while not done:
        clock.tick(10)
        screen.fill(WHITE)
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done=True
        
        ## bounce
        x += to_x
        y += (to_y + 0.5)
        if y <= 0 or y >= size[1]: # y좌표의 한계치에 다다르면, 방향을 바꿈
            to_y = to_y * -1 
        if x <= 0 or x >= size[0]: # x좌표의 한계치에 다다르면, 방향을 바꿈
            to_x = to_x * -1     

        pygame.draw.circle(screen, (0,0,255), (x, y), 5)
        
        pygame.display.update()

1. 기본 게임판

import pygame # 1. pygame 선언
import random

pygame.init() # 2. pygame 초기화

# 3. pygame에 사용되는 전역변수 선언

WHITE = (255, 255, 255)
size = [400, 400]
screen = pygame.display.set_mode(size)

done = False
clock = pygame.time.Clock()

# 4. pygame 무한루프
def runGame():
    global done
    while not done:
        clock.tick(10)
        screen.fill(WHITE)
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done=True

        ############################
        # 여기에 도형을 그리세요
        ############################
        
        
        pygame.display.update()

runGame()
pygame.quit()

 

2. 글자 쓰기

참고) www.pygame.org/docs/ref/font.html

글자를 쓰기 위해서는

1. font 객체 생성

2. render 로  텍스트와 폰트 색을 설정

3. blit로 화면에 출력

sysfont = pygame.font.SysFont(None, 72)
text = sysfont.render("Hello world!", True, (0, 0, 255)) # BLUE = (0, 0, 255) 
screen.blit(text, (0,0))

# 한글로 써보자!

sysfont = pygame.font.SysFont(None, 72)
text = sysfont.render("안녕", True, (0, 0, 255)) # BLUE = (0, 0, 255) 
screen.blit(text, (0,0))

# 한글이 깨진다면?

windows

pygame.font.SysFont("malgungothic", 72)

mac

pygame.font.SysFont('applegothicttf', 36)

 

3. 이벤트

참고) www.pygame.org/docs/ref/event.html

3-1) Event 속성

3-2) 마우스 클릭

1) 마우스의 클릭 위치에 파란점 찍기

def runGame():
    global done
    draw_circle = False
    while not done:
        clock.tick(10)
        screen.fill(WHITE)
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done=True
            if event.type == pygame.MOUSEBUTTONDOWN:
                draw_circle = True
                mousepos = event.pos
                print(mousepos)

        ############################
        # 여기에 도형을 그리세요
        ############################
        if draw_circle == True:
            pos = mousepos
            pygame.draw.circle(screen, (0,0,255), (pos[0], pos[1]), 5)
        
        pygame.display.update()

2) 파란점을 계속 유지하면서 파란점 찍기(마우스로 글자를 쓸 수 있게끔)

참고 1) 이전좌표 기억하기

1)을 자세히 살펴보면, 마우스로 다른 곳을 클릭하면 이전 점은 표현되지 않는다.

그러므로, 이전 좌표를 계속 저장하고 있어야함을 알 수 있다.

어떤 자료구조에 저장해두면 좋을까?

더보기
def runGame():
    global done
    draw_circle=False
    mousepos=[]
    while not done:
        clock.tick(10)
        screen.fill(WHITE)
        
        #draw_circle = False
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done=True
            if event.type == pygame.MOUSEBUTTONDOWN:
                draw_circle = True
                mousepos.append(event.pos)
                print(mousepos)

        ############################
        # 여기에 도형을 그리세요
        ############################
        if draw_circle == True:
            for pos in mousepos:
                pygame.draw.circle(screen, (0,0,255), (pos[0], pos[1]), 5)
        
        pygame.display.update()

runGame()
pygame.quit()

 

3-3) 키보드

키보드 방향키 입력에 대한 이벤트 감지에 대해서 말씀드리겠습니다.

이벤트 명 발생 이벤트
event.type  pygame.KEYDOWN 키보드 버튼을 눌렀을 때 발생
event.type  pygame.KEYUP 키보드 버튼을 눌렀다 땠을 때 발생
event.key pygame.K_UP (KEYDOWN과 중복) 위쪽 방향키를 눌렀을 때 발생
event.key pygame.K_DOWN (KEYDOWN과 중복) 아래쪽 방향키를 눌렀을 때 발생
event.key pygame.K_LEFT (KEYDOWN과 중복) 왼쪽 방향키를 눌렀을 때 발생
event.key pygame.K_RIGHT (KEYDOWN과 중복) 오른쪽 방향키를 눌렀을 때 발생

위와 같이 각 키보드 이벤트 처리에 대한 정의가 pygame에서 지정 되어있습니다.

 

동그라미를 게임판에 정중앙에 그리고,

좌/우 키보드의 방향에 맞춰 움직이게 합니다.

def runGame():
    global done
    draw_circle = False
    x= 200
    y = 200
    while not done:
        clock.tick(10)
        screen.fill(WHITE)
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done=True
            # 키보드 방향키 입력에 대한 이벤트 처리
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x -= 10
                elif event.key == pygame.K_RIGHT:
                    x += 10

        ############################
        # 여기에 도형을 그리세요
        ############################
        pygame.draw.circle(screen, (0,0,255), (x, y), 5)
        
        pygame.display.update()

상/하/좌/우 모두 움직이도록 하며, 게임판을 벗어났을 warnning 메시지를 띄워보세요.

더보기
def runGame():
    global done
    draw_circle = False
    x= 200
    y = 200
    while not done:
        clock.tick(10)
        screen.fill(WHITE)
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done=True
            # 키보드 방향키 입력에 대한 이벤트 처리
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x -= 10
                elif event.key == pygame.K_RIGHT:
                    x += 10
                elif event.key == pygame.K_UP:
                    y -= 10
                elif event.key == pygame.K_DOWN:
                    y += 10

        ############################
        # 여기에 도형을 그리세요
        ############################
        if (x <= 0 or x >= 400) \
           or (y<=0 or y > 400) :
            print("게임판을 벗어났어요!!")
            sysfont = pygame.font.SysFont("malgungothic", 72)
            text = sysfont.render("경고!!!", True, (0, 0, 255)) # BLUE = (0, 0, 255) 
            screen.blit(text, (100,100))
  
        pygame.draw.circle(screen, (0,0,255), (x, y), 5)
        
        pygame.display.update()

 

4. 확장하기

지난시간에 배운 용사를 좌/우 방향키를 눌러 이동하게 하고,

SPACE 키를 누르면, 점프를 하도록 한다.

 

참고 1) 용사 그리기

sky = pygame.image.load('backgrounds/Background.png')
#sky_rect = sky.get_rect()
#print(sky_rect)
sky = pygame.transform.scale(sky, (400, 300))
screen.blit(sky, (0, 0))

ground = pygame.image.load('backgrounds/Ground.png')
ground = pygame.transform.scale(ground, (400, 150))
screen.blit(ground, (0, 300))

castle = pygame.image.load('backgrounds/castle.png')
castle = pygame.transform.scale(castle, (200, 150))
screen.blit(castle, (200, 150))

heart = pygame.image.load('backgrounds/heart.png')
heart = pygame.transform.scale(heart, (50, 50))
screen.blit(heart, (0, 0))

player = pygame.image.load('backgrounds/Player_Attack_R.png')
player = pygame.transform.scale(player, (50, 50))
screen.blit(player, (100, 250))

참고 2) 스페이스바

if event.type == pg.KEYDOWN:
	if event.key == pg.K_SPACE:
		## jump

참고 3) 공튀기기 코드 이용

 

더보기

## 코드 수정 중

import pygame # 1. pygame 선언
import random

pygame.init() # 2. pygame 초기화

# 3. pygame에 사용되는 전역변수 선언
WHITE = (255, 255, 255)
size = [400, 400]
screen = pygame.display.set_mode(size)

done = False
clock = pygame.time.Clock()

sky_img = pygame.image.load('backgrounds/Background.png')
sky = pygame.transform.scale(sky_img, (400, 300))
print(">> sky_img : ", sky_img)

ground_img = pygame.image.load('backgrounds/Ground.png')
ground = pygame.transform.scale(ground_img, (400, 150))

castle_img = pygame.image.load('backgrounds/castle.png')
castle = pygame.transform.scale(castle_img, (200, 150))

heart_img = pygame.image.load('backgrounds/heart.png')
heart = pygame.transform.scale(heart_img, (50, 50))

player_images = ['backgrounds/Player_Attack_R.png',
                 'backgrounds/Player_Attack_L.png']
player_img = pygame.image.load(player_images[0]) # 첫 시작은 R

# 4. pygame 무한루프
def runGame():
    global done
    global player_img
    bounce = False
    
    player_x = 100
    player_y = 250
    to_x = 5
    to_y = -18
    while not done:
        clock.tick(10)
        screen.fill(WHITE)
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done=True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    player_x -= 10
                    to_x = -5
                    player_img = pygame.image.load(player_images[1])
                elif event.key == pygame.K_RIGHT:
                    player_x += 10
                    to_x = 5
                    player_img = pygame.image.load(player_images[0])
                elif event.key == pygame.K_SPACE and bounce == False: # 점프하고 있으면, 점프 상태 유지
                    bounce = True
                    bounce_count = 0
        
        #sky_rect = sky.get_rect()
        #print(sky_rect)
        
        screen.blit(sky, (0, 0))
        screen.blit(ground, (0, 300))
        screen.blit(castle, (200, 150))
        screen.blit(heart, (0, 0))

        
        ## bounce
        if bounce == True:
            player_x += to_x
            player_y += (to_y + 0.5)
            if player_y <= 200 or player_y >= 250 : # y좌표의 한계치에 다다르면, 방향을 
                if player_y >= 250:
                        player_y = 250 # 조건검사전 연산을 하므로, 땅 아래로 내려갈 수 있으므로 좌표를 재설정해준다.
                to_y = to_y * -1 
                bounce_count += 1
            if player_x <= 0 or player_x >= size[0]: # x좌표의 한계치에 다다르면, 방향을 바꿈
                to_x = to_x * -1    
            
            if bounce_count >= 2:
                bounce = False
            
        player = pygame.transform.scale(player_img, (50, 50)) # 크기
        screen.blit(player, (player_x, player_y)) # 위치

        
        pygame.display.update()

runGame()
pygame.quit()
반응형
Comments