cocos2d 动画时随机处理事件
cocos2d process events randomly while animating
这个问题太奇怪了,我想我在某个地方犯了一个大错误。
我在 python3 中使用 cocos2d。我创建了一个简单的示例,它基本上是 samples/hello_world.py
和 samples/handling_events.py
的合并,只是在检查事件的同时可视化移动文本。
问题是:在动画进行时,事件基本上是随机处理的:有时,按ESC,程序会在几秒钟后停止,有时不会停止。按键盘通常不会在文本中显示任何内容,但如果你按了很多键,你可能会得到一些可视化。与鼠标相同:如果您移动或单击很多,有时您会看到事件已处理。
我不明白发生了什么:cocos 难道不应该在每个渲染帧之前处理事件吗?我错过了什么吗?
源代码
import cocos
import pyglet
from cocos.actions import *
class HelloWorld(cocos.layer.ColorLayer):
def __init__(self):
super(HelloWorld, self).__init__(64, 64, 200, 255)
label = cocos.text.Label(
'Hello, World!',
font_name='Times New Roman',
font_size=32,
anchor_x='center',
anchor_y='center')
label.position = (320, 240)
# label.scale = 2 # Pixel scale
self.add(label)
scale = ScaleBy(3, duration=2)
# Unlimited repeat
#label.do(Repeat(scale + Reverse(scale)))
# Limited repeat
label.do((scale + Reverse(scale)) * 3)
class KeyDisplay(cocos.layer.Layer):
# This is necessary to receive events
is_event_handler = True
def __init__(self):
super(KeyDisplay, self).__init__()
self.text = cocos.text.Label('', x=100, y=200)
self.down_keys_ = set()
self.update_text()
self.add(self.text)
def update_text(self):
key_names = [pyglet.window.key.symbol_string(k) for k in self.down_keys_]
self.text.element.text = 'Keys: ' + ' '.join(key_names)
def on_key_press(self, key, modifiers):
self.down_keys_.add(key)
self.update_text()
def on_key_release(self, key, modifiers):
self.down_keys_.remove(key)
self.update_text()
class MouseDisplay(cocos.layer.Layer):
is_event_handler = True
def __init__(self):
super(MouseDisplay, self).__init__()
self.text = cocos.text.Label('', x=100, y=150)
self.add(self.text)
def on_mouse_motion(self, x, y, dx, dy):
self.text.element.text = 'Moving'
def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
self.text.element.text = 'Dragging'
def on_mouse_press(self, x, y, buttons, modifiers):
self.text.element.text = 'Pressed'
def on_mouse_release(self, x, y, buttons, modifiers):
self.text.element.text = 'Released'
if __name__ == '__main__':
cocos.director.director.init()
# A layer with text
hello_layer = HelloWorld()
hello_layer.do(RotateBy(360 * 2, duration=5))
# A layer for key
key_layer = KeyDisplay()
# A layer for mouse
mouse_layer = MouseDisplay()
main_scene = cocos.scene.Scene(hello_layer, key_layer, mouse_layer)
cocos.director.director.run(main_scene)
这个问题太奇怪了,我想我在某个地方犯了一个大错误。
我在 python3 中使用 cocos2d。我创建了一个简单的示例,它基本上是 samples/hello_world.py
和 samples/handling_events.py
的合并,只是在检查事件的同时可视化移动文本。
问题是:在动画进行时,事件基本上是随机处理的:有时,按ESC,程序会在几秒钟后停止,有时不会停止。按键盘通常不会在文本中显示任何内容,但如果你按了很多键,你可能会得到一些可视化。与鼠标相同:如果您移动或单击很多,有时您会看到事件已处理。
我不明白发生了什么:cocos 难道不应该在每个渲染帧之前处理事件吗?我错过了什么吗?
源代码
import cocos
import pyglet
from cocos.actions import *
class HelloWorld(cocos.layer.ColorLayer):
def __init__(self):
super(HelloWorld, self).__init__(64, 64, 200, 255)
label = cocos.text.Label(
'Hello, World!',
font_name='Times New Roman',
font_size=32,
anchor_x='center',
anchor_y='center')
label.position = (320, 240)
# label.scale = 2 # Pixel scale
self.add(label)
scale = ScaleBy(3, duration=2)
# Unlimited repeat
#label.do(Repeat(scale + Reverse(scale)))
# Limited repeat
label.do((scale + Reverse(scale)) * 3)
class KeyDisplay(cocos.layer.Layer):
# This is necessary to receive events
is_event_handler = True
def __init__(self):
super(KeyDisplay, self).__init__()
self.text = cocos.text.Label('', x=100, y=200)
self.down_keys_ = set()
self.update_text()
self.add(self.text)
def update_text(self):
key_names = [pyglet.window.key.symbol_string(k) for k in self.down_keys_]
self.text.element.text = 'Keys: ' + ' '.join(key_names)
def on_key_press(self, key, modifiers):
self.down_keys_.add(key)
self.update_text()
def on_key_release(self, key, modifiers):
self.down_keys_.remove(key)
self.update_text()
class MouseDisplay(cocos.layer.Layer):
is_event_handler = True
def __init__(self):
super(MouseDisplay, self).__init__()
self.text = cocos.text.Label('', x=100, y=150)
self.add(self.text)
def on_mouse_motion(self, x, y, dx, dy):
self.text.element.text = 'Moving'
def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
self.text.element.text = 'Dragging'
def on_mouse_press(self, x, y, buttons, modifiers):
self.text.element.text = 'Pressed'
def on_mouse_release(self, x, y, buttons, modifiers):
self.text.element.text = 'Released'
if __name__ == '__main__':
cocos.director.director.init()
# A layer with text
hello_layer = HelloWorld()
hello_layer.do(RotateBy(360 * 2, duration=5))
# A layer for key
key_layer = KeyDisplay()
# A layer for mouse
mouse_layer = MouseDisplay()
main_scene = cocos.scene.Scene(hello_layer, key_layer, mouse_layer)
cocos.director.director.run(main_scene)