Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 16.09.2016, 13:34
lesnoj вне форума Посмотреть профиль Отправить личное сообщение для lesnoj Найти все сообщения от lesnoj
  № 1  
Ответить с цитированием
lesnoj
 
Аватар для lesnoj

Регистрация: Mar 2014
Сообщений: 27
Question ООП и архитектура простой игры

Решил разобраться с ООП в 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 я пробую создаю функцию проверки текущего дисплея и переключение между ними, но очевидно, что то делаю не так.

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


Последний раз редактировалось lesnoj; 16.09.2016 в 13:44.
Старый 16.09.2016, 13:41
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 2  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,283
что это?
Цитата:
// Экземпляры
new DisplayManager();

Старый 16.09.2016, 13:44
lesnoj вне форума Посмотреть профиль Отправить личное сообщение для lesnoj Найти все сообщения от lesnoj
  № 3  
Ответить с цитированием
lesnoj
 
Аватар для lesnoj

Регистрация: Mar 2014
Сообщений: 27
Цитата:
Сообщение от undefined Посмотреть сообщение
что это?
Это попытки заставить работать код всеми возможными и невозможными путями.
Удалил.

Старый 16.09.2016, 13:50
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 4  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,283
теперь единственное что делает Main - инициализирует переменную STAGE.И еще инициализация сложных типов прямо после объявления - плохая практика.

Старый 16.09.2016, 14:04
lesnoj вне форума Посмотреть профиль Отправить личное сообщение для lesnoj Найти все сообщения от lesnoj
  № 5  
Ответить с цитированием
lesnoj
 
Аватар для lesnoj

Регистрация: Mar 2014
Сообщений: 27
Цитата:
Сообщение от undefined Посмотреть сообщение
теперь единственное что делает 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 не разобрался. Я использую пример найденный в сети.
Подскажите как это сделать правильно, для того чтобы к ней можно было обращаться из других классов для добавления объектов на сцену?


Последний раз редактировалось lesnoj; 16.09.2016 в 14:26.
Старый 16.09.2016, 14:20
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 6  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,283
Какая-то каша.
Что является документ классом Game или Main?

Старый 16.09.2016, 14:26
lesnoj вне форума Посмотреть профиль Отправить личное сообщение для lesnoj Найти все сообщения от lesnoj
  № 7  
Ответить с цитированием
lesnoj
 
Аватар для lesnoj

Регистрация: Mar 2014
Сообщений: 27
Цитата:
Сообщение от undefined Посмотреть сообщение
Какая-то каша.
Что является документ классом Game или Main?
Классом является Game. Исправил.

Старый 16.09.2016, 14:56
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 8  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,283
изучай
Вложения
Тип файла: zip game_test.zip (10.9 Кб, 188 просмотров)

Старый 16.09.2016, 14:59
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 9  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,283
забыл добавить выставление 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;
		}
 
	}
 
}
поправь у себя

Старый 16.09.2016, 15:29
lesnoj вне форума Посмотреть профиль Отправить личное сообщение для lesnoj Найти все сообщения от lesnoj
  № 10  
Ответить с цитированием
lesnoj
 
Аватар для lesnoj

Регистрация: Mar 2014
Сообщений: 27
Спасибо, буду изучать.

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


Последний раз редактировалось lesnoj; 16.09.2016 в 17:13.
Создать новую тему Ответ Часовой пояс GMT +4, время: 22:46.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
классы , ООП

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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