Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.03.2012, 23:58
mihael_p вне форума Посмотреть профиль Отправить личное сообщение для mihael_p Посетить домашнюю страницу mihael_p Найти все сообщения от mihael_p
  № 1  
Ответить с цитированием
mihael_p

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
По умолчанию Информационные иконки бонусов с таймером

Допустим: есть герой, есть бонусы с ограниченным по времени действием, когда герой "берет" такой бонус - начинается действие связанное с этим бонусом и запускается таймер по истечению которого нужный бонус отключается.Хочу информировать игрока о том, что он подобрал такой то бонус и он закончится через столько то секунд, примерно это будет выглядеть так:

В следующий момент, игрок увидит, что иконка бонуса "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;
			}
		}
	}
 
}
__________________
Не стыдно спросить, стыдно не знать !

Старый 25.03.2012, 05:09
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
У Вас один таймер, а бонусов может быть несколько, взятых в разное время. Надо каждому бонусу привязывать свой таймер, либо таймер тикает постоянно, а к бонусам привязывается время, в которое их взяли, и на каждый тик проверяется и показывается... лучше каждому по таймеру, имхо.
У Вас одна приватная переменная iconMC, а иконок может быть несколько. Так нужна ли приватная переменная, или лучше хранить их в массиве?
Свитч я бы убрал. Сделать массив классов иконок, и при получении кода бонуса просто брать класс из массива по этому индексу
Код AS3:
private const icons:Array = [Freeze, BulletMaxDist, Speed, BulletMaxPower];
public function setBonusMc(mcNum:int):void
{
	var iconMC:MovieClip = (new icons[mcNum]()) as MovieClip;
}
__________________
Reality.getBounds(this);

Старый 25.03.2012, 13:02
mihael_p вне форума Посмотреть профиль Отправить личное сообщение для mihael_p Посетить домашнюю страницу mihael_p Найти все сообщения от mihael_p
  № 3  
Ответить с цитированием
mihael_p

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
Цитата:
Сообщение от Wolsh Посмотреть сообщение
У Вас одна приватная переменная 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;
			}
		}
но ничего не вышло, иконки удаляются, элементы в массиве остаются, как быть?
__________________
Не стыдно спросить, стыдно не знать !

Старый 25.03.2012, 13:45
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
А я разве не об этом говорю? Вот у Вас три иконки скажем, в контейнере и в массиве. Вы сравниваете их с iconMC (впрочем Вы сравниваете зачем-то id. Зачем, если в массиве такие же ссылки на клипы иконок, как и переменная iconMC?) Ну а сама iconMC это что? Это последняя из добавленных иконок (бонусов). То есть я, например, не могу понять из вашего кода, над какими объектами производятся действия и как по одному конечному таймеру отсчитывается время жизни для нескольких бонусов. Вам бы с этим для начала разобраться, не с красотами всплывания.
И не slice, а splice. Slice не изменяет массив, к которому применяется, а возвращает новый. То есть вот так будет возвращен массив с одним вырезанным элементом. В этом смысл слова slice ("ломтик").
Код AS3:
var newArray:Array = iconsArray.slice(i, 1);
А Вам нужен сплайс.
Код AS3:
iconsArray.splice(i, 1);
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 25.03.2012 в 13:53.
Старый 25.03.2012, 19:23
mihael_p вне форума Посмотреть профиль Отправить личное сообщение для mihael_p Посетить домашнюю страницу mihael_p Найти все сообщения от mihael_p
  № 5  
Ответить с цитированием
mihael_p

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
Проблема непонимания друг друга кроется в разном уровне профессионализма, я этим меньше года занимаюсь...
А как Вы бы поступили на моем месте? Как бы решили эту задачу? посоветуйте пожалуйста

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

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

Старый 25.03.2012, 20:25
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Я бы сделал отдельный класс для индикации бонуса. Пусть принимает в конструктор иконку для отображения и время действия. И таймер прямо в нем создавал, и пусть себе считает для этого конкретного бонуса, и показывает как Вам удобно – цифрами, или прогрессбаром – течение времени. Когда время кончится, посылает событие "я кончился". На это событие при создании бонуса подписывается менеджер бонусов. Поймав событие, что данный бонус кончился, менеджер удаляет его с панельки и из массива и двигает остальные, если они есть.
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 06:07.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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