首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >小矮人的平稳运动

小矮人的平稳运动
EN

Stack Overflow用户
提问于 2019-11-17 12:46:18
回答 1查看 713关注 0票数 1

所以在我们的游戏中使用了Tkinter之后,我们决定转移到Pyglet。但我遇到的问题之一是运动,在Tkinter,我能做一个流畅的移动系统,但在pyglet,我所能做的就是让角色以一种紧张的方式移动。

代码语言:javascript
复制
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,这是因为我可以用键移动字符,而不是按键。

任何帮助都是很棒的,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-17 13:31:11

问题是您使用了pythons threading。这不会触发要重新绘制的pyglet窗口。

您必须使用pyglet.clock,并在每次时钟滴答时安排调用一个函数。这会导致pyglet窗口也被更新,并触发on_draw()事件。例如:

代码语言:javascript
复制
@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)

此外,wasd也必须在on_key_release中声明为global

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58900582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档