저번 글에서 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(310, 310, 20, 20, "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픽셀식 움직이는 모습을 알 수 있습니다.
이것을 잘 이용하면 중력과 가속도, 등의 효과를 줄 수 있습니다.
다음 글에서는 물리엔진을 구현해 보도록 하겠습니다.
'개발 일지' 카테고리의 다른 글
파이썬 tkinter 그래픽으로 슈팅 게임 만들기 4 (0) | 2019.11.24 |
---|---|
파이썬 tkinter 그래픽으로 슈팅 게임 만들기 3 (1) | 2019.11.22 |
파이썬 tkinter 그래픽으로 슈팅 게임 만들기 1 (5) | 2019.11.22 |
파이썬 터틀 그래픽으로 달력 만들기 (1) | 2019.11.04 |
GMS2로 RPG 만들기4 - 2019. 10. 14 (4) | 2019.10.14 |
댓글