Итак, ваша проблема, скорее всего, в том, что вы делаете Pressing = False
, если любой ключ выпущен. Принудительное зависание объекта игрока из-за того, что Pressing
означает False
, как только вы отпустите любой из ваших ключей.
Чтобы обойти это, вы должны хранить состояния ваших ключей в переменной (I 'Я назову это self.keys
), и непосредственно перед рендерингом обновите / проверьте ключи и соответственно обновите объект вашего игрока.
Вот рабочий пример движения на объекте игрока (в данном случае красный квадрат)):
from pyglet import *
from pyglet.gl import *
key = pyglet.window.key
class main(pyglet.window.Window):
def __init__ (self, width=800, height=600, fps=False, *args, **kwargs):
super(main, self).__init__(width, height, *args, **kwargs)
self.x, self.y = 0, 0
self.keys = {}
self.mouse_x = 0
self.mouse_y = 0
square = pyglet.image.SolidColorImagePattern((255, 0, 0, 255)).create_image(40, 40)
self.player_object = pyglet.sprite.Sprite(square, x=self.width/2, y=self.height/2)
self.alive = 1
def on_draw(self):
self.render()
def on_close(self):
self.alive = 0
def on_mouse_motion(self, x, y, dx, dy):
self.mouse_x = x
def on_key_release(self, symbol, modifiers):
try:
del self.keys[symbol]
except:
pass
def on_key_press(self, symbol, modifiers):
if symbol == key.ESCAPE: # [ESC]
self.alive = 0
self.keys[symbol] = True
def render(self):
self.clear()
## Movement logic,
# check if key.W is in self.keys (updated via key_press and key_release)
if key.W in self.keys:
self.player_object.y += 1
if key.S in self.keys:
self.player_object.y -= 1
if key.A in self.keys:
self.player_object.x -= 1
if key.D in self.keys:
self.player_object.x += 1
self.player_object.draw()
self.flip()
def run(self):
while self.alive == 1:
self.render()
# -----------> This is key <----------
# This is what replaces pyglet.app.run()
# but is required for the GUI to not freeze
#
event = self.dispatch_events()
if __name__ == '__main__':
x = main()
x.run()
Я отошел от @window.event
, потому что мне проще скопировать и вставить этот пример класса / наследования, поскольку он у меня лежал. Но вы можете применить эту логику так, как вы хотите. Просто убедитесь, что вы не определили твердое состояние нажатия или не нажатия, проверьте отдельные клавиши и обновите соответственно перед рендерингом.