所以在我们的游戏中使用了Tkinter之后,我们决定转移到Pyglet。但我遇到的问题之一是运动,在Tkinter,我能做一个流畅的移动系统,但在pyglet,我所能做的就是让角色以一种紧张的方式移动。
import pyglet
from pyglet.window import key, Window
from pyglet import clock
from threading import Timer
X = 5 #Speed of the player
w = 0 #Controls +y movement
a = 0 #Controls -x movement
s = 0 #Controls -y movement
d = 0 #Controls +x movement
window = Window(width = 500, height = 500) #Defines window
MainChar = pyglet.image.load("Mainchar.png") #Loads the Mainchar.png
Player = pyglet.sprite.Sprite(MainChar, x = 0, y = 0) #Makes MainChar into a sprite
@window.event
def on_key_press(symbol, modifiers): #Looks for a keypress
print("keypress")
if symbol == key.W:
global w
global a
global s
global d
w = True
elif symbol == key.A:
a = True
elif symbol == key.S:
s = True
elif symbol == key.D:
d = True
@window.event
def on_key_release(symbol, modifiers):
print("keyup")
if symbol == key.W:
w = False
elif symbol == key.A:
a = False
elif symbol == key.S:
s = False
elif symbol == key.D:
d = False
@window.event
def moveT():
print("cycle")
def moveD():
if w == True:
Player.y += 0.1
elif a == True:
Player.x -= 5
elif s == True:
Player.y -= 5
elif d == True:
Player.x += 5
moveT()
moveTimer = Timer(0.01, moveD)
moveTimer.start()
@window.event
def on_draw():
window.clear()
Player.draw()
moveT()
pyglet.app.run()为什么我有w,a,s和d作为bools,这是因为我可以用键移动字符,而不是按键。
任何帮助都是很棒的,谢谢!
发布于 2019-11-17 13:31:11
问题是您使用了pythons threading。这不会触发要重新绘制的pyglet窗口。
您必须使用pyglet.clock,并在每次时钟滴答时安排调用一个函数。这会导致pyglet窗口也被更新,并触发on_draw()事件。例如:
@window.event
def moveT(dt):
if w == True:
Player.y += 0.1
elif s == True:
Player.y -= 5
if a == True:
Player.x -= 5
elif d == True:
Player.x += 5
pyglet.clock.schedule_interval(moveT, 1 / 60)此外,w、a、s和d也必须在on_key_release中声明为global。
import pyglet
from pyglet.window import key, Window
from pyglet import clock
X = 5 #Speed of the player
w, a, s, d = False, False, False, False
window = Window(width = 500, height = 500) #Defines window
MainChar = pyglet.image.load("Mainchar.png")
Player = pyglet.sprite.Sprite(MainChar, x = 0, y = 0)
@window.event
def on_key_press(symbol, modifiers): #Looks for a keypress
global w, a, s, d
if symbol == key.W:
w = True
elif symbol == key.A:
a = True
elif symbol == key.S:
s = True
elif symbol == key.D:
d = True
@window.event
def on_key_release(symbol, modifiers):
global w, a, s, d
if symbol == key.W:
w = False
elif symbol == key.A:
a = False
elif symbol == key.S:
s = False
elif symbol == key.D:
d = False
@window.event
def moveT(dt):
if w == True:
Player.y += 0.1
elif s == True:
Player.y -= 5
if a == True:
Player.x -= 5
elif d == True:
Player.x += 5
@window.event
def on_draw():
window.clear()
Player.draw()
pyglet.clock.schedule_interval(moveT, 1 / 60)
pyglet.app.run()https://stackoverflow.com/questions/58900582
复制相似问题