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

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

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

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

Есть класс PageManager, который добавляет registerPage(page:IPage))
и управляет экземплярами класса Page, где каждая страница это окно в игре,
напр. окно глав меню, окно игры, окно карты уровней и пр.

Каждый экземпляр Page имеет ссылку на PageManager, где с помощью
функции showPage() может открыть др. окно с применением твиннера-перехода
(перемещение, масштабирование, вспышка и пр):
page.pageManager.showPage(GamePage, PageManager.MOVIE); - вторым параметром
указывается тип применяемого твиннера-перехода.

Важно, что каждый класс Page содержит экземпляр-член Tween
и при вызове ф-и page.pageManager.showPage()
– pageManager настраивает/запускает (в соответствии с переданным типом твина) этот
tween и отображает Page.

Код:
public class PageManager
{

public static const LEFT_MOVE:String = "leftMove";
public static const RIGHT_MOVE:String = "rightMove";
public static const TOP_MOVE:String = "topMove";
public static const BOTTOM_MOVE:String = "bottomMove";
public static const ALPHA:String = "alpha";


public function showPage(pageClass:Class, typeTween:String = "none"):void 
{
      var page:BasePage = GetPage(pageClass);
      if (page)
      {		
	    SetTween(page, typeTween, fadeScreen);
            page.EnablePage();
      }
}


public function SetTween(page:BasePage, typeTween:String, fadeScreen:Boolean):void
{
       var object:MovieClip = page.visualOb;
       var tween:Tweener = page.tween;
       var posScrCenter:Point = page.posScrCenter;
			
       if (typeTween == FLASH)
       this.transition.startFlash(object);
			
       if(typeTween == ALPHA)
       tween.StartAlpha(object, 0, 1, None.easeNone, 20);
			
       if (typeTween == RIGHT_MOVE)
       tween.StartMove(object, new Point( -50, posScrCenter.y), posScrCenter ,  Back.easeOut, 10);
        …
}

}
Как видно, с помощью указания константы переходы мы вызываем нужный
тип твина.
Подскажите, как лучше реализовать применение твинов-переходов для Pages,
которыми управляет PageManager?
Может стоить применить какой-то паттерн, ведь создание констант типов твинов
в классе PageManager и соотв. применение твинеров являются закрытой конструкцией,
т.е. чтобы добавить новый тип твина (новое поведение) требуется дополнять класс PageManager.


Последний раз редактировалось Denis_ex; 05.02.2011 в 23:09.
Старый 06.02.2011, 00:05
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
C принципом открытия/закрытия неважно?
Самое тупое решение (не знаю, насколько пагубным в Вашем случае будет побочный эффект от его применения, но все-таки):
(патторн "стратегия")
- Делаем интерфейс IEffect
- Делаем его таким, чтобы передаваемых через него данных хватало для реализации любого твина
- Создаем по классу на каждый вид двина, реализуя этот интерфейс
Для некоторых видов твинов окажется, что класс создавать не надо - надо параметризировать уже имеющиеся
- Лепим перечисление:
public class EffectEnum
{
public static const ALPHA:IEffect = new AlphaEffect();
public static const RIGHT_MOVE:IEffect = new MoveEffect(MoveEffect.RIGHT);
public static const LEFT_MOVE:IEffect = new MoveEffect(MoveEffect.LEFT);
...
}

Вид вашего метода после "рефакторинга":
Код AS3:
public function SetTween(page:BasePage, effect:IEffect, fadeScreen:Boolean):void
{
       var object:MovieClip = page.visualOb;
 
       effect.doIt(object);// Если одного object мало - расширяем интерфейс
                                 // да, половина классов эффектов не будет использовать эти дополнительные
                                 // параметры - ну и пусть не использует - кому от этого хуже?
                                 // 
}
P.S. var object:MovieClip - с чего бы это? Каждую формочку художники чтоли рисуют? Да даже если и так - не заметил, чтобы Вы использовали переключение по кадрам, может сразу написать DisplayObject, чтобы не заставлять пользователей класса использовать только MovieClip?


Последний раз редактировалось expl; 06.02.2011 в 00:12.
Старый 06.02.2011, 16:50
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 3  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Я бы не изобретал велосипед а использовал какой-то TwinLite или TwinMax

Там эти все эффекты уже и так параметризованы, всё что нужно, это сделать отдельный класс-перечисление и всё.

ТвинЛайт (и Макс и Нано тоже) принимают в качестве первого параметра дисплейный объект а в качестве второго - Object в котором указываются настройки самого твина. Вот в перечислении вбиваем кучу таких вот Object'ов и не паримся.
__________________
Кто к нам с чем для чего - тот у нас того от того.

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Конечно же лучше, если собственные классы создавать не надо,
только вот не допонял, как TweenLite параметризировать:
Код AS3:
// В перечислении:
public static const MY_TWEEN:TweenLite = new TweenLite(target/*<--null пихать?*/, duration, vars:Object);
// В коде:
tween.play();//<-- как сюда передать объект, над которым совершается анимация?
Вообще, можно создать НЕ n-ое количество, а один класс - обёртку на tween, и в энуме этот класс параметризировать
(подозреваю там еще какие-то параметры потребуются, кроме твиновых, но всё же):
Код AS3:
class LiteTweenWrapper
{
 
    public function LiteTweenWrapper(vars:Object, duration:Number)
    {
          _vars = vars;
          _duration = duration;
     }
 
     public function doIt(target:DisplayObject):void
     {
           TweenLite.to(target, _duration, _vars)
     }
}

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Нет.

Я имел в виду в перечислении хранить только vars:Object.
Ну если вам надо то еще и duration:Number.

А target уже в вашем манагере менять.

Не надо создавать пачку твинеров. Тем более что так и не получится, как только вы сделаете:
Код AS3:
MY_TWEEN:TweenLite = new TweenLite(target/*<--null пихать?*/, duration, vars:Object);
Анимация сразу же запустится. У твинеров этих нету понятия старт и стоп.

UPD:
Полуркал на эту тему, извиняюсь за дезинформацию, всё-таки можно, но с бубном. К тому же в вашем случае как я и писал, проще в перечислении просто обжекты хранить с параметрами.

Добавлено через 25 минут
Перечисление:
Код AS3:
package  
{
	/**
	 * ...
	 * @author Dukbopa3
	 */
	public static class TweenEnum 
	{
 
		public static const MY_TWEEN1:Object = { alpha:0, onComplete:function():void { someEffect(); }};
		public static const MY_TWEEN2:Object = { x: - 200, ease:Back.easeIn, onComplete:remove };
		public static const MY_TWEEN3:Object = { x: 200, ease:Back.easeOut, onComplete:remove };
		public static const MY_TWEEN4:Object = { alpha:0, onComplete:function():void { someEffect(); }};
 
		public function TweenEnum() 
		{
 
		}		
	}
}
Примитивный манагер(в таком виде он смысла не имеет, проще сразу твинлайт использовать. Это просто для демонстрации):
Код AS3:
package  
{
	import com.greensock.TweenLite;
 
         /**
	 * ...
	 * @author Dukbopa3
	 */
	public class TweenManager 
	{
		private var _target:Object;
 
		public function TweenManager() 
		{
 
		}
 
		public function set target(value:DisplayObject):void 
		{
			_target = value;
		}
 
		public function to(target:Object, vars:Object):void {
			this.target = target;
			TweenLite.to(target, 0.5, vars);
		}
	}
}
И примерно так использовать в коде:
Код AS3:
package  
{
	//import com.greensock.TweenLite;
	//import flash.display.DisplayObject;
	/**
	 * ...
	 * @author Dukbopa3
	 */
	public class Main extends Sprite
	{
 
		public function Main() 
		{
			var someTarget:MovieClip = new SomeMCFromLib();
 
                        var manager:TweenManager = new TweenManager();
 
                        manager.to(someTarget, TweenEnum.MY_TWEEN1);
		}
 
	}
}
__________________
Кто к нам с чем для чего - тот у нас того от того.


Последний раз редактировалось Dukobpa3; 06.02.2011 в 22:51. Причина: ошибки в коде
Старый 06.02.2011, 21:34
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 6  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Небольшой оффтоп:
Код AS3:
public static class TweenManager
плюс отсутствующие static у методов с толку сбивают, - в остальном то мысль понятна.

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Статик в манагере и не предполагался. Поправил код.

Автора топика где-то нету. Я не знаю что там его манагер должен уметь, но думаю большинство ситуаций решится просто классом-списком настроенных твинов, а в коде в роли манагера пусть выступает сам ТвинЛайт или что он будет юзать.
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 07.02.2011, 23:43
Denis_ex вне форума Посмотреть профиль Отправить личное сообщение для Denis_ex Найти все сообщения от Denis_ex
  № 8  
Ответить с цитированием
Denis_ex

Регистрация: Aug 2009
Сообщений: 134
Сорри, что отлучался на время, в том числе изучал и применял паттерн стратегия

expl

Я сейчас реализовал все на стратегии, спасибо, что направили в нужном направлении. Думаю, еще не раз стратегию буду использовать в различных ситуациях.

>>public static const RIGHT_MOVE:IEffect = new MoveEffect(MoveEffect.RIGHT);
Вот здесь тоже начинаются неприятные вещи, т.е. передаем в конструктор константу, которая реализована внутри MoveEffect, движений всяких много может быть, поэтому снова начинается if/switch внутри MoveEffect. Можно вместо константы передать параметры, типа начальной/конечной позиции, скорость и пр, но это создает громоздкость и главный минус, если много окон используют константу, то чтобы они все приняли единое поведение - мы используем константу, если же параметры передавать, то в каждом конструкторе экземпляра надо будет их менять, что чрезвычайно не удобно. Вариант с передачей Object' ов с параметрами убивает все if/switch, что хорошо.

Dukobpa3

Вот здесь он пишет:
http://blog.elite-games.net/blog5.php/2010/12/09/2010-6
http://blog.elite-games.net/blog5.ph...adim-2008-2010


“В области программирования - самое страшное было в использовании сторонней библиотеки твинов - Greensock. Самый жестокий баг - зависание игры и броузера, который был из-за стороней библиотеки - Greensock(типа анимацию с ними легче организовывать). Могу только посоветовать избегать их и писать свои методы для твинов.”

Программист он достаточно опытный, данный баг ввел в замешательство по использованию твин лайта/макса, хотя и знаю он достаточно популярный, поэтому пока сделал обвертку для твинов флеша.
А в вашей практике проблемы с твинами от Greensock были?

>>Вот в перечислении вбиваем кучу таких вот Object'ов и не паримся.
Да, это очень было бы удобно, события у данных твинов есть, т.е. напр. при завершении твина и пр?
Можно ли с помощью одного экземпляра твина, выплнить например одновлеменно передвижение и альфа появлене?
>>manager.to(someTarget, TweenEnum.MY_TWEEN1);
здесь у вас каждый раз создается новый отдельный твин, для объекта? Т.е. надо чтобы было отдельно, например, когда на экрне твинятся сразу пару окон.


Последний раз редактировалось Denis_ex; 08.02.2011 в 00:10.
Старый 07.02.2011, 23:49
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 9  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
События не знаю, не пользовал, но код открытый, разобраться можно. Проблем с зависанием не было. Если сайт делать, то как по мне то самое оно, ну а в играх я бы и сам не рекомендовал всякие твинеры использовать (а автор из вашей сноски про игру кажись и говорит).

Сторонние твинеры они как правило более ресурсоемки, и если предполагается большая загрузка, то лучше уж ручками.

Добавлено через 5 минут
Из ваших же ссылок Обсуждения читали?))

Цитата:
Comment from: alex_mc [Visitor]
Удивлен скепсисом в отношении Greensock. Я у него даже Corporate Membership лицензию купил за 150 долларов в год, чтобы спокойно использовать Greensock в коммерческих проектах.
2010-12-25 @ 20:17
Comment from: Badim [Member] Email · http://www.elite-games.net
При чем туту скепсис? у меня он вешает проект. Или в нем разбираться - или самому твины написать.
2010-12-25 @ 20:18
Comment from: Гость [Visitor]
Самому писать твины, это конечно героизм!
Но лучше тогда писать, что не гринсок вешает проект, а неправильное его применение. А то можно пойти дальше и сказать, что Action Script вешает проект)
__________________
Кто к нам с чем для чего - тот у нас того от того.

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

Регистрация: Aug 2009
Сообщений: 134
Из ваших же ссылок Обсуждения читали?))
Да, читал, но Вадим имеет большой опыт в прогр. игр, это и настораживает.
Спасибо, за полезные ответы.

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

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

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


 


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


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