Форум 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=177123)

mihael_p 24.03.2012 23:58

Информационные иконки бонусов с таймером
 
Допустим: есть герой, есть бонусы с ограниченным по времени действием, когда герой "берет" такой бонус - начинается действие связанное с этим бонусом и запускается таймер по истечению которого нужный бонус отключается.Хочу информировать игрока о том, что он подобрал такой то бонус и он закончится через столько то секунд, примерно это будет выглядеть так: http://www.flasher.ru/forum/attachme...1&d=1332614497

В следующий момент, игрок увидит, что иконка бонуса "1" - удалится, а иконки "2" и "3" поднимутся, то есть "2" займет место "1" а "3" поднимется на место "2".
Пожалуйста, подскажите как реализовать?

Когда думал сам - сделал такой класс под это дело, но ничего толком не работает:

Код AS3:

package 
{
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
 
        public class BonusInspector extends MovieClip
        {
                public var mc:MovieClip = new Bonus_Inspector();//Место под  иконки бонусов
                public var iconMC:MovieClip;
                private var iconsArray:Array = [];
                private var countTime:Timer = new Timer(1000,0);
                private var sec:int = 5;
 
                public function BonusInspector():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        mc.x = 50;
                        mc.y = 350;
                        addChild(mc);
                }
                public function setBonusMc(mcNum:int):void // Сюда приходит номер бонуса, выбирается
                {                                                // иконка бонуса исходя из того, что пришло
                        sec = 5;
                        switch(mcNum)
                        {
                                case 1:
                                        iconMC = new Freeze();
                                        break;
                                case 2:
                                        iconMC = new BulletMaxDist();
                                        break;
                                case 3:
                                        iconMC = new Speed();
                                        break;
                                case 4:
                                        iconMC = new BulletMaxPower();
                                        break;
 
                        }
                        iconMC.id = mcNum;
                        mc.addChild(iconMC);
                        countTime.addEventListener(TimerEvent.TIMER, onTime);
                        countTime.start();
                        iconsArray.push(iconMC);
                        for (var i:int=0; i < iconsArray.length; i++)
                        {
                                if (i == 0)
                                {
                                        iconsArray[i].x = 30;
                                        iconsArray[i].y = 30;
                                }
                                else {
                                        iconsArray[i].x = iconsArray[i-1].x;
                                        iconsArray[i].y=(iconsArray[i-1]).y + 30;
                                }
 
                        }
                }
                private function onTime(e:TimerEvent):void
                {
                        if (sec == 0)
                        {
                                iconMC.time.text = '';
                                countTime.stop();
                                for (var i:int=0; i < iconsArray.length; i++)
                                {
                                        if (iconsArray[i].id == iconMC.id)
                                        {
                                                iconsArray.slice(i, 1);
                                        }
                                }
                                mc.removeChild(iconMC);
                        }
 
                        else{
                                sec -= 1;
                                iconMC.time.text = sec;
                        }
                }
        }
 
}


Wolsh 25.03.2012 05:09

У Вас один таймер, а бонусов может быть несколько, взятых в разное время. Надо каждому бонусу привязывать свой таймер, либо таймер тикает постоянно, а к бонусам привязывается время, в которое их взяли, и на каждый тик проверяется и показывается... лучше каждому по таймеру, имхо.
У Вас одна приватная переменная iconMC, а иконок может быть несколько. Так нужна ли приватная переменная, или лучше хранить их в массиве?
Свитч я бы убрал. Сделать массив классов иконок, и при получении кода бонуса просто брать класс из массива по этому индексу
Код AS3:

private const icons:Array = [Freeze, BulletMaxDist, Speed, BulletMaxPower];
public function setBonusMc(mcNum:int):void
{
        var iconMC:MovieClip = (new icons[mcNum]()) as MovieClip;
}


mihael_p 25.03.2012 13:02

Цитата:

Сообщение от Wolsh (Сообщение 1070979)
У Вас одна приватная переменная iconMC, а иконок может быть несколько. Так нужна ли приватная переменная, или лучше хранить их в массиве?
Свитч я бы убрал. Сделать массив классов иконок, и при получении кода бонуса просто брать класс из массива по этому индексу

Спасибо за инфу. Но у меня немного другая проблема, я не могу сделать так, что бы при удалении иконки бонуса нижняя иконка, если она есть, становилась на место удаленной, я попытался сделать это так:
Код AS3:

private function onTime(e:TimerEvent):void
                {
                        if (sec == 0)
                        {
                                iconMC.time.text = '';
                                countTime.stop();
                                for (var i:int=0; i < iconsArray.length; i++)
                                {
                                        if (iconsArray[i].id == iconMC.id)
                                        {
                                                iconsArray.slice(i, 1);
                                        }
                                }
                                mc.removeChild(iconMC);
                        }
 
                        else{
                                sec -= 1;
                                iconMC.time.text = sec;
                        }
                }

но ничего не вышло, иконки удаляются, элементы в массиве остаются, как быть?

Wolsh 25.03.2012 13:45

А я разве не об этом говорю? Вот у Вас три иконки скажем, в контейнере и в массиве. Вы сравниваете их с iconMC (впрочем Вы сравниваете зачем-то id. Зачем, если в массиве такие же ссылки на клипы иконок, как и переменная iconMC?) Ну а сама iconMC это что? Это последняя из добавленных иконок (бонусов). То есть я, например, не могу понять из вашего кода, над какими объектами производятся действия и как по одному конечному таймеру отсчитывается время жизни для нескольких бонусов. Вам бы с этим для начала разобраться, не с красотами всплывания.
И не slice, а splice. Slice не изменяет массив, к которому применяется, а возвращает новый. То есть вот так будет возвращен массив с одним вырезанным элементом. В этом смысл слова slice ("ломтик").
Код AS3:

var newArray:Array = iconsArray.slice(i, 1);

А Вам нужен сплайс.
Код AS3:

iconsArray.splice(i, 1);


mihael_p 25.03.2012 19:23

Проблема непонимания друг друга кроется в разном уровне профессионализма, я этим меньше года занимаюсь...
А как Вы бы поступили на моем месте? Как бы решили эту задачу? посоветуйте пожалуйста

Цитата:

Сообщение от Wolsh (Сообщение 1071021)
То есть я, например, не могу понять из вашего кода, над какими объектами производятся действия и как по одному конечному таймеру отсчитывается время жизни для нескольких бонусов. Вам бы с этим для начала разобраться, не с красотами всплывания.


Все операции с самими бонусами происходят в классе Bonus.
Это класс для иконок и действий с ними. Я думал, что 1го таймера хватит...
Вот пришел номер бонуса из класса Bonus, по этому номеру я узнаю какой мувик достать из библиотеки и добавить его в специально отведенное под иконки место ... дальше что делать?

Wolsh 25.03.2012 20:25

Я бы сделал отдельный класс для индикации бонуса. Пусть принимает в конструктор иконку для отображения и время действия. И таймер прямо в нем создавал, и пусть себе считает для этого конкретного бонуса, и показывает как Вам удобно – цифрами, или прогрессбаром – течение времени. Когда время кончится, посылает событие "я кончился". На это событие при создании бонуса подписывается менеджер бонусов. Поймав событие, что данный бонус кончился, менеджер удаляет его с панельки и из массива и двигает остальные, если они есть.


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

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