简体   繁体   English

Pyglet 不调用 on_draw

[英]Pyglet not calling on_draw

I'm trying to make a simple game but I'm having issues我正在尝试制作一个简单的游戏,但我遇到了问题

this is my code:这是我的代码:

from myvector import myVector
from car import Car
import pyglet


width = 1000
height = 600
agent = None
agent = Car(int(width/2), int(height/2))
window = pyglet.window.Window()
window.set_size(width,height)


@window.event
def on_key_press(symbol, modifiers):
    if symbol == 119:  # w
        agent.applyForce(myVector(-1, 0))
    if symbol == 115:  # s
        agent.applyForce(myVector(1, 0))
    if symbol == 97:  # a
        agent.applyForce(myVector(0, -1))
    if symbol == 100:  # d
        agent.applyForce(myVector(0, 1))


@window.event
def on_draw():
    window.clear()
    agent.update()
    agent.sprite.draw()
    print(1)


if __name__ == "__main__":
    pyglet.app.run()

problem is on_draw event is only called when I input something on keyboard问题是on_draw事件仅在我在键盘上输入内容时调用

I'm using python 3.6 and latest pyglet package我正在使用 python 3.6 和最新的 pyglet 包

I found nothing on internet why is this happening?我在互联网上什么也没找到,为什么会发生这种情况?

Pyglet invokes on_draw only if an event occurs. Pyglet 仅在事件发生时调用on_draw Use pyglet.clock.schedule_interval to continuously invoke a function by a timer invent.使用pyglet.clock.schedule_interval通过计时器发明连续调用函数。 That causes that on_draw is triggered, too:on_draw导致on_draw被触发:

@window.event
def on_draw():
    window.clear()
    agent.update()
    agent.sprite.draw()
    print(1)

def update(dt):
    # update objects
    # [...]
    pass

if __name__ == "__main__":
    pyglet.clock.schedule_interval(update, 1/60) # schedule 60 times per second
    pyglet.app.run()

It could be an issue with the decorator function.这可能是装饰器功能的问题。

Instead of decorating the on_draw , replace the window object's on_draw function with your own declaration of that function:不要装饰on_draw ,而是用您自己的函数声明替换 window 对象的on_draw函数:

See this example on on_mouse_press , which is replced with its own declaration.请参阅on_mouse_press上的此示例,该示例已替换为自己的声明。

@window.event
def on_mouse_press(x, y, button, modifiers):
    global state, image
    if button == pyglet.window.mouse.LEFT:
        print('mouse press')
        if state:
            state = False
        else:
            state = True

Replaced to替换为

import pyglet


image = pyglet.resource.image('test.png')
image.anchor_x = image.width // 2
image.anchor_y = image.height // 2

state = True


def on_draw():
    print('on_draw() called')
    window.clear()
    if state:
        image.blit(window.width // 2, window.height // 2)


def on_mouse_press(x, y, button, modifiers):
    global state
    print('mouse pressed')
    if state:
        state = False
    else:
        state = True


window = pyglet.window.Window()
window.on_draw = on_draw
window.on_mouse_press = on_mouse_press

pyglet.app.run()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM