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

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

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

Регистрация: Mar 2010
Сообщений: 25
По умолчанию Организация программы

Привет всем!
А теперь к делу. Мой вопрос касается не конкретной программы, а организации всех программ в общем.

Вопрос №1
У меня есть движок, главный класс которого должен иметь доступ ко всем объектам, которые связаны с движком. Единственное, что приходит на ум - это завести массив в главном классе, а вот дальше начинаются разногласия:
1) Можно делать так:
Код AS3:
var o = new MyObject();
engine.registerObject(o);
2) Можно так:
Код AS3:
var o = new MyObject(engine);
3) Так (объявив конструкторы объектов как private):
Код AS3:
var o = engine.createMyObject();
4) И наконец, класс движка можно сделать статическим, что обеспечит доступ к его массиву из движка.
Вариант №3, к сожалению, в AS3 не проходит, т. к. AS3, такой сякой, хочет public конструктор, но мне се равно интересно, следует ли его использовать в других языках программирования.
Как вам мои варианты? Или что посоветуете?


Вопрос №2(организация взаимодействия)
У меня в программе есть несколько классов, каждого из которых ровно по 1-му экземпляру. Некоторые из классов должны взаимодействовать между собой(причём на этапе начала разработки программы я ещё точно не знаю какие). Возникают такие идеи:
1)
Код AS3:
class SomeClass
{
     public static var someClass:SomeClass;
 
     public function SomeClass()
     { someClass = this; ... }
}
2) Сделать класс статичным
Что лучше выбрать?


