Пиглет не звонит on_draw - PullRequest
1 голос
/ 28 февраля 2020

Я пытаюсь сделать простую игру, но у меня возникают проблемы

это мой код:

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()

проблема в on_draw событие вызывается только при вводе что-то на клавиатуре

Я использую python 3.6 и последний пакет pyglet

Я ничего не нашел в интернете, почему это происходит?

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Pyglet вызывает on_draw, только если происходит событие. Используйте pyglet.clock.schedule_interval, чтобы непрерывно вызывать функцию с помощью изобретения таймера. Это также вызывает срабатывание 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()
0 голосов
/ 28 февраля 2020

Это может быть проблема с функцией декоратора.

Вместо того, чтобы декорировать on_draw, замените функцию on_draw объекта окна на собственное объявление этой функции:

См. этот пример на 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

Заменяется на

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()

...