キーを押しながらスプライトを動かそうとしています。on_key_press() と on_key_release() でそれを行うことができますが、これらを使用すると、左を押しながら右に移動したり、その逆を行ったりするという問題が発生します。キーポーリングを使用したいのですが、pyglet のドキュメントからこれを見つけました。
from pyglet.window import key
window = pyglet.window.Window()
keys = key.KeyStateHandler()
window.push_handlers(keys)
# Check if the spacebar is currently pressed:
if keys[key.SPACE]:
pass
これはcocos2dでは実装できないようです。簡単な例を以下に示します。「Key Press!」と表示されます。大丈夫ですが、「スペース!」を印刷できれば。スペースキーを繰り返し押すと、問題が解決します。
from cocos.director import director
from cocos.layer import *
from cocos.scene import Scene
from pyglet.window import key
from pyglet.window.key import KeyStateHandler
class MyLayer(Layer):
is_event_handler = True
def __init__(self):
super(MyLayer, self).__init__()
self.keys = KeyStateHandler()
director.window.push_handlers(self.keys)
def on_key_press(self, symbol, modifiers):
print('Key press!')
if self.keys[key.SPACE]:
print('Space!')
def main():
director.init(resizable=False, width=1024, height=786)
title_scene = Scene(MyLayer())
director.run(title_scene)
if __name__ == '__main__':
main()
完全を期すために、ここに私の on_key_press()、on_key_release() コードを示します。問題は、右を押して左を押し、左を離すと、on_key_release() が x 速度をゼロに設定するため、スプライトが停止することです。しかし、私はまだ右を押しているので、左を押して放した後、その方向に移動し続けたい.
def on_key_press(self, symbol, modifiers):
if symbol == key.LEFT:
self.player1.velocity = (-self.player1.speed, self.player1.velocity[1])
if symbol == key.RIGHT:
self.player1.velocity = (self.player1.speed, self.player1.velocity[1])
def on_key_release(self, symbol, modifiers):
if symbol == key.LEFT:
self.player1.velocity = (0, self.player1.velocity[1])
if symbol == key.RIGHT:
self.player1.velocity = (0, self.player1.velocity[1])