![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
У меня есть "создатель частиц", и мне их нужно в определенный момент (к примеру, когда полностью частица выполнит Tween _fly) удалять. Но, как вы видите, в коде невозможно с листенером передать тот же спрайт в новую функцию, чтобы он уже работал с ней. Есть идеи, как это выполнить? Полный код с возможностью теста вот:
import fl.transitions.*; import fl.transitions.easing.*; import flash.events.Event; import flash.display.MovieClip; import flash.display.Sprite; var c_radius:Number = new Number(); var _ypos:Number = new Number(); var ground:Number = new Number(); var howlong:Number = new Number(); var howlongdrop:Number = new Number(); ground = stage.stageHeight; addEventListener(Event.ENTER_FRAME, spawn); function spawn(n:Event) { howlongdrop = Math.ceil(Math.random() * 300) / 100; howlong = Math.ceil(Math.random() * stage.stageWidth); _ypos = Math.ceil(Math.random() * stage.stageHeight); c_radius = Math.ceil(Math.random() * 20); var sprite:Sprite = new Sprite(); sprite.graphics.beginFill(0x000000, 2); sprite.graphics.drawCircle(0,0,c_radius); sprite.graphics.endFill(); sprite.y = _ypos; sprite.alpha = Math.ceil(Math.random() * 100) / 100; addChild(sprite); behave(sprite, ground, howlong, howlongdrop); } function behave(i:Sprite, groundy:Number, howlongfly:Number, howlongdrop2:Number) { var _fly:Tween = new Tween(i,"x",Strong.easeOut,i.x,i.x + howlongfly,2,true); var drop:Tween = new Tween(i,"y",Bounce.easeOut,i.y,groundy,howlongdrop2,true); _fly.addEventListener(TweenEvent.MOTION_FINISH, dissapear); } function dissapear(n:Event) { //здесь мне надо уменьшать alpha спрайта i из функции behave а после удалять child. //Но как мне получить доступ к i? всунуть в параметры кроме n:Event сюда его никак нельзя! } |
|
|||||
|
Есть .currentObject у TweenEvent. Он возвращает Tween (то бишь _fly перелетает плавно в функцию dissapear)
У Tween-а есть .obj, но я к нему даже если присвою этот Tween чему-то не могу достучаться. Куча ошибок в выводе висит. |
|
|||||
|
Регистрация: May 2010
Сообщений: 543
|
я более чем уверен, что у TweenEvent есть свойства target и currentTarget.
__________________
Вы грабите бедных людей. Парень со свирелью накажет вас. Хонгильдон (с) |
|
|||||
|
.currentTarget у TweenEvent возвращает просто объект Tween. А мне нужно доступ к спрайту i, которым управляет Tween. Все намного сложнее)
Добавлено через 7 минут Ура! Я исправил и теперь все исчезает. Остался один момент. Я думал это связано с бесконечным спавном частиц. Оказывается... Почему у меня все зависает? К примеру Tween около 98 из 100 шаров просто застывает? Я думал это графический глюк а это программный. Вот исправленный код, можете сами протестить у себя. import fl.transitions.*; import fl.transitions.easing.*; import flash.events.Event; import flash.display.MovieClip; import flash.display.Sprite; var c_radius:Number = new Number(); var _ypos:Number = new Number(); var ground:Number = new Number(); var howlong:Number = new Number(); var howlongdrop:Number = new Number(); var maxnumber:Number = new Number(100); var totalnumber:Number = new Number(0); ground = stage.stageHeight; addEventListener(Event.ENTER_FRAME, spawn); function spawn(n:Event) { howlongdrop = Math.ceil(Math.random() * 300) / 100; howlong = Math.ceil(Math.random() * stage.stageWidth); _ypos = Math.ceil(Math.random() * stage.stageHeight); c_radius = Math.ceil(Math.random() * 20); if (totalnumber < maxnumber) { var sprite:Sprite = new Sprite(); sprite.graphics.beginFill(0x000000, 2); sprite.graphics.drawCircle(0,0,c_radius); sprite.graphics.endFill(); sprite.y = _ypos; sprite.alpha = Math.ceil(Math.random() * 100) / 100; addChild(sprite); totalnumber++; behave(sprite, ground, howlong, howlongdrop); } } function behave(i:Sprite, groundy:Number, howlongfly:Number, howlongdrop2:Number) { var _fly:Tween = new Tween(i,"x",Strong.easeOut,i.x,i.x + howlongfly,2,true); var drop:Tween = new Tween(i,"y",Bounce.easeOut,i.y,groundy,howlongdrop2,true); _fly.addEventListener(TweenEvent.MOTION_FINISH, dissapear); } function dissapear(n:TweenEvent) { var __z:Object; __z = n.currentTarget; totalnumber--; removeChild(__z.obj); } |
|
|||||
|
http://help.adobe.com/ru_RU/FlashPla...ons/Tween.html
Цитата:
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
|
Я могу ошибаться, но возможно у меня где-то конфликт с именами у Tween. Т.е. когда одна из частиц заканчивает движение внезапно все застывают. Не понимаю, где косяк.
Добавлено через 38 секунд Gbee да, вы правы Исправил. Проблема теперь в застывании всех частиц.Добавлено через 1 час 33 минуты Немного погуглив узнал о Garbage Collection, великолепной помойке, месте, куда флеш скидывает все мои твины, решив, что я насилую без перебоя то ли sprite переменную то ли _fly и drop. В общем по факту - нельзя все это как в AS2 через одну ссылку (ей является sprite, после i) столько переменных проносить. Метод "групповухи" теперь не работает. Решение я нашел, судя по всему - надо использовать массив, где будут храниться эти спрайты. Но у меня появился вопрос. Я могу ошибаться, но разве в массиве можно использовать спрайты? И еще, может я зря использую Tween для этой анимации и есть способ проще? А то я в интернете натыкаюсь постоянно на то, что Tween вшитий во флеш имеет свои баги и вообще лучше всего качать сборки Tween класса(Tweener и другие). |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 393
|
В массиве можно спрайты, можно в типизированном массиве vector спрайты, не вопрос.
|
|
|||||
|
Сделал массив спрайтов. Не помогло. Зависание повторяется.
Попробую Твины все в каждый массив засунуть. Будет массив Спрайта к примеру particles [1] и ему будут сопоставлены массивы Твинов _flymassive[1] и dropmassive[1]. Честно, я не знаю, что я делаю, но теоретически это сможет сэкономить как-то и оптимизировать все. Вы вообще сталкивались с зависанием в Tween классе? Гугл говорит что это частая проблема для него. Только решения от одного к другому мистические и больше похожи на "подпрыгни дерни за ухо и вроде пройдет". |
![]() |
![]() |
Часовой пояс GMT +4, время: 19:08. |
|
|
« Предыдущая тема | Следующая тема » |
|
|