Вопрос №3(Вывод графики)
В большинстве языков программирования, мы обычно запускаем цикл, в котором смотрим состояние программы(игра, пауза, главное меню, и т.п.) и в зависимости от состояния рисуем то, что надо.
В AS появляется возможность разные состояния программы нарисовать в разных Спрайтах, а при очередной смене состояния, менять видимость разных спрайтов(visible = true/false
Это хорошо или плохо?
Хорошо ли часть графики рисовать в среде Flash'а?

Старый 10.03.2011, 22:23
tofflife вне форума Посмотреть профиль Отправить личное сообщение для tofflife Найти все сообщения от tofflife
  № 2  
Ответить с цитированием
tofflife

Регистрация: Jul 2009
Сообщений: 95
Я обычно использую приблизительно такой механизм(дерево):

Код AS3:
public class Component extends EventDispatcher implements IComponent
{
  public function Component(owner:IComponent):void
  {
     registerClassAlias(Component, this);
     if (owner != null)
     {
       Component(owner).registerComponent(this);
     }
  }
  public function setOwner(owner:IComponent):void
  {
     m_owner = owner;
  }
  private function registerComponent(component:IComponent):void
  {
    components.push(component);
    component.setOwner(this);
  }
  private var m_components : Array = [];
  private var m_owner : IComponent = null;
}
 
public interface IComponent extends IEventDispatcher
{
  function setOwner(owner:IComponent):void;
}
Добавлено через 3 минуты
ну а потом можно использовать:

Код AS3:
var root:IComponent = new Component(null);
new Component(root);
new Component(root);
new Component(root);
а в конструктор компонента можно добавить ещё параметр id, в таком случае IComponent можно снабдить большинством удобных функций:

Код AS3:
public interface IComponent extends IBasicComponent
	{
		/**
		 * Добавляет новый компонент в конец очереди компонентов.
		 * @param component вставляетмый компонент
		**/
		function addComponent(component:IComponent):void;
		/**
		 * Добавляет список компонентов в конец очереди компонентов.
		 * @param components список добавляемых компонентов
		**/
		function addComponents(components:Array):void;
		/**
		 * очищает себя от всех элементов.
		 * @param clearSubComponents если true, то очищает все подкомпоненты
		 * @param finalizeComponents если true, компоненты финализируются
		*/
		function clear(clearAll:Boolean = false, 
				 	   finalizeComponents : Boolean = false):void;
		/**
		 * Ищет компонент по его идентификатору
		 * @param id идентификатор компонента, который нужно найти
		 * @return ссылка на компонент с указанным идентификатором
		 */
		function getComponentById(id:String):IComponent;
		/**
		 * возвращает массив компонентов, являющихся наследниками clazz.
		 * @param clazz класс, наследниками которого должны являться искомые компоненты
		 * @param index номер искомого компонента
		 * @result ссылки на компоненты-наследники clazz
		 *         null если компоненты не были найдены
		**/
		function getComponentsByPrototype(clazz:Class):Array;
		/**
		 * Вставляет новый компонент в очередь компонентов в указанном месте.
		 * @param index позиция, в которую вставляется компонент
		 * @param component компонент, который требуется вставить в очередь
		**/
		function insertComponent(index:Number, component:IComponent):void;
		/**
		 * Вставляет очередь компонент в хозяина.
		 * @param index позиция, в которую вставляются компоненты
		 * @param components массив компонентов, который требуется вставить в очередь
		**/
		function insertComponents(index:Number, components:Array):void;
		/**
		 * Удаляет компонент из списка компонентов.
		 * @param component компонент, который требуется удалить
		 * @param finalizeComponent true, еасли надо финализировать компонент
		**/
		function removeComponent(component:IComponent,
								 finalizeComponent : Boolean = false):void;
		/**
		 * Удаляет указанное количество компонентов.
		 * @param startIndex индекс компонента, с которого начнеться удаление
		 * @param count количество удаляемых компонентов
		 * @param clearSubComponents
		 *        true, если нужно очистить все подкомпоненты внутри удаляемых
		 *@param finalizeComponents если true, компоненты финализируются
		 */
		function removeComponents(startIndex : Number = 0,
		                          count:Number = VisualObjectClassNameResource.MAX_COMPONENT_COUNT,
		                          removeSubComponents:Boolean = false,
		                          finalizeComponents : Boolean = false):void

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Вопрос №1
Если все объекты могут использоваться только внутри движка (то есть сами по себе не имеют какого-либо смысла, будучи оторванными от него), то можно регистрировать их прямо внутри их же собственного конструктора.
Если объекты предполагают разные варианты их использования (то есть вне движка), то я бы выбрал первый вариант.

Насчет приватных конструкторов - можно объявить класс как internal и использовать фабрику, которая бы создавала нужный объект и возвращала его по интерфейсу.

Вопрос №2
Класс, у которого всегда только один экземпляр - это синглтон, если этот класс должен от кого-то наследоваться или реализовывать какой-то интерфейс, или статический класс во всех остальных случаях.

Вопрос №3
visible - не круто. Лучше использовать add/removeChild

Цитата:
Хорошо ли часть графики рисовать в среде Flash'а?
Это нормально
__________________
...вселенская грусть

Старый 10.03.2011, 22:37
tofflife вне форума Посмотреть профиль Отправить личное сообщение для tofflife Найти все сообщения от tofflife
  № 4  
Ответить с цитированием
tofflife

Регистрация: Jul 2009
Сообщений: 95
а по поводу смены состояний... - зависит от задачи, по моему мнению. Система обработчиков событий немного облегчает логику приложения, но может внести свои трудности в работе с памятью, синхронизации обработчиков...

Старый 10.03.2011, 23:21
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 5  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
По вопросу №1:
1 - 2 - все зависит от ситуации
3 - тоже зависит от ситуации и незнаю, почему вам нужен именно приватный конструктор. Практика показала что нужно очень постараться чтобы по-ошибке вызвать не фабричный метод, а конструктор напрямую.
4 - огребете проблем


По вопросу №2
В идеале не 1 и не 2

Желательно постараться выделить иерархию зависимости классов (щас НЕ про наследование).
Т.е. постараться сделать так чтобы классы не были завязаны друг надруга, т.е. чтобы не было Класс1 общается с Классом2, класc 3 общается с классом 1, клас 2 общается с классом 3.

Как желательно делать:
- Есть главный класс 1, он рулит классами 2 и 3
Классы 2 и 3 ничего не знают о 1, зато 1 знает о 2 и 3.
- При старте в класс 1 передаются ссылки на классы 2 и 3.
Всё, никакой статики, никаких синглтонов

Синглтоны и статика используются. когда сложно протянуть общий функционал во все части приложения
Очевидный недостаток такого подхода - у Вас не получиться использовать ни один, юзающий синглтон, класс одтельно. Плюс запутывание логики


Последний раз редактировалось expl; 10.03.2011 в 23:33.
Старый 15.03.2011, 21:53
nns2009 вне форума Посмотреть профиль Отправить личное сообщение для nns2009 Найти все сообщения от nns2009
  № 6  
Ответить с цитированием
nns2009

Регистрация: Mar 2010
Сообщений: 25
Всем спасибо за советы. Буду рассматривать.

Вопрос №4
Хорошо ли обрабатывать анимацию в enterFrame, а не в timer. В данном случае я имею ввиду достаточно простенькую анимацию, хотя вдруг есть минусы.

Старый 15.03.2011, 22:30
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 7  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Хорошо ли обрабатывать анимацию в enterFrame, а не в timer. В данном случае я имею ввиду достаточно простенькую анимацию, хотя вдруг есть минусы.
Я знаю 3 подхода при проигрывании анимации:

1. Выставить фиксированный fps с запасом (пониже 60, обычно 30) и завязать всю анимацию на enterFrame.
Минусы: при просадке фпс движение персонажей будет замедляться, а когда есть большой запас производительности - анимация НЕ станет более плавной.

2. Выставить fps на максимум (после fp 10.1 - это 60),
а кадры переключать по таймеру с шагом, меньшим fps
Минусы: хоть завязки с fps нет - анимация может получиться более "рваной", при очень большой просадке fps анимация также будет замедляться.

3. Забыть про таймер, обновлятся по fps, но замерять время между кадрами и прокручивать анимацию пропорционально прошедшему времени
В этом случае анимация не будет замедлятся - максимум что будет - это слайд-шоу. А при запасе производительности анимация будет более плавной.
Недостатки: слегка более геморная реализация анимации.


Последний раз редактировалось expl; 15.03.2011 в 22:34.
Создать новую тему Ответ Часовой пояс GMT +4, время: 14:57.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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