![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Допустим: есть герой, есть бонусы с ограниченным по времени действием, когда герой "берет" такой бонус - начинается действие связанное с этим бонусом и запускается таймер по истечению которого нужный бонус отключается.Хочу информировать игрока о том, что он подобрал такой то бонус и он закончится через столько то секунд, примерно это будет выглядеть так:
В следующий момент, игрок увидит, что иконка бонуса "1" - удалится, а иконки "2" и "3" поднимутся, то есть "2" займет место "1" а "3" поднимется на место "2". Пожалуйста, подскажите как реализовать? Когда думал сам - сделал такой класс под это дело, но ничего толком не работает: 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; } } } }
__________________
Не стыдно спросить, стыдно не знать ! |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
У Вас один таймер, а бонусов может быть несколько, взятых в разное время. Надо каждому бонусу привязывать свой таймер, либо таймер тикает постоянно, а к бонусам привязывается время, в которое их взяли, и на каждый тик проверяется и показывается... лучше каждому по таймеру, имхо.
У Вас одна приватная переменная iconMC, а иконок может быть несколько. Так нужна ли приватная переменная, или лучше хранить их в массиве? Свитч я бы убрал. Сделать массив классов иконок, и при получении кода бонуса просто брать класс из массива по этому индексу
__________________
Reality.getBounds(this); |
|
|||||
|
Цитата:
но ничего не вышло, иконки удаляются, элементы в массиве остаются, как быть?
__________________
Не стыдно спросить, стыдно не знать ! |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
А я разве не об этом говорю? Вот у Вас три иконки скажем, в контейнере и в массиве. Вы сравниваете их с iconMC (впрочем Вы сравниваете зачем-то id. Зачем, если в массиве такие же ссылки на клипы иконок, как и переменная iconMC?) Ну а сама iconMC это что? Это последняя из добавленных иконок (бонусов). То есть я, например, не могу понять из вашего кода, над какими объектами производятся действия и как по одному конечному таймеру отсчитывается время жизни для нескольких бонусов. Вам бы с этим для начала разобраться, не с красотами всплывания.
И не slice, а splice. Slice не изменяет массив, к которому применяется, а возвращает новый. То есть вот так будет возвращен массив с одним вырезанным элементом. В этом смысл слова slice ("ломтик"). А Вам нужен сплайс.
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 25.03.2012 в 13:53. |
|
|||||
|
Проблема непонимания друг друга кроется в разном уровне профессионализма, я этим меньше года занимаюсь...
А как Вы бы поступили на моем месте? Как бы решили эту задачу? посоветуйте пожалуйста Цитата:
Все операции с самими бонусами происходят в классе Bonus. Это класс для иконок и действий с ними. Я думал, что 1го таймера хватит... Вот пришел номер бонуса из класса Bonus, по этому номеру я узнаю какой мувик достать из библиотеки и добавить его в специально отведенное под иконки место ... дальше что делать?
__________________
Не стыдно спросить, стыдно не знать ! |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Я бы сделал отдельный класс для индикации бонуса. Пусть принимает в конструктор иконку для отображения и время действия. И таймер прямо в нем создавал, и пусть себе считает для этого конкретного бонуса, и показывает как Вам удобно – цифрами, или прогрессбаром – течение времени. Когда время кончится, посылает событие "я кончился". На это событие при создании бонуса подписывается менеджер бонусов. Поймав событие, что данный бонус кончился, менеджер удаляет его с панельки и из массива и двигает остальные, если они есть.
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 06:07. |
|
|
« Предыдущая тема | Следующая тема » |
|
|