2010-12-17 48 views
1

我覺得MVC錯過了一封信來描述遊戲中的情況。該模型對我來說似乎由兩個不同的部分:AS3 MVC遊戲:我應該將模型中的數據和遊戲規則分開嗎?

  1. 一組描述當前的遊戲狀態瓦爾的(這些都會有發出關於變更事件制定者,和getter這樣視圖可以訪問哪些改變)
  2. 決定一旦某一輸入(即拍攝()發生了什麼的遊戲規則)已經由所述控制器接收(這些將更新組VARS的認爲合適的)

視圖將專門從1開始閱讀,而控制器將僅與2進行通信。這就是爲什麼我要做出區分並且想要將它們分成class1和class2。

我的問題:

  • 我不確定我是否應該做這種區分,因爲我還沒有看到它的任何地方。
  • 如果我應該;我應該製作兩個單獨的類,還是應該用class2擴展class1?
  • 最後,我無法確保只有class2(而不是視圖)可以更改class1中的變量(但仍然能夠在值發生更改時發出事件)。有什麼建議麼?

回答

1

您描述的原因是傳統MVC模型通常由數據存儲和應用程序邏輯組成的原因。如果你試圖分割它們,那麼你會遇到你正在思考的情況。

如果您擔心訪問他們不應該訪問的東西,您可以隨時將事件中的數據推送給他們,而不是讓他們讀取響應事件的數據。閱讀觀察者模式。

您還可以從助手類(實例化Observable的狀態類,邏輯類等)構建模型,並在模型中將它們實例化爲單例。不過,這並不一定能解決您的訪問控制需求。

第三個問題會涉及到使用「朋友」,有些人認爲這是一個糟糕的面向對象構造。 AS3設計師選擇不將朋友類和方法作爲C++語言的一部分。

如果你沒有它,AS3設計模式手冊是處理常見問題的常用方法的一個很好的參考,如你所描述的那些。

我會建議尋找PureMVC。它不適用於所有情況,但它確實爲您所描述的問題提供了一些解決方案。在這種情況下,您的遊戲狀態可以在單個代理中存儲/訪問,並且邏輯可以/將在多個通知和命令之間分開。有些人認爲框架有限制,但我發現設計良好的框架可以讓我專注於應用程序細節,而不是如何實現核心行爲。

+0

謝謝。我將研究PureMVC。另外,我有興趣使用我的事件來推送數據,但我仍然必須讓我的視圖訪問模型才能聽到這些事件嗎?視圖是否可以只聽事件,並且不知道發送事件的類是什麼? – Glacius 2010-12-17 17:06:02

+0

閱讀Observer模式,它應該回答這兩個問題。 AS3DP書中有關於它的一章,以及AS3應用程序中的MVC。 – mpdonadio 2010-12-17 17:57:58

1

PureMVC有一個StateMachine工具。這是你需要處理遊戲狀態。基本上你定義了一個有限狀態機,它描述了你的遊戲可以處於的所有狀態,它們之間的有效轉換以及觸發這些轉換的動作。

動作作爲通知發送到狀態機,如果動作對當前狀態有效,它將首先發出退出警戒通知(您定義的通知)的通知(如果已定義)。這讓任何感興趣的演員有機會取消轉換(即因爲你被鎖在地板上而不能離開房間)。然後它發送進入警戒通知(您定義的另一個可選通知)。這是感興趣的演員取消轉換的另一個機會(即由於沒有密鑰而無法進入房間)。如果不取消,則發送狀態特定的更改通知,以便感興趣的演員可以執行特定於進入此新狀態的活動。

自從八十年代初期(6502集會)我就沒有編寫遊戲邏輯,所以我決定是時候再玩一次了。我剛剛完成了一個使用PureMVC和StateMachine實用程序的觸控式策略遊戲,我必須說,使用我每天在企業應用程序中使用的工具來完成遊戲很有趣。不是太重,MVC確實適用,並且StateMachine使它清楚地知道發生了什麼以及什麼時候發生了什麼。它是爲BB PlayBook而打造的,但是由於AIR,您可以將它檢出並安裝到桌面上並嘗試使用。

地牢喬:一個觸摸爲重點的策略遊戲。 http://dungeonjoe.com

- =懸崖>