본문 바로가기
개발 일지

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

by PrintedLove 2019. 11. 22.

저번 글에서 canvas.move() 함수를 이용한 간단한 이동을 구현해 보았는데요.

 

하지만 canvas가 객체화 되지 않은 상황에서는 다른 수많은 canvas들과의 상호작용이 힘들 수 있습니다.

때문에 클래스를 이용해서 canvas를 객체화 시킵시다.

 

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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:   # 게임 클래스
    global objects
    objects = set()   # 오브젝트 세트 생성
    def __init__(self):
        self.keys = set()   # 버튼 세트 생성
        window.bind("<KeyPress>", self.keyPressHandler)
        window.bind("<KeyRelease>", self.keyReleaseHandler)
 
       obj_test = element(3103102020"black")
 
        while(1):  # 메인 루프
            for key in self.keys:   # 버튼 체킹
                if key == ord('A'):
                   canvas.move(obj_test.id, -5,  0)
                if key == ord('D'):
                   canvas.move(obj_test.id, 5,  0)
                if key == ord('W'):
                   canvas.move(obj_test.id, 0,  -5)
                if key == ord('S'):
                   canvas.move(obj_test.id, 0,  5)
 
            for obj in objects.copy():   # 오브젝트 스텝
                obj.step()
                    
            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)
 
class element:   # 오브젝트 원형
    def __init__(self, x, y, size_x, size_y, color):
        self.x, self.y = x, y   # 생성 위치
        self.size_x, self.size_y = size_x, size_y   # 크기
        self.color = color   # 색
        objects.add(self)   # 오브젝트 세트에 자신 등록
        self.id = canvas.create_rectangle(x, y, x + self.size_x, y + self.size_y, fill = self.color, width =0)   # 캠버스 추가
 
    def destroy(self):   # 제거 함수
        objects.discard(self)   # 오브젝트 세트에서 자신 제거
        canvas.delete(self.id)   # 캠버스 제거
        del self
 
    def step(self):
        canvas.move(self.id, 0,  1)
 
Game()   # 게임 실행
cs

 

이해를 위해 완성된 코드를 먼저 올립니다.

 

Game클래스에서 오브젝트들을 관리하기 위한 글로벌 set인 objects를 추가했습니다. 버튼 감지를 위한 keys 세트와 같은 역할을 합니다.

앞으로 생성되는 모든 객체 canvas들은 이 집합에서 생성되고 제거됩니다.

 

또 저번 글에서 생성했던 test용 canvas를 element객체로 대체했습니다. 이제 외부에서 이 canvas에 접속하려면 객체 obj_test의 id변수를 참조해야 합니다.

 

메인루프(while 문)에서 객체의 step 함수를 처리하도록 했습니다.

오브젝트들의 step 함수가 이제 메인루프가 반복될 때마다 실행됩니다.

 

영상을 보시면 매 스텝(0.01초)마다 오브젝트가 밑으로 1픽셀식 움직이는 모습을 알 수 있습니다.

이것을 잘 이용하면 중력과 가속도, 등의 효과를 줄 수 있습니다.

 

 

 

다음 글에서는 물리엔진을 구현해 보도록 하겠습니다.

댓글