![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: 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. |
|
|||||
|
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); ... } Вид вашего метода после "рефакторинга": public function SetTween(page:BasePage, effect:IEffect, fadeScreen:Boolean):void { var object:MovieClip = page.visualOb; effect.doIt(object);// Если одного object мало - расширяем интерфейс // да, половина классов эффектов не будет использовать эти дополнительные // параметры - ну и пусть не использует - кому от этого хуже? // } Последний раз редактировалось expl; 06.02.2011 в 00:12. |
|
|||||
|
Я бы не изобретал велосипед а использовал какой-то TwinLite или TwinMax
Там эти все эффекты уже и так параметризованы, всё что нужно, это сделать отдельный класс-перечисление и всё. ТвинЛайт (и Макс и Нано тоже) принимают в качестве первого параметра дисплейный объект а в качестве второго - Object в котором указываются настройки самого твина. Вот в перечислении вбиваем кучу таких вот Object'ов и не паримся.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
|
Конечно же лучше, если собственные классы создавать не надо,
только вот не допонял, как TweenLite параметризировать: // В перечислении: public static const MY_TWEEN:TweenLite = new TweenLite(target/*<--null пихать?*/, duration, vars:Object); // В коде: tween.play();//<-- как сюда передать объект, над которым совершается анимация? (подозреваю там еще какие-то параметры потребуются, кроме твиновых, но всё же): |
|
|||||
|
Нет.
Я имел в виду в перечислении хранить только vars:Object. Ну если вам надо то еще и duration:Number. А target уже в вашем манагере менять. Не надо создавать пачку твинеров. Тем более что так и не получится, как только вы сделаете: Анимация сразу же запустится. У твинеров этих нету понятия старт и стоп. UPD: Полуркал на эту тему, извиняюсь за дезинформацию, всё-таки можно, но с бубном. К тому же в вашем случае как я и писал, проще в перечислении просто обжекты хранить с параметрами. Добавлено через 25 минут Перечисление: 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() { } } } 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); } } } 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. Причина: ошибки в коде |
|
|||||
|
Статик в манагере и не предполагался. Поправил код.
Автора топика где-то нету. Я не знаю что там его манагер должен уметь, но думаю большинство ситуаций решится просто классом-списком настроенных твинов, а в коде в роли манагера пусть выступает сам ТвинЛайт или что он будет юзать.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
|
Регистрация: 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. |
|
|||||
|
События не знаю, не пользовал, но код открытый, разобраться можно. Проблем с зависанием не было. Если сайт делать, то как по мне то самое оно, ну а в играх я бы и сам не рекомендовал всякие твинеры использовать (а автор из вашей сноски про игру кажись и говорит).
Сторонние твинеры они как правило более ресурсоемки, и если предполагается большая загрузка, то лучше уж ручками. Добавлено через 5 минут Из ваших же ссылок Обсуждения читали? ))Цитата:
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
|
Регистрация: Aug 2009
Сообщений: 134
|
Из ваших же ссылок Обсуждения читали?))
Да, читал, но Вадим имеет большой опыт в прогр. игр, это и настораживает. Спасибо, за полезные ответы. |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:31. |
|
|
« Предыдущая тема | Следующая тема » |
|
|