본문 바로가기
개발 일지

파이썬 tkinter 그래픽으로 슈팅 게임 만들기 1

by PrintedLove 2019. 11. 22.

 

안녕하세요 PrintedLove입니다.

 

저번에 게임메이커로 만들던 RPG는 잠시 미뤄두고, 파이썬으로 게임 계발을 해보려 합니다.

사실 학교 과제 때문에 젠장

 

pygame 라이브러리를 사용하지 않고 제작합니다. 때문에.. 효과음이 없습니다!

 

바로 시작하겠습니다!

 

1
2
3
4
5
6
7
8
from tkinter import *
import time
 
window = Tk()
window.title("nemoRPG")   # 게임 이름
window.resizable(0,0)
canvas = Canvas(window, width = 640, height = 640, bg ="white")   # 창 생성
canvas.pack()
cs

 

먼저 tkinter와 time 라이브러리를 불러옵니다.

canvas크기를 정해주고, pack()해 줍니다.

 

 

실행해 보시면 네모난 창이 생긴것을 알 수 있습니다.

게임의 틀이자 룸이라고 불리는 배경입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Game:   # 게임 클래스
    def __init__(self):
        self.keys = set()   # 버튼 세트 생성
        window.bind("<KeyPress>", self.keyPressHandler)
        window.bind("<KeyRelease>", self.keyReleaseHandler)
 
        test = canvas.create_rectangle(310310330330, fill = "black")
 
        while(1):  # 메인 루프
            for key in self.keys:   # 버튼 체킹    
                if key == ord('A'):
                    canvas.move(test, -5,  0)
 
            window.update()   # 업데이트
            time.sleep(0.01)   # 0.01초 만큼 sleep
                        
    def keyPressHandler(self, event):   # 버튼 세트에 버튼추가
        self.keys.add(event.keycode)
 
    def keyReleaseHandler(self, event):   # 버튼 세트에 버튼 제거
        if event.keycode in self.keys:
            self.keys.remove(event.keycode)
 
Game()   #게임 실행
cs

 

이제 Game 클래스를 정의해 줍시다.

Game 클래스는 UI 드로잉과 버튼 감지, 다른 오브젝트들의 스텝을 처리해 주는 오브젝트입니다.

 

클래스 내부의 while문에서 캠퍼스를 계속 업데이트 함으로써 움직이는 효과를 줄 수 있습니다.

위의 코드에서, A키를 눌렀을 때 왼쪽으로 움직이는 것을 보실 수 있습니다.

 

 

원리는 아래와 같습니다.

 

버튼을 눌렀을때 keyPressHandler함수가 keys 세트에 버튼을 추가해 줍니다.

땠을때는 반대로 keyRelasedHandler함수가 작동하여 세트에서 버튼을 제거해 줍니다.

 

그렇게 수정된 keys세트를 메인 루프에서 for문으로 돌려 버튼을 하나하나 체크해 줍니다.

해당키가 눌러졌으면, 캠퍼스를 이동합니다.

 

while 문의 window.update 함수는 반복문이 실행될 때마다 canvas에서 변경된 값들을 업데이트 해 줍니다.

time.sleep 함수는 해당 시간만큼 딜레이를 주어 게임의 속도를 조절해 줍니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from tkinter import *
import time
 
window = Tk()
window.title("nemoRPG")   # 게임 이름
window.resizable(0,0)
canvas = Canvas(window, width = 640, height = 640, bg ="white")   # 창 생성
canvas.pack()
 
class Game:   # 게임 클래스
    def __init__(self):
        self.keys = set()   # 버튼 세트 생성
        window.bind("<KeyPress>", self.keyPressHandler)
        window.bind("<KeyRelease>", self.keyReleaseHandler)
 
        test = canvas.create_rectangle(310310330330, fill = "black") # 테스트용 canvas 생성
 
        while(1):  # 메인 루프
            for key in self.keys:   # 버튼 체킹    
                if key == ord('A'):
                    canvas.move(test, -5,  0)
                if key == ord('D'):
                    canvas.move(test, 5,  0)
                if key == ord('W'):
                    canvas.move(test, 0,  -5)
                if key == ord('S'):
                    canvas.move(test, 0,  5)
 
            window.update()   # 업데이트
            time.sleep(0.01)   # 0.01초 만큼 sleep
                        
    def keyPressHandler(self, event):   # 버튼 세트에 버튼추가
        self.keys.add(event.keycode)
 
    def keyReleaseHandler(self, event):   # 버튼 세트에 버튼 제거
        if event.keycode in self.keys:
            self.keys.remove(event.keycode)
 
Game()
cs

위 코드에서 버튼을 조금 추가하면 4방향 이동이 가능한 단순한 게임을 구현하실 수 있습니다.

 

 

다음 글에서는 오브젝트의 틀을 만들어 보겠습니다.

댓글