首页 文章

AS3游戏的OOP实践/结构

提问于
浏览
2

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

GameController扩展了EventDispatcher - 包含所有游戏网格操作方法 . - 包括2D数组以跟踪GamePiece位置 - 在调用方法时调试后调度事件

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

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

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

1 回答

  • 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可以调用Model上的相关方法 .

    以下代码段应该为您提供一些指示,说明控制器的责任是什么;不要忘记你可以(而且应该!)通过使用多个模型,视图和(如果需要的话)控制器来减轻你的责任 .

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

相关问题