Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ООП и архитектура простой игры (http://www.flasher.ru/forum/showthread.php?t=213359)

lesnoj 16.09.2016 13:34

ООП и архитектура простой игры
 
Решил разобраться с ООП в as3.0 на примере создания игры.

Игра будет иметь несколько локаций, на каждой из которых нужно выполнить определенные действия для перехода к следующей.
На первом этапе игра не будет иметь инвентаря и решение головоломок должно осуществляться по простой схеме - определенной последовательности взаимодействия с интерактивными объектами.

Игру продумал, но испытываю трудность с правильным созданием архитектуры.
Вот список классов, которые я планирую создать:
  1. Game - основной класс. Запускает менеджер дисплеев
  2. DisplayManager - управление дисплеями. Описывает все локации и их объекты, а так же устанавливает слушатели на объекты и проверяет условия взаимодействия с объектами
  3. Objects - динамические элементы. Описание всех интерактивных объектов включая игрового персонажа

Приведу код в котором я частично пытаюсь отразить данную структуру.

Game.as

Код AS3:

package src {
 
        import flash.display.MovieClip;
        import flash.display.Stage;
        import flash.events.Event;
 
        import src.DisplayManager;
 
        public class Game extends MovieClip {
 
                // Переменные
 
                        public static var STAGE:Stage;
 
                // Конструктор
 
                        public function Game() {
 
                                if (stage) init();
                                else addEventListener(Event.ADDED_TO_STAGE, init);
 
                        }
 
                // Методы класса
 
                        private function init(e:Event = null):void {
                                STAGE = this.stage;
                        }
 
        }
 
}

Так же в Game.as я пытаюсь создать ссылку на сцену, которую можно было бы использовать в других классах для добавления объектов на сцену.

DisplayManager.as

Код AS3:

package src {
 
        import flash.display.MovieClip;
        import flash.display.Stage;
        import flash.display.DisplayObject;
        import flash.events.MouseEvent;
        import flash.events.Event;
 
        import src.Main;
 
        public class DisplayManager extends MovieClip {
 
                // Экземпляры
 
                        public var location1:Location1 = new Location1();
                        public var location2:Location2 = new Location2();
 
                // Переменные
 
                        public var currentDisplay = 0;
 
                // Конструктор
 
                        public function DisplayManager() {
 
                                // Координаты
 
                                        location1.x, location1.y = 0;
                                        location2.x, location2.y = 0;
 
                                // Слушатели
 
                                        location1.addEventListener(MouseEvent.CLICK, displaySwitcher);
                        }
 
                // Методы класса
 
                        public function displaySwitcher(event:MouseEvent):void {
 
                                switch (currentDisplay) {
                                        case 0:
                                                Main.STAGE.addChild(location1);
                                                break;
                                        case 1:
                                                Main.STAGE.addChild(location2);
                                                break;
                                }
                                currentDisplay++;
 
                        }
 
        }
 
}

В DisplayManager.as я пробую создаю функцию проверки текущего дисплея и переключение между ними, но очевидно, что то делаю не так.

В результате программа запускается без ошибок, но и без добавления объектов - локаций на сцену.
Крайне нуждаюсь в советах и подсказках.

undefined 16.09.2016 13:41

что это?
Цитата:

// Экземпляры
new DisplayManager();

lesnoj 16.09.2016 13:44

Цитата:

Сообщение от undefined (Сообщение 1196187)
что это?

Это попытки заставить работать код всеми возможными и невозможными путями.
Удалил.

undefined 16.09.2016 13:50

теперь единственное что делает Main - инициализирует переменную STAGE.И еще инициализация сложных типов прямо после объявления - плохая практика.

lesnoj 16.09.2016 14:04

Цитата:

Сообщение от undefined (Сообщение 1196189)
теперь единственное что делает Main - инициализирует переменную STAGE.И еще инициализация сложных типов прямо после объявления - плохая практика.

Предполагаю что из Main.as нужно вызвать функцию displaySwitcher().

Код AS3:

package src {
 
        import flash.display.MovieClip;
 
        import src.DisplayManager;
 
        public class Game extends MovieClip {
 
                public var displayManager:DisplayManager = new DisplayManager();
 
                // Конструктор
 
                        public function Game() {
 
                                displayManager.displaySwitcher();
 
                        }
 
        }
 
}

С переменной STAGE не разобрался. Я использую пример найденный в сети.
Подскажите как это сделать правильно, для того чтобы к ней можно было обращаться из других классов для добавления объектов на сцену?

undefined 16.09.2016 14:20

Какая-то каша.
Что является документ классом Game или Main?

lesnoj 16.09.2016 14:26

Цитата:

Сообщение от undefined (Сообщение 1196193)
Какая-то каша.
Что является документ классом Game или Main?

Классом является Game. Исправил.

undefined 16.09.2016 14:56

Вложений: 1
изучай

undefined 16.09.2016 14:59

забыл добавить выставление curScreen в showScreen
Код AS3:

package 
{
        import flash.display.DisplayObjectContainer;
        /**
        * ...
        * @author
        */

        public class DisplayManager
        {
                private static var root:DisplayObjectContainer;
                private static var screens:Array;
                private static var curScreen:int =-1;
                public static function init(_root:DisplayObjectContainer):void {
                        root = _root;
                        screens = [];
                }
                public static function addScreen(screen:DisplayObjectContainer):void {
                        screens.push(screen);
                }
                public static function showScreen(n:int):void {
                        if (curScreen !=-1 && screens && screens[curScreen].parent) {
                                screens[curScreen].parent.removeChild(screens[curScreen]);
                        }
                        if (screens[n]) {
                                root.addChild(screens[n]);
                                curScreen = n;
                        }
                }
                public static function get rootDO():DisplayObjectContainer {
                        return root;
                }
 
        }
 
}

поправь у себя

lesnoj 16.09.2016 15:29

Спасибо, буду изучать.

Подскажите в каком виде лучше хранить информацию о дисплеях, такую как: координаты экрана на сцене, координаты объектов и персонажей на экране, слушатели взаимодействия с объектами и т.п.?
Использовать для этого один общий класс или отдельные классы или xml или что то другое?


Часовой пояс GMT +4, время: 10:36.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.