유치한 게임
[파이썬 간단한 게임 만들기] 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()
반응형