2010-06-12 135 views
0

我正在將一箇舊的遊戲從C移植到Javascript。我遇到了顯示代碼的問題,我希望主要的遊戲代碼調用顯示方法,而不必擔心如何顯示這些狀態消息。我可以中斷JavaScript代碼,然後繼續按鍵嗎?

在原始代碼中,如果消息太長,程序會等待播放器用空格鍵切換消息,然後繼續。這在javascript中不起作用,因爲在我等待事件時,所有其他程序代碼都會繼續。我曾想過使用回調函數,以便在玩家擊中指定密鑰時可以執行更多代碼,但是我無法看到如何在整個代碼中散佈大量致電display.update(msg)的代碼。

我可以採用不同的方式構建事物,以便基於事件的異步模型起作用,還是有其他解決方案可以實現更傳統的事件循環?

我有道理嗎?

例子:

// this is what the original code does, but obviously doesn't work in Javascript 
display = { 
    update : function(msg) { 
      // if msg is too long 
      //  wait for user input 
      // ok, we've got input, continue 
    } 
}; 


// this is more javascript-y... 
display = { 
    update : function(msg, when_finished) { 
      // show part of the message 

      $(document).addEvent('keydown', function(e) { 
       // display the rest of the message 

       when_finished(); 
      }); 
    } 
}; 
// but makes for amazingly nasty game code 
do_something(param, function() { 
    // in case do_something calls display I have to 
    // provide a callback for everything afterwards 

    // this happens next, but what if do_the_next_thing needs to call display? 
    // I have to wait again 
    do_the_next_thing(param, function() { 
     // now I have to do this again, ad infinitum 
    } 
} 

回答

0

有你在等待用戶輸入的標誌。

var isWaiting = false; 

然後檢查標誌的do_something值(顯然它設置在必要時也:))。

if (isWaiting) return; 

你可能想實現這個更高的調用堆棧(什麼叫do_something()?),但是這是你所需要的方法。

+0

雖然如果我正確思考,但問題仍然是相同的。我需要在整個地方檢查那個標誌,如果我返回,我會失去我在程序執行過程中的位置。我仍然需要從調用顯示方法的地方繼續執行程序。 – 2010-06-12 16:28:25

+1

如果您在顯示消息後有工作要做,請延遲顯示消息,直到處理循環結束。在循環之前設置標誌並且在下次處理方法觸發時(您正在使用間隔,對嗎?)在其他任何事情之前檢查標誌。 – lincolnk 2010-06-12 18:43:30

1

簡短答案是「否」。

較長的回答是,對於「網絡工作者」(HTML5的一部分),您可能可以這樣做,因爲它允許您將遊戲邏輯放在單獨的線程中,並使用消息傳遞來從用戶輸入到遊戲線程中。但是,您還需要以其他方式使用消息傳遞,以便能夠實際顯示輸出,這可能不會很好地執行。

相關問題