2011-05-21 51 views
2

我对as3游戏开发有点新鲜,但我想为Connect Four游戏创建一个有点灵活的基础。我希望能够对游戏板和游戏作品进行剥皮。这是我到目前为止的想法。如果有人有建议我会很感激:面向AS3游戏的OOP练习/结构

GameController扩展EventDispatcher - 包含所有游戏网格操纵方法。 - 包括2D阵列以保持游戏币位置 的轨道 - 验证之后调度事件时的方法被调用

GameClass扩展Sprite: - 承装板 的视觉元素 - 的MouseEvent监听器附接至视觉元素,其调用的控制器方法 - (自定义)ControllerEvent监听器来更新视觉效果时GameController调度

游戏币类扩展雪碧: - 保存一块的行/列位置 - 保存currentPlayer指数 - 加载PNG URL皮肤

这是粗略的轮廓。任何红旗或其他建议非常感谢。

回答

3

这听起来像GridController将遭受混合责任;在MVC体系结构中,控制器的职责是将数据从模型来回拖动到视图。我个人认为有将举行底层多维数组,它表示将片网格和方法,例如GridModel:

public class GridModel extends EventDispatcher { 
    private var _grid : Array; 

    public function GridModel(rows : uint, cols : uint) : void { 
     // Create the data structure which represents the Grid. 
     _grid = initialiseGrid(rows, cols); 
    } 

    public function addPiece(player : uint, col : uint) : void { 
     if (isValidMove(col)) { 
      // Update the datastructure, determine which row the piece ended 
      // up residing in. 
      const row : uint = // method omitted 

      // Notify the rest of the system that a move has been made. 
      dispatchEvent(new GridUpdateEvent(GridUpdateEvent.MOVE, player, col, row, _grid.concat()); 
     } 
     else { 
      // Illegal Move, datastructure stays the same, notify the rest 
      // of the system. 
      dispatchEvent(new IllegalMoveEvent(IllegalMoveEvent.COLUMN_FULL, player, col, _grid.concat())); 
     } 
    } 
} 

您的控制器的主要作用现在将听取由调度的事件模型,然后相应地更新View(DisplayList)。就像明智的一样,你的视图应该根据用户交互来派发事件(例如:玩家之一表示他们希望将一块物品放入第二列);控制器可以调用模型上的相关方法。

下面的代码段应该给你一些关于控制器的职责是什么的指示;不要忘记,您可以(也应该!)通过使用多个模型,视图和(如果需要的话)控制器来降低您的责任。

public class GameController { 
    private var _gridModel : GridModel; 
    private var _stateModel : GameStateModel; 
    private var _gridView : GridView; 

    public function GameController(gridModel : GridModel, gameStateModel : GameStateModel, gridView : GridView) { 
     _gridModel = gridModel; 
     _gameStateModel : gameStateModel; 
     _gridView = gridView; 

     addEventListeners(); 
    } 

    private function addEventListeners() : void { 
     _gridModel.addEventListener(GridUpdateEvent.MOVE, onGridUpdateMoveEvent); 
     _gridView.addEventListener(ColumnSelectionEvent.SELECTED, onColumnSelectedEvent); 
    } 

    private function onColumnSelectedEvent(event : ColumnSelectionEvent) : void { 
     // Query the GameStateModel to find out whos turn it currently is. 
     const activePlayer : uint = _gameStateModel.activePlayer; 

     // Ask the GridModel to update. 
     _gridModel.addPiece(activePlayer, event.column); 
    } 

    private function onGridUpdateMoveEvent(event : GridUpdateEvent) : void { 
     // Update the view. 
     _gridView.insertPiece(event.player, event.row, event.col); 

     // Update the GameState to indicate it's the next player turns. 
     _gameSate.completeTurn(); 
    } 
} 
+0

这太棒了,谢谢我完全按照逻辑。我想为GridModel和GameState创建单独的类,但是我陷入了懒惰的旧陷阱,并且问'它真的需要它自己的类吗?'即使在这个层面上,我当然也看到了解除这种关系的力量。 – ChickensDontClap 2011-05-21 12:23:55

+0

将GameStateModel与GridModel分开的一个原因是要改变玩家的数量; GridModel并不关心有多少人在玩游戏,这是GameStateModel的责任。通过使用多态性,您可以轻松地在TwoPlayerGameStateModel和ThreePlayerGameStateModel之间进行切换。 – JonnyReeves 2011-05-21 14:17:05