我对as3游戏开发有点新意,但我想为Connect Four游戏创建一个有点灵活的基础。我希望能够为游戏板和游戏部件打造皮肤。这是我到目前为止所想的。如果有人有建议我真的很感激:
GameController扩展了EventDispatcher - 包含所有游戏网格操作方法。 - 包括2D阵列以跟踪GamePiece位置 - 调用方法后在验证后调度事件
GameClass扩展Sprite: - 保持电路板的视觉元素 - MouseEvent侦听器附加到可视元素,调用控制器方法 - (自定义)ControllerEvent侦听器在GameController调度时更新视觉外观
GamePiece类扩展Sprite: - 保持片段的列/行位置 - 保持currentPlayer索引 - 将PNG URL加载为皮肤
这是粗略的轮廓。任何危险信号或其他建议都非常感谢。
答案 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();
}
}