PDA

Просмотр полной версии : Функция выполняется хотя не должна :)


Tranki
18.02.2010, 01:21
Допустим есть такая миниигра,шарики летят вверх,щелкаешь по ним,они исчезают,пропустил пять шариков проиграл. Проблема с пропущенными шариками - функция miss_click все равно иногда выполняется даже когда ни одного шарика не пропустил.

function new_kis_bubble() {
haha=new bubble();
haha.addEventListener(MouseEvent.CLICK,kiss_click);

yTween=new Tween(haha,'y',None.easeIn,kord1y,end_kordy,speed,false);
xTween=new Tween(haha,'x',None.easeIn,kord1x,end_kordx,speed,false);
mymc.addChild(haha);

yTween.addEventListener(TweenEvent.MOTION_FINISH,miss_click);
}
function kiss_click(e:Event) {
// Эта функция срабатывает при клике на шарик
yTween.removeEventListener(TweenEvent.MOTION_FINISH,miss_click);
mymc.removeChild(DisplayObject(e.target));
trace('click');
}
function miss_click(e:Event) {
// Эта должна срабатывать если шарик пропустили
trace('misclick');
}

mayakwd
18.02.2010, 02:53
о_О
1. не делайте вложенных функций
2. у вас странный алгоритм:
upTween один на всех?
upTween'у даете слушать motion_finish на miss_click
а удаляете слушателя motion_finish почему-то уже missed_heart
где вызывается kiss_click?

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

Tranki
18.02.2010, 03:22
прибрался. да алгоритм странный,может как то по другой схеме это можно реализовать?

Bgg
18.02.2010, 14:21
Может стандартный твинер глючит? Попробуй альтернативный твинер (http://www.greensock.com/).
Такую простую задачу можно и с enter_frame'ом решить.

Diestro
18.02.2010, 15:56
Вот здесь что происходит:
upTween.removeEventListener(TweenEvent.MOTION_FINISH,missed_heart);

?
Что такое upTween и missed_heart?

Tranki
18.02.2010, 17:10
Еще раз поправил вот эта строка должна стоять.
yTween.removeEventListener(TweenEvent.MOTION_FINISH,miss_click);
Я не понимаю,yTween в данном случае получаетяс один для всех? тоесть кликая по обьекту я убераю слушатель для всех обьектов правельно? как убрать для какого то конкретного обьекта?

Diestro
18.02.2010, 17:55
Нет там получается немного по другому. Как только вы пишете
yTween = new Tween
создается экземпляр класса Tween и ссылка на него присваивается переменной yTween.
В следующий раз когда происходит тоже самое - переменной yTween присваивается ссылка на только что созданный экземпляр Tween, а ссылка на то что лежало в этой переменной уходит в небытиё. Естественно строка
yTween.removeEventListener(TweenEvent.MOTION_FINISH,miss_click);
будет удалять слушатель не оттуда откуда хотелось бы.

Tranki
18.02.2010, 18:45
понятно,и как мне привязать твин к обьекту?

dixus
18.02.2010, 18:58
понятно,и как мне привязать твин к обьекту?

Например сделать твин свойством класса bubble.

Tranki
19.02.2010, 17:24
что мне указазывать твину в качестве первого аргумента?
public class bubble extends MovieClip{
public function bubble (kord1x,kord1y,end_kordx,end_kordy,speed) {

var upTween=new Tween(haha,'y',None.easeIn,kord1y,end_kordy,speed,false);

}
}

dixus
19.02.2010, 17:33
Если вы хотите управлять этим твином извне экземпляра bubble (прикреплять слушатели), то он должен быть полем в классе. А в качестве первого аргумента конструктор твина принимает перемещаемый объект, в данном случае this.
public class bubble extends MovieClip{
public var upTween:Tween;

public function bubble (kord1x,kord1y,end_kordx,end_kordy,speed) {
super();
upTween = new Tween(this, 'y', None.easeIn, kord1y, end_kordy, speed, false);
}
}

Tranki
19.02.2010, 18:41
а как мне теперь удалить тот обьект чей твин закончился?
haha.upTween.addEventListener(TweenEvent.MOTION_FINISH,miss_click);

function miss_click(e:Event) {

g.removeChild(DisplayObject(e.target)); // таргет получается обьект твин

}

dixus
19.02.2010, 18:47
DisplayObject(e.target.obj)

Tranki
20.02.2010, 16:18
Всем спасибо проблема решена :)