Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Бомба - проблема с таймером в классе. (http://www.flasher.ru/forum/showthread.php?t=166866)

reQuiem 06.09.2011 13:31

Бомба - проблема с таймером в классе.
 
Привет!
Помогите, пожалуйста, справиться со следующей проблемой.


В кадре на maintimeline есть я создаю экземпляр класса bomb и помещаю его в массив.
В классе прописан алгоритм движения объекта а из кадра на таймлайне я вызываю апдейт массива с бомбами и проверяю циклом столкновения. Все работает хорошо.
Но я хочу ограничить время жизни бомбы. Для этого в классе бомбы создаю функцию уничтожения и таймер вызывающий эту функцию. И не работает :( во первых не создается таймер, выдает ошибку "bomb.as, Line 14 1120: Access of undefined property bombTimer."
и во-вторых не получается обратиться к переменным созданным на таймлайне "bomb.as, Line 33 1120: Access of undefined property bombs_arr."


Надеюсь вы поможете мне разобраться.

код класса бомба

Код AS3:

package
{
        import flash.display.MovieClip;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
        public class bomb extends MovieClip
        {
 
                public var bombSpeedX:Number=0;
                public var bombSpeedY:Number=0;
                public var goalX:Number;
                public var goalY:Number;
                public var bombTimer:Timer = new Timer(9000);
                bombTimer.addEventListener(TimerEvent.TIMER_COMPLETE, bombTimeOver);
                bombTimer.start();
 
                public function bomb()
                {
                        this.x=-5;
                        this.y=-5;
                }
 
 
                public function bombTimeOver()
                {
                        parent.removeChild(this);
                        stage.bombs_arr.splice(this,1);
                        stage.numOfBombs = bombs_arr.length;
 
 
                }
 
                public function update():void
                {
                        this.x+=bombSpeedX;
                        this.y+=bombSpeedY;
 
                        if(this.x < goalX)
                        {
                                if(bombSpeedX<3)
                                {
                                        this.bombSpeedX+=0.25;
                                }
 
                        }
                        else
                        {
                                if(bombSpeedX>-3)
                                {
                                        this.bombSpeedX-=0.25;
                                }
                        }
 
                        if(this.y < goalY)
                        {
                                if(bombSpeedY<3)
                                {
                                        this.bombSpeedY+=0.25;
                                }
 
                        }
                        else
                        {
                                if(bombSpeedY>-3)
                                {
                                        this.bombSpeedY-=0.25;
                                }
                        }
                }
        }
}


кусочек кода с таймлайна

Код AS3:

var numOfBombs:Number=0;
var bombs_arr:Array = new Array();
var bomb_1 :bomb = new bomb();
addChildAt(bomb_1,8);
bombs_arr.push(bomb_1);
numOfBombs++ ;

Спасибо!

Genzo 06.09.2011 13:42

1 - Перестать писать код в фреймах и погуглить принципы ооп.

2 -
Код AS3:

public function bombTimeOver()
                {
                        parent.removeChild(this);
                        stage.bombs_arr.splice(this,1);
                        stage.numOfBombs = bombs_arr.length;
 
 
                }

Вы обращаетесь к stage бомбы , у вас не получиться оттуда обратиться к коду в таймлайне. вещайте события лучше.

reQuiem 06.09.2011 13:46

1 - Перестать писать код в фреймах и погуглить принципы ооп.

Да, это уже понял :) в следующий раз обязательно. А сейчас у меня уже почти все готово в проекте если решить эту проблему.


2.
Что значит лучше вещать события?
мне посоветовали решить это через (stage as Object).

Пока остается проблема с таймером.

Genzo 06.09.2011 13:54

Код AS3:

var bomb_1 :bomb = new bomb();
bomb_1.addEventListener('bombDefuse' , bombDefuse);
addChildAt(bomb_1,8);
function bombDefuse(e:Event)
{
//удаляйте тут
}
 
BOMB :
public function bombTimeOver()
{
dispatchEvent(new Event('bombDefuse'));
}

Добавлено через 1 минуту
UP :
Код AS3:

function bombDefuse(e:Event)
{
removeChild(e.target as bomb);
bombs_arr.splice(bombs_arr.indexOf(e.target as bomb),1);
numOfBombs = bombs_arr.length;
}

Добавлено через 3 минуты
Код AS3:

public var bombTimer:Timer ;
 
 
                public function bomb()
                {
bombTimer = new Timer(9000);
bombTimer.addEventListener(TimerEvent.TIMER_COMPLETE, bombTimeOver);
                bombTimer.start();
                        this.x=-5;
                        this.y=-5;
                }


reQuiem 07.09.2011 02:27

погуглил про dispatchEvent, логику понял но почему то не срабатывает.

во фрейме

Код AS3:

addEventListener('bombBorn' , bombBorn);
function bombBorn(e:Event)
{
        trace("Bomb_test_1");
 
}

в классе

Код AS3:

public function alienBombSpawn(event:TimerEvent)
        {
              trace("Bomb_test_2");
              dispatchEvent(new Event('bombBorn'));                       
        }

Bomb_test_1 - не трейсится.
Bomb_test_2 - трейсится.

Значит таймер срабатывает но почему то не передается event...
(Слушатель стоит раньше чем создается экземпляр класса, если что)
Ошибок никаких не выдает.

Спасибо за помощь, чувствую я на верном пути, надо еще чутьчуть :)

derhab 07.09.2011 05:44

предполагаю, что так заработает
Код AS3:

dispatchEvent(new Event('bombBorn', true));


Genzo 07.09.2011 10:51

Код AS3:

addEventListener('bombBorn' , bombBorn);

вы на какой объект слушатель вешаете?

reQuiem 07.09.2011 11:41

Цитата:

Сообщение от Genzo (Сообщение 1029055)
Код AS3:

addEventListener('bombBorn' , bombBorn);

вы на какой объект слушатель вешаете?

пока для теста без указания этого или на stage. Лучше сделать такой один общий слушатель или на каждый объект рождающий бомбу повесить свой?


Цитата:

Сообщение от derhab (Сообщение 1029005)
предполагаю, что так заработает
Код AS3:

dispatchEvent(new Event('bombBorn', true));


Заработало, спасибо )


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

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