AS3游戏的OOP实践/结构

时间:2011-05-21 06:31:39

标签: actionscript-3 oop

我对as3游戏开发有点新意,但我想为Connect Four游戏创建一个有点灵活的基础。我希望能够为游戏板和游戏部件打造皮肤。这是我到目前为止所想的。如果有人有建议我真的很感激:

GameController扩展了EventDispatcher - 包含所有游戏网格操作方法。 - 包括2D阵列以跟踪GamePiece位置 - 调用方法后在验证后调度事件

GameClass扩展Sprite: - 保持电路板的视觉元素 - MouseEvent侦听器附加到可视元素,调用控制器方法 - (自定义)ControllerEvent侦听器在GameController调度时更新视觉外观

GamePiece类扩展Sprite: - 保持片段的列/行位置 - 保持currentPlayer索引 - 将PNG URL加载为皮肤

这是粗略的轮廓。任何危险信号或其他建议都非常感谢。

1 个答案:

答案 0 :(得分:3)

听起来GridController将承担混合责任;在MVC架构中,Controller的职责是将数据从Model转移到View。就个人而言,我会考虑使用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()));
        }
    }
}

Controller的主要作用是监听模型调度的事件,然后相应地更新View(DisplayList)。同样地,您的View应该根据用户交互来调度事件(例如:玩家1表示他们希望将一个部分放入第二列);然后,Controller可以调用模型上的相关方法。

以下代码段应该为您提供一些指示,说明控制器的责任是什么;不要忘记你可以(并且应该!)通过使用多个模型,视图和必要的控制器来解决你的责任。

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();
    }
}