簡體   English   中英

Pyglet從for循環移動精靈位置,而不是使用pyglet時鍾

[英]Pyglet move sprite position from a for loop instead of using pyglet clock

我編寫了第一個pyglet應用程序,以可視化另一個腳本進行的計算。 不幸的是,我被困住了,不知道下一步該怎么做。

我正在嘗試使用for循環將子畫面從其位置移動到另一個位置,因此在每個循環的末尾,它會相對於舊位置將子畫面位置更改為由循環計算的特定距離。

這是我正在編寫的代碼的簡化版本(我希望這將對遇到類似問題的人有所幫助,然后復制我自己的特定項目)。

@window.event
def on_draw():
    window.clear()
    batch.draw()

def update(yd):
    Ball.y += yd

distance = [2,1,3,-2,-3,2,4,-5,1,2,3,-4,3,5,2,-2,3,2,3,-2,]

### test update in loop ###

for i in distance:
    time.sleep(0.1)
    update(i)


### Run app ##

pyglet.app.run()

我不想使用pyglet.clock.schedule_interval(update())因為循環可能需要更長的時間才能計算出clock.schudule ,但移動不會很順暢,但這很好。

我的問題是直到循環結束,什么都沒有發生,只有在python運行完循環之后,它才調用pyglet.app.run() ,但是如果我在循環之前調用pyglet.app.run() ,它將只運行關閉pyglet窗口后循環播放。

使用pyglet ,您無法控制程序的主循環。

主循環由pyglet.app.run()開始,您可以使用window.event裝飾器掛接事件。

您可以在主循環開始之前運行循環。 這就是為什么似乎什么也沒發生的原因。

如果要每隔0.1秒調用一次update ,則應使用clock.schedule_interval ,該函數需要調用一個函數和一個interval參數。 如果要為distance每個值移動一次sprite,可以使用迭代器和嵌套函數,例如:

def update():
   g = iter(distance)
   def inner(): 
       try:
           update(next(g))    
       except StopIteration:
           pass
   return inner

pyglet.clock.schedule_interval(update(), .1)

根據您的評論進行編輯:

給定您的循環:

for i in distance:
    time.sleep(0.1)
    update(i)

您可以將其轉換為迭代器:

def calculate():
    for i in distance:
        time.sleep(0.1) # just some expensive calculation
        yield i

並在on_draw()使用它:

calc = calculate()

@window.event
def on_draw():
    window.clear()
    batch.draw()
    try: update(next(calc)) 
    except StopIteration: pass

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM