Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Каким образом через event listener передать переменную в функцию? (http://www.flasher.ru/forum/showthread.php?t=182905)

MINASTIS 06.08.2012 17:47

Каким образом через event listener передать переменную в функцию?
 
У меня есть "создатель частиц", и мне их нужно в определенный момент (к примеру, когда полностью частица выполнит Tween _fly) удалять. Но, как вы видите, в коде невозможно с листенером передать тот же спрайт в новую функцию, чтобы он уже работал с ней. Есть идеи, как это выполнить? Полный код с возможностью теста вот:

Код AS3:

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 сюда его никак нельзя!
}


GBee 06.08.2012 17:54

А у Tween нет ссылки для кого он работает? А у TweenEvent?

MINASTIS 06.08.2012 17:56

Есть .currentObject у TweenEvent. Он возвращает Tween (то бишь _fly перелетает плавно в функцию dissapear)
У Tween-а есть .obj, но я к нему даже если присвою этот Tween чему-то не могу достучаться. Куча ошибок в выводе висит.

carrotoff 06.08.2012 18:08

я более чем уверен, что у TweenEvent есть свойства target и currentTarget.

MINASTIS 06.08.2012 18:13

.currentTarget у TweenEvent возвращает просто объект Tween. А мне нужно доступ к спрайту i, которым управляет Tween. Все намного сложнее)

Добавлено через 7 минут
Ура! Я исправил и теперь все исчезает. Остался один момент. Я думал это связано с бесконечным спавном частиц. Оказывается...
Почему у меня все зависает? К примеру Tween около 98 из 100 шаров просто застывает? Я думал это графический глюк а это программный.
Вот исправленный код, можете сами протестить у себя.

Код AS3:

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);
}


GBee 06.08.2012 18:22

http://help.adobe.com/ru_RU/FlashPla...ons/Tween.html
Цитата:

obj : Object = null
Целевой объект с анимацией движения.
Не оно?

Код AS3:

function dissapear(event:TweenEvent)
{
trace(event.currentTarget.obj);
}


MINASTIS 06.08.2012 18:23

Я могу ошибаться, но возможно у меня где-то конфликт с именами у Tween. Т.е. когда одна из частиц заканчивает движение внезапно все застывают. Не понимаю, где косяк.

Добавлено через 38 секунд
Gbee да, вы правы :) Исправил. Проблема теперь в застывании всех частиц.

Добавлено через 1 час 33 минуты
Немного погуглив узнал о Garbage Collection, великолепной помойке, месте, куда флеш скидывает все мои твины, решив, что я насилую без перебоя то ли sprite переменную то ли _fly и drop.

В общем по факту - нельзя все это как в AS2 через одну ссылку (ей является sprite, после i) столько переменных проносить. Метод "групповухи" теперь не работает.

Решение я нашел, судя по всему - надо использовать массив, где будут храниться эти спрайты. Но у меня появился вопрос. Я могу ошибаться, но разве в массиве можно использовать спрайты?

И еще, может я зря использую Tween для этой анимации и есть способ проще? А то я в интернете натыкаюсь постоянно на то, что Tween вшитий во флеш имеет свои баги и вообще лучше всего качать сборки Tween класса(Tweener и другие).

Krusty 06.08.2012 21:02

В массиве можно спрайты, можно в типизированном массиве vector спрайты, не вопрос.

MINASTIS 06.08.2012 21:09

Сделал массив спрайтов. Не помогло. Зависание повторяется.
Попробую Твины все в каждый массив засунуть. Будет массив Спрайта к примеру particles [1] и ему будут сопоставлены массивы Твинов _flymassive[1] и dropmassive[1].

Честно, я не знаю, что я делаю, но теоретически это сможет сэкономить как-то и оптимизировать все.
Вы вообще сталкивались с зависанием в Tween классе?
Гугл говорит что это частая проблема для него. Только решения от одного к другому мистические и больше похожи на "подпрыгни дерни за ухо и вроде пройдет".

КорДум 06.08.2012 21:23

Используйте проверенные твины (например TweenNano от greensock) и храните на них ссылки, чтобы GC не убивал объекты.

MINASTIS 06.08.2012 21:33

Подскажите, как хранить ссылки? Для каждого объекта своя ссылка, а не одна взаимозаменяемая?

КорДум 06.08.2012 21:45

Конечно своя. Используйте симметричные массивы, как вы писали до этого. Вектор для спрайтов и вектор для твинов.

MINASTIS 06.08.2012 22:24

Спасибо :) Установил TweenLite и пытаюсь разобраться, почему у меня вместо постоянного создания все зациклилось на последних 2-х частицах)

Добавлено через 19 минут
Мне кажется, или я снова где-то накосячил?
Теперь вместо зависаний я получил "не изменение .x частиц и странное изменение .y" :(

Я ошибаюсь, или TweenLite не поддерживает одновременное изменение параметров двумя ТвинЛайтами у одного объекта? Например у спрайта i?
Так ведь получается странно. Мне нужно изобразить "физический эффект" подпрыгивания мячиков, а получается ИЛИ полет направо (изменение x) ИЛИ подпрыгивания на месте (изменение y).
К тому же первая проблема снова открылась.
Благодаря продвинутому TweenLite зависаний вообще не должно быть, что позволяет убрать массивы.
НО, без массивов и публичной переменной снова невозможно вытащить этот спрайт для исчезновения.
Какой-там. Придется снова искать способ создания всего этого на стандартном Tween-е, потому как ТвинЛайт не позволяет воссоздать одновременно два ТвинЛайта.

Вот это он проигрывает по тому, что стоит позднее (убери я последний твинлайт он обыграет первый):
Код AS3:

function behave(i:Sprite, groundy:Number, howlongfly:Number, howlongdrop2:Number)
{
                var _fly:TweenLite = new TweenLite(i,2, {x:i.x+howlongfly, ease:Strong.easeOut, onComplete:dissapear })
 
        var _drop:TweenLite = new TweenLite(i,howlongdrop2, {y:(groundy-i.y),  ease:Bounce.easeOut});
 
 
 
}

Добавлено через 27 минут
С этим ТвинЛайтом больше проблем появилось чем решилось :(
Осталось пробовать остановить зависания в стандартном Твине от адоба


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

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