목차
4. 키보드 입력
5. FPS
6. 충돌처리
7. 텍스트
8. 게임 개발 프레임
9. 퀴즈
4. 키보드 입력
pygame에서 키보드 입력을 하는 방법은
pygame.K_원하는키 예) RIGHT, LEFT ,UP,DOWN, 을 사용해주면 됩니다.
import pygame
pygame.init() # 초기화 (반드시 필요)
# 화면 크기 설정
screen_width = 480 # 가로 크기
screen_height = 640 # 세로 크기
screen = pygame.display.set_mode((screen_width,screen_height))
# 화면 타이틀 설정
pygame.display.set_caption("Nado Game") # 게임 이름
# 배경 이미지 불러오기
background = pygame.image.load("경로")
# 캐릭터(스프라이트) 불러오기
character = pygame.image.load("경로")
character_size = character.get_rect().size # 이미지 크기를 구해옴
character_width = character_size[0]
character_height = character_size[1]
character_x_pos = (screen_width / 2) - (character_width / 2) # 화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
character_y_pos = screen_height - character_height # 화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)
# 이동할 좌표
to_x = 0
to_y = 0
# 이벤트 루프
running = True # 게임이 진행중인가?
while running:
for event in pygame.event.get(): # 어떤 이벤트가 발생하였는가?
if event.type == pygame.QUIT: # 창이 닫히는 이벤트가 발생하였는가?
running = False # 게임이 진행중이 아님
if event.type == pygame.KEYDOWN: # 키가 눌러졌는지 확인
if event.key == pygame.K_LEFT: # 캐릭터를 왼쪽으로
to_x -= 5 # to_x = to_x - 5
elif event.key == pygame.K_RIGHT: # 캐릭터를 오른쪽으로
to_x += 5
elif event.key == pygame.K_UP: # 캐릭터를 위로
to_y -= 5
elif event.key == pygame.K_DOWN: # 캐릭터를 아래로
to_y += 5
if event.type == pygame.KEYUP: # 방향키를 떼면 멈춤
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
to_x = 0
elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
to_y = 0
character_x_pos += to_x
character_y_pos += to_y
# 가로 경계값 처리
if character_x_pos < 0:
character_x_pos = 0
elif character_x_pos > screen_width - character_width:
character_x_pos = screen_width - character_width
# 세로 경계값 처리
if character_y_pos < 0:
character_y_pos = 0
elif character_y_pos > screen_height - character_height:
character_y_pos = screen_height - character_height
screen.blit(background, (0,0)) # 배경 그리기
screen.blit(character, (character_x_pos, character_y_pos)) # 캐릭터 그리기
pygame.display.update() # 게임 화면을 다시 그리기
# pygame 종료
pygame.quit()
5. FPS
pygame에서 FPS를 설정하는 방법
pygame.time.Clock() 를 사용합니다.
FPS(프레임)을 왜 설정해야 할까요?
우선 첫번째, FPS가 일정하지 않으면 끊기거나 버벅거릴 수 있습니다.
두번째, FPS 설정이 없다면 게임의 속도는 컴퓨터의 성능에 따라 달라질 수 있습니다.
누구는 유리한 환경에서 누구는 불리한 환경에서 하면 안된다는 뜻입니다.
import pygame
pygame.init() # 초기화 (반드시 필요)
# 화면 크기 설정
screen_width = 480 # 가로 크기
screen_height = 640 # 세로 크기
screen = pygame.display.set_mode((screen_width,screen_height))
# 화면 타이틀 설정
pygame.display.set_caption("Nado Game") # 게임 이름
# FPS
clock = pygame.time.Clock()
# 배경 이미지 불러오기
background = pygame.image.load("경로")
# 캐릭터(스프라이트) 불러오기
character = pygame.image.load("경로")
character_size = character.get_rect().size # 이미지 크기를 구해옴
character_width = character_size[0]
character_height = character_size[1]
character_x_pos = (screen_width / 2) - (character_width / 2) # 화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
character_y_pos = screen_height - character_height # 화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)
# 이동할 좌표
to_x = 0
to_y = 0
# 이동 속도
character_speed = 0.6
# 이벤트 루프
running = True # 게임이 진행중인가?
while running:
dt = clock.tick(30) # 게임화면의 초당 프레임 수를 설정
print("fps : "+str(clock.get_fps()))
for event in pygame.event.get(): # 어떤 이벤트가 발생하였는가?
if event.type == pygame.QUIT: # 창이 닫히는 이벤트가 발생하였는가?
running = False # 게임이 진행중이 아님
if event.type == pygame.KEYDOWN: # 키가 눌러졌는지 확인
if event.key == pygame.K_LEFT: # 캐릭터를 왼쪽으로
to_x -= character_speed # to_x = to_x - 5
elif event.key == pygame.K_RIGHT: # 캐릭터를 오른쪽으로
to_x += character_speed
elif event.key == pygame.K_UP: # 캐릭터를 위로
to_y -= character_speed
elif event.key == pygame.K_DOWN: # 캐릭터를 아래로
to_y += character_speed
if event.type == pygame.KEYUP: # 방향키를 떼면 멈춤
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
to_x = 0
elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
to_y = 0
character_x_pos += to_x * dt
character_y_pos += to_y * dt
# 가로 경계값 처리
if character_x_pos < 0:
character_x_pos = 0
elif character_x_pos > screen_width - character_width:
character_x_pos = screen_width - character_width
# 세로 경계값 처리
if character_y_pos < 0:
character_y_pos = 0
elif character_y_pos > screen_height - character_height:
character_y_pos = screen_height - character_height
screen.blit(background, (0,0)) # 배경 그리기
screen.blit(character, (character_x_pos, character_y_pos)) # 캐릭터 그리기
pygame.display.update() # 게임 화면을 다시 그리기
# pygame 종료
pygame.quit()
6. 충돌 처리
이제 적을 만들고 서로 충돌했는지 안했는지를 확인해 보는 코드를 작성해봅시다.
import pygame
pygame.init() # 초기화 (반드시 필요)
# 화면 크기 설정
screen_width = 480 # 가로 크기
screen_height = 640 # 세로 크기
screen = pygame.display.set_mode((screen_width,screen_height))
# 화면 타이틀 설정
pygame.display.set_caption("Nado Game") # 게임 이름
# FPS
clock = pygame.time.Clock()
# 배경 이미지 불러오기
background = pygame.image.load("경로")
# 캐릭터(스프라이트) 불러오기
character = pygame.image.load("경로")
character_size = character.get_rect().size # 이미지 크기를 구해옴
character_width = character_size[0] # 캐릭터의 가로 크기
character_height = character_size[1] # 캐릭터의 세로 크기
character_x_pos = (screen_width / 2) - (character_width / 2) # 화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
character_y_pos = screen_height - character_height # 화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)
# 이동할 좌표
to_x = 0
to_y = 0
# 이동 속도
character_speed = 0.6
# 적 enemy 캐릭터
enemy = pygame.image.load("경로")
enemy_size = enemy.get_rect().size # 이미지 크기를 구해옴
enemy_width = enemy_size[0]
enemy_height = enemy_size[1]
enemy_x_pos = (screen_width / 2) - (enemy_width / 2) # 화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
enemy_y_pos = (screen_height / 2) - (enemy_height / 2) # 화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)
# 이벤트 루프
running = True # 게임이 진행중인가?
while running:
dt = clock.tick(60) # 게임화면의 초당 프레임 수를 설정
for event in pygame.event.get(): # 어떤 이벤트가 발생하였는가?
if event.type == pygame.QUIT: # 창이 닫히는 이벤트가 발생하였는가?
running = False # 게임이 진행중이 아님
if event.type == pygame.KEYDOWN: # 키가 눌러졌는지 확인
if event.key == pygame.K_LEFT: # 캐릭터를 왼쪽으로
to_x -= character_speed # to_x = to_x - 5
elif event.key == pygame.K_RIGHT: # 캐릭터를 오른쪽으로
to_x += character_speed
elif event.key == pygame.K_UP: # 캐릭터를 위로
to_y -= character_speed
elif event.key == pygame.K_DOWN: # 캐릭터를 아래로
to_y += character_speed
if event.type == pygame.KEYUP: # 방향키를 떼면 멈춤
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
to_x = 0
elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
to_y = 0
character_x_pos += to_x * dt
character_y_pos += to_y * dt
# 가로 경계값 처리
if character_x_pos < 0:
character_x_pos = 0
elif character_x_pos > screen_width - character_width:
character_x_pos = screen_width - character_width
# 세로 경계값 처리
if character_y_pos < 0:
character_y_pos = 0
elif character_y_pos > screen_height - character_height:
character_y_pos = screen_height - character_height
# 충돌 처리를 위한 rect 정보 업데이트
character_rect = character.get_rect()
character_rect.left = character_x_pos
character_rect.top = character_y_pos
enemy_rect = enemy.get_rect()
enemy_rect.left = enemy_x_pos
enemy_rect.top = enemy_y_pos
# 충돌 체크
if character_rect.colliderect(enemy_rect):
print("충돌했어요")
running = False
screen.blit(background, (0,0)) # 배경 그리기
screen.blit(character, (character_x_pos, character_y_pos)) # 캐릭터 그리기
screen.blit(enemy, (enemy_x_pos, enemy_y_pos)) # 적 그리기
pygame.display.update() # 게임 화면을 다시 그리기
# pygame 종료
pygame.quit()
7. 텍스트
pygame에서 텍스트를 사용하려면 먼저 폰트를 정의해야합니다.
pygame.font.Font(폰트, 크기)
import pygame
pygame.init() # 초기화 (반드시 필요)
# 화면 크기 설정
screen_width = 480 # 가로 크기
screen_height = 640 # 세로 크기
screen = pygame.display.set_mode((screen_width,screen_height))
# 화면 타이틀 설정
pygame.display.set_caption("Nado Game") # 게임 이름
# FPS
clock = pygame.time.Clock()
# 배경 이미지 불러오기
background = pygame.image.load("경로")
# 캐릭터(스프라이트) 불러오기
character = pygame.image.load("경로")
character_size = character.get_rect().size # 이미지 크기를 구해옴
character_width = character_size[0] # 캐릭터의 가로 크기
character_height = character_size[1] # 캐릭터의 세로 크기
character_x_pos = (screen_width / 2) - (character_width / 2) # 화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
character_y_pos = screen_height - character_height # 화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)
# 이동할 좌표
to_x = 0
to_y = 0
# 이동 속도
character_speed = 0.6
# 적 enemy 캐릭터
enemy = pygame.image.load("경로")
enemy_size = enemy.get_rect().size # 이미지 크기를 구해옴
enemy_width = enemy_size[0]
enemy_height = enemy_size[1]
enemy_x_pos = (screen_width / 2) - (enemy_width / 2) # 화면 가로의 절반 크기에 해당하는 곳에 위치 (가로)
enemy_y_pos = (screen_height / 2) - (enemy_height / 2) # 화면 세로 크기 가장 아래에 해당하는 곳에 위치 (세로)
# 폰트 정의
game_font = pygame.font.Font(None, 40) # 폰트 객체 생성 (폰트, 크기)
# 총 시간
total_time = 10
# 시작 시간
start_ticks = pygame.time.get_ticks() # 시작 tick 을 받아옴
# 이벤트 루프
running = True # 게임이 진행중인가?
while running:
dt = clock.tick(60) # 게임화면의 초당 프레임 수를 설정
for event in pygame.event.get(): # 어떤 이벤트가 발생하였는가?
if event.type == pygame.QUIT: # 창이 닫히는 이벤트가 발생하였는가?
running = False # 게임이 진행중이 아님
if event.type == pygame.KEYDOWN: # 키가 눌러졌는지 확인
if event.key == pygame.K_LEFT: # 캐릭터를 왼쪽으로
to_x -= character_speed # to_x = to_x - 5
elif event.key == pygame.K_RIGHT: # 캐릭터를 오른쪽으로
to_x += character_speed
elif event.key == pygame.K_UP: # 캐릭터를 위로
to_y -= character_speed
elif event.key == pygame.K_DOWN: # 캐릭터를 아래로
to_y += character_speed
if event.type == pygame.KEYUP: # 방향키를 떼면 멈춤
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
to_x = 0
elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
to_y = 0
character_x_pos += to_x * dt
character_y_pos += to_y * dt
# 가로 경계값 처리
if character_x_pos < 0:
character_x_pos = 0
elif character_x_pos > screen_width - character_width:
character_x_pos = screen_width - character_width
# 세로 경계값 처리
if character_y_pos < 0:
character_y_pos = 0
elif character_y_pos > screen_height - character_height:
character_y_pos = screen_height - character_height
# 충돌 처리를 위한 rect 정보 업데이트
character_rect = character.get_rect()
character_rect.left = character_x_pos
character_rect.top = character_y_pos
enemy_rect = enemy.get_rect()
enemy_rect.left = enemy_x_pos
enemy_rect.top = enemy_y_pos
# 충돌 체크
if character_rect.colliderect(enemy_rect):
print("충돌했어요")
running = False
screen.blit(background, (0,0)) # 배경 그리기
screen.blit(character, (character_x_pos, character_y_pos)) # 캐릭터 그리기
screen.blit(enemy, (enemy_x_pos, enemy_y_pos)) # 적 그리기
# 타이머 집어 넣기
# 경과 시간 계산
elapsed_time = (pygame.time.get_ticks() - start_ticks) / 1000
# 경과 시간(ms)을 천으로 나누어서 초(s) 단위로 표시
timer = game_font.render(str(int(total_time - elapsed_time)), True, (255,255,255))
# 출력할 글자, True, 글자 색상
screen.blit(timer, (10, 10))
# 만약 시간이 0 이하이면 게임 종료
if total_time - elapsed_time <= 0:
print("타임아웃")
running = False
pygame.display.update() # 게임 화면을 다시 그리기
# 잠시 대기
pygame.time.delay(2000) # 2초 정도 대기 (ms)
# pygame 종료
pygame.quit()
8. 게임 개발 프레임
앞에서 배운 내용을 토대로 프레임을 만들어 보겠습니다.
import pygame
##########################################################
# 기본 초기화 (반드시 해야 하는 것들)
pygame.init()
# 화면 크기 설정
screen_width = 480 # 가로 크기
screen_height = 640 # 세로 크기
screen = pygame.display.set_mode((screen_width,screen_height))
# 화면 타이틀 설정
pygame.display.set_caption("오락실 게임") # 게임 이름
# FPS
clock = pygame.time.Clock()
##########################################################
# 1. 사용자 게임 초기화 (배경 화면, 게임 이미지, 좌표, 속도, 폰트 등)
running = True # 게임이 진행중인가?
while running:
dt = clock.tick(30)
# 2. 이벤트 처리 (키보드, 마우스 등)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 3. 게임 캐릭터 위치 정의
# 4. 충돌 처리
# 5. 화면에 그리기
pygame.display.update()
pygame.quit()
9. 퀴즈
하늘에서 떨어지는 똥 피하기 게임을 만들어야 합니다.
우선 조건을 하나하나씩 살펴보죠.
1. 캐릭터는 화면 가장 아래에 위치 한다고 했습니다. 그리고 좌우로만 이동가능.
일단 캐릭터의 위치는 위의 코드에서 그대로 사용.
또한 좌우로만 이동 가능이니까 왼쪽,오른쪽 키 입력만 넣습니다.
2. 똥(적)은 화면 가장 위에서 떨어집니다. x좌표는 매번 랜덤 으로 설정
우선 적을 생성하고나서 y좌표를 0으로 줍니다. (가장 위에 있어야 하니까)
그리고 나서 x좌표를 random을 사용합시다.
import random
import를 시켜준 후
random 함수 중 randint를 사용합시다.
enemy_x_pos = random.randint(0, screen_width - enemy_width)
3. 캐릭터가 똥을 피하면 다음 똥이 떨어짐
똥이 화면과 닿았을때 다시 생성시키는 코드를 작성합니다.
if enemy_y_pos > screen_height:
enemy_y_pos = 0
enemy_x_pos = random.randint(0, screen_width - enemy_width)
4. 캐릭터가 똥과 충돌하면 게임 종료
enemy_rect = enemy.get_rect()
enemy_rect.left = enemy_x_pos
enemy_rect.top = enemy_y_pos
if character_rect.colliderect(enemy_rect):
running = False
5. FPS는 30으로 설정
# FPS
clock = pygame.time.Clock()
dt = clock.tick(30) # 프레임 30
게임 이미지는 예제에서 썻던 이미지를 사용합니다.
import pygame
import random
pygame.init()
# 화면 크기 설정
screen_width = 480 # 가로 크기
screen_height = 640 # 세로 크기
screen = pygame.display.set_mode((screen_width,screen_height))
# 화면 타이틀 설정
pygame.display.set_caption("Quiz") # 게임 이름
# FPS
clock = pygame.time.Clock()
# 배경
background = pygame.image.load("경로")
# 캐릭터 생성
character = pygame.image.load("경로")
character_size = character.get_rect().size
character_width = character_size[0]
character_height = character_size[1]
character_x_pos = (screen_width / 2) - (character_width / 2)
character_y_pos = screen_height - character_height
# 이동할 좌표
to_x = 0
# 이동 속도
character_speed = 0.5
# 똥 생성
enemy = pygame.image.load("경로")
enemy_size = enemy.get_rect().size
enemy_width = enemy_size[0]
enemy_height = enemy_size[1]
enemy_x_pos = 0
enemy_y_pos = 0
enemy_speed = 15
running = True
while running:
dt = clock.tick(30) # 프레임 30
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN: # 키가 눌러졌는지 확인
if event.key == pygame.K_LEFT: # 캐릭터를 왼쪽으로
to_x -= character_speed
elif event.key == pygame.K_RIGHT: # 캐릭터를 오른쪽으로
to_x += character_speed
if event.type == pygame.KEYUP: # 방향키를 떼면 멈춤
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
to_x = 0
character_x_pos += to_x * dt
enemy_y_pos += enemy_speed # 점점 위에서 아래로 내려옴
if enemy_y_pos > screen_height:
enemy_y_pos = 0
enemy_x_pos = random.randint(0, screen_width - enemy_width)
if character_x_pos < 0:
character_x_pos = 0
elif character_x_pos > screen_width - character_width:
character_x_pos = screen_width - character_width
# 충돌 처리
character_rect = character.get_rect()
character_rect.left = character_x_pos
character_rect.top = character_y_pos
enemy_rect = enemy.get_rect()
enemy_rect.left = enemy_x_pos
enemy_rect.top = enemy_y_pos
# 충돌 체크
if character_rect.colliderect(enemy_rect):
running = False
screen.blit(background, (0,0))
screen.blit(character, (character_x_pos, character_y_pos))
screen.blit(enemy, (enemy_x_pos, enemy_y_pos))
pygame.display.update()
pygame.time.delay(1000)
pygame.quit()
'Python' 카테고리의 다른 글
Python(8) 활용 3 (0) | 2024.11.08 |
---|---|
Python(6) 활용1 (0) | 2024.11.04 |
Python(5) 기초 마무리 (0) | 2024.11.03 |
Python(4) 반복문과 함수 (0) | 2024.11.02 |
Python(3) 문자열 , 자료구조 (0) | 2024.11.01 |