2012-02-19 101 views
0

背景: 我最近在AS3中完成了一個tic-tac-toe遊戲,使用了我多年前在C語言中編寫的一些簡單的基於函數的代碼。 現在我正在努力做到使用面向對象技術和最佳實踐的「正確方式」。 現在,所有東西都被分成整齊的小包裝,它看起來很漂亮,而我旅程的最後一部分就是讓所有的小狗們相互溝通。Actionscript OOP中的Getter/setter類和範圍

我的困境: 我想將保存遊戲狀態的代碼從我的主代碼移到com.okaygraphics.model.GameState中它自己的類中。 問題幾乎所有其他包都獲取並設置這些遊戲狀態屬性。 我想弄清楚封裝這個東西的最簡單方法,同時還允許我的其他類訪問它。

我在哪裏:

package com.okaygraphics.model{ 

    public class GameState { 

     private var _player1State:uint=0x00000000; 
     private var _player2State:uint=0x00000000; 
     private var _activePlayer:int=0; 


     public function get p1GameState():uint { 
      return _player1State; 
     } 
     public function set p1GameState(value:uint):void { 
      _player1State = value; 
     } 

     public function get p2GameState():uint { 
      return _player2State; 
     } 
     public function set p2gameState(value:uint):void { 
      _player2State = value; 
     } 

     public function get activePlayer():int { 
      return _activePlayer 
     } 
     public function set activePlayer(value:int):void { 
      _activePlayer = value; 
     } 
    } 
} 

Qestions:

1)我需要一個構造函數?我的意思是,我的程序永遠不會有一個以上的GameState。如果我應該把我的getters/setter作爲實例方法,我該如何讓其他類從它們各自的包中引用SAME實例?

2)我是否需要getter和setter?也許這個班可能只有3個公共財產?如果是的話,我如何達到我的其他課程的適當範圍?

3)我應該使用static關鍵字將所有內容分配給類本身嗎?如果是這樣,我將如何實現和使用這些靜態方法?

4)這是錯誤嗎?我完全只是將自己編入一個角落?

這似乎是一個很常見的任務,但我仍然不完全明白。一個簡短的解釋,一些鏈接,或我需要的技術名稱將不勝感激。

由於提前, - 最大

回答

4

你可以通過幾種不同的方法。

您可以製作GameState a Singleton。這將確保GameState的任何實例都是相同的實例。以下是如何做到這一點:

private static var _gameState:GameState; 
private static var _allowInstantiation:Boolean; 

public function GameState() 
{ 
    if (!_allowInstantiation) 
    { 
     throw new Error("GameState is a Singleton. Use GameState.getInstance() instead of new GameState()."); 
    } 
    else 
    { 
     _allowInstantiation = false; 
    } 
} 

public static function getInstance():GameState 
{ 
    if (!_gameState) 
    { 
     _allowInstantiation = true; 
     _gameState = new GameState(); 
    } 

    return _gameState; 
} 

然後,任何時候你想要得到GameState,使用此語法:

var _gameState:GameState = GameState.getInstance(); 

通過使用一個Singleton,你仍然可以使用getter和setter你已經已經完成,但Singleton將確保訪問GameState的每個類都將訪問同一個實例。

或者,如果你不想使用單例,你可以讓那些私人瓦爾公共靜態瓦爾代替:

public static var player1State:uint=0x00000000; 
public static var player2State:uint=0x00000000; 
public static var activePlayer:int=0; 

您將不再需要getter/setter方法,而且你從其他類設置他們是這樣的:

GameState.player1State = 0xFF0000; 
GameState.player2State = 0xFF0000; 
GameState.activePlayer = 1; 

無論哪種方式,你建立模型,記得把想法變成如何將與由控制器和視圖來傳遞。請記住,Model和View的分離是MVC模式的主要目標之一。

+0

那個單身的例子很漂亮。正是我所尋找的;謝謝。 – okayGraphics 2012-02-19 22:02:14

2

1)你可以做的是創造類。這是一個只被暗示過的類。一個快速谷歌周圍(是AS3單身人士的搜索stackoverflow),你應該找到一個單身人士課程的好例子。使用單例,你只需要包含GameState類,你將訪問唯一的一個。

2)只能做得更好,而不是在後面有吸氣劑和吸入器的傷害。

3)無法真正回答。

4)沒有。似乎要走的路。

+0

+1回答全部4.謝謝 – okayGraphics 2012-02-19 21:13:25

1

我強烈建議你看看MVC的設計模式,並在遊戲中使用它。 (本場比賽的狀態是模式的一部分。)

現在,至於如何從所有其他類訪問遊戲狀態(這是正確的詞不是包),你可以使用singleton pattern