[Cocos 2D] 2. User Input & Scene Updating

SYiee·2022년 10월 11일
0

게임프로그래밍

목록 보기
2/6
post-thumbnail

User Input

Layer

➢is_event_handler= True
➢By Pyglet

from pyglet.window import key
  • on_key_press(key, modifiers)
  • on_key_release(key, modifiers)
  • on_mouse_motion(x, y, dx, dy)
  • on_mouse_press(x, y, buttons, modifiers)
  • on_mouse_drag(x, y, dx, dy, buttons, modifiers)
  • modifiers: bitwise or of several constants indicating which modifiers are active at the time of the press (ctrl, shift, capslock, etc.)
import cocos
from pyglet.window import key


class MainLayer(cocos.layer.Layer):
    is_event_handler = True

    def __init__(self):
        super(MainLayer, self).__init__()
        self.player = cocos.sprite.Sprite('ball.png')
        self.player.position = (320, 240)
        self.player.color = (0, 0, 255)
        self.add(self.player) #layer에 player 추가

    def on_key_press(self, k, m):
        print('Pressed', key.symbol_string(k))


if __name__ == '__main__':
    cocos.director.director.init(caption='Hello, Cocos')
    layer = MainLayer()
    scene = cocos.scene.Scene(layer) #씬에 layer 추가
    cocos.director.director.run(scene)

Scene Updating

CocosNode.schedule(callback)

-> The callback function is called on every frame
-> Unity에서 Update함수와 비슷한 역할로 매 프레임 마다 인자로 주어지는 함수를 호출한다. callback이 적힌 자리에 호출하고 싶은 함수의 이름을 적어 사용하면 된다.

CocosNode.unschedule(callback)

-> cancel a timer
-> 아마도 스케쥴의 반대 의미로 callback을 멈춘다는 의미

def callback(dt, *args, **kwargs):
✅dt : 시간 차 (이전 함수가 call 되었을때와의 시간차)

📌상하좌우키로 공 움직이기

import cocos
from collections import defaultdict # for key dict
from pyglet.window import key

class MainLayer(cocos.layer.Layer):
    is_event_handler = True
    
    def __init__(self):
        super(MainLayer, self).__init__()
        self.player = cocos.sprite.Sprite('ball.png')
        self.player.position = (320,240)
        self.player.color = (255, 0, 0)
        self.add(self.player)
        self.speed = 100.0
        self.pressed = defaultdict(int)
        self.schedule(self.update) #✅매 frame마다 update
    
    #파라미터 k에 해당하는 키가 눌리면 pressed dict에서 그 키값에 해당하는 값을 1로 변경
	def on_key_press(self, k, m):
        self.pressed[k] = 1
    def on_key_release(self, k, m):
        self.pressed[k] = 0
    
    #📌Scene Updating
    def update(self, dt):
        x = self.pressed[key.RIGHT]-self.pressed[key.LEFT]
        y = self.pressed[key.UP]-self.pressed[key.DOWN]
        
        #공의 나중 위치 = 현재 위치 + 속도*이동거리
        if x != 0 or y != 0:
            pos = self.player.position
            newX = pos[0] + self.speed*x*dt
            newY = pos[1] + self.speed*y*dt
            self.player.position = (newX, newY)
        
        
if __name__ == '__main__':
    cocos.director.director.init(caption='Hello, Cocos')
    layer = MainLayer()
    scene = cocos.scene.Scene(layer)
    cocos.director.director.run(scene)


📝docs
https://docs.cocos.com/creator/manual/en/scripting/scheduler.html

profile
게임 개발자

0개의 댓글