ООП Практика / Структура для игры AS3 - PullRequest
2 голосов
/ 21 мая 2011

Я немного новичок в разработке игр для as3, но я хочу создать несколько гибкую базу для игры Connect Four.Я хотел бы иметь возможность скинуть игровую доску и игровые фигуры.Вот что я думаю до сих пор.Если у кого-то есть предложения, я действительно ценю это:

GameController расширяет EventDispatcher - содержит все методы манипулирования игровой сеткой.- Включает 2D-массив для отслеживания местоположений GamePiece. - Отправляет события после проверки при вызове методов.

GameClass расширяет Sprite: - Содержит визуальные элементы доски. - MouseEvent Listeners, прикрепленные к визуальным элементам, которые вызывают методы контроллера - (Custom) Слушатели ControllerEvent для обновления визуального вида, когда GameController отправляет

Расширение класса GamePiece Sprite: - Сохраняет местоположение столбца / строки фигуры - Содержит индекс currentPlayer - Загружает URL-адрес PNG как скин

Это грубый набросок.Любые красные флаги или другие предложения очень ценятся.

1 Ответ

3 голосов
/ 21 мая 2011

Похоже, что 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()));
        }
    }
}

Основная роль вашего контроллера теперь будет заключаться в том, чтобы прослушивать события, отправляемые моделью, а затем соответствующим образом обновлять представление (DisplayList). Аналогично, ваш View должен отправлять События на основе взаимодействия с пользователем (например: Player один указал, что он хочет поместить кусок во 2-й столбец); Контроллер может затем вызвать соответствующий метод в Модели.

Следующий фрагмент должен дать вам некоторое представление о том, каковы обязанности Контроллера; не забывайте, что вы можете (и должны!) разделять свои обязанности, используя несколько моделей, представлений и, при необходимости, контроллеров.

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...