2011-12-05 58 views
3

After yesterdays糟糕的選擇問題我再次嘗試。結合pygame和扭曲

我有一個tic tac toe program純粹是爲了學習網絡遊戲的目的。

我對扭曲的理解是,我應該有一個服務器類運行反應堆,然後讓每個玩家作爲客戶端連接到它(服務器是一個單獨的實體)。鑑於我最後一個問題中的意見,我懷疑我是以完全錯誤的方式解決這個問題的。

我應該怎麼做,我應該關注哪些教程或文檔?

回答

12

pygame與扭曲相結合的困難是誰控制主循環的問題。這通常會想要將任何類型的UI(GTK,Tkinter等)mainloop與Twisted結合起來,而PyGame也不例外。

我會建議的是,由於網絡延遲很重要,而且由於扭曲有一個非常好的調度框架,是你讓扭曲的反應堆運行並控制主循環,然後使用LoopingCall讓您處理來自pygame的事件。

在非常基礎的:

from twisted.internet.task import LoopingCall 

DESIRED_FPS = 30.0 # 30 frames per second 

def game_tick(): 
    events = pygame.events.get() 
    for event in events: 
     # Process input events 
    redraw() 

# Set up a looping call every 1/30th of a second to run your game tick 
tick = LoopingCall(game_tick) 
tick.start(1.0/DESIRED_FPS) 

# Set up anything else twisted here, like listening sockets 

reactor.run() # Omit this if this is a tap/tac file 

雖然這看起來很簡單,首先,它帶有危險。如果您花費大量時間在遊戲中進行處理,那麼您會冒着捱餓扭曲反應堆的風險,從而無法處理事件。如果您需要定時事件,請勿阻止,而應使用扭曲的工具,如reactor.callLater。您越能避免阻止,您的應用程序的響應就越多。這在幾個段落中描述的事情太多了,因爲針對twisted的編程是一種心態,如果你從未對異步或非阻塞庫進行編程,它們確實需要一些習慣。

有關更完整的示例,請查看「gam3」以獲取與扭曲接口的遊戲庫(包括用於模擬事件的世界時鐘)以及由扭曲的開發者之一製作的示例遊戲,以展示如何將扭曲和pygame的。

+0

這真的很有用,只要我下班回家,我會給它一個旋轉。 – Teifion

+0

+1 +1。絕對不希望pygame在一個線程中運行,正如我最近發現的那樣... – Claudiu