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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.08.2011, 21:01
Шурик_2 вне форума Посмотреть профиль Отправить личное сообщение для Шурик_2 Найти все сообщения от Шурик_2
  № 1  
Ответить с цитированием
Шурик_2
 
Аватар для Шурик_2

Регистрация: Dec 2007
Сообщений: 73
Отправить сообщение для Шурик_2 с помощью ICQ Отправить сообщение для Шурик_2 с помощью Skype™
Attention Проблемы с срабатыванием hitTest :(

Вот написал код для создания светодиодной матрицы
Определённые лампочки загораются, когда с ними пересекается полностью прозрачный мувиклип.
Код AS3:
import flash.display.MovieClip;
import flash.events.Event;
 
// Получаем размер рабочей области
var w:Number = st.width;
var h:Number = st.height;
 
// Определяем размер светодиода
var LEDsize = 5;
 
//Зазор между светодиодами
var LEDgap:Number = LEDsize + 1;
 
// Определяем отступы от краев раб.обл.(слева и сверху); размер светодиода делённый надвое
var identX:Number = LEDsize / 2;
var identY:Number = identX;
 
// Колличество светодиодов по горизонтали
var LEDamtX:Number = Math.ceil(w / LEDgap);
 
// Колличество светодиодов по вертикали
var LEDamtY:Number = Math.ceil(h / LEDgap);
 
// Строим сетку из светодиодов:
//сначала вертикаль
for (var i:int=0; i<LEDamtX; i++)
{
	//затем горизонталь
	for (var n:int=0; n<LEDamtY; n++)
	{
		//  Создаём светодиодную матрицу из заранне заготовленных мувиклипов
		var LED_off:led_off = new led_off();
		var xn:Number = i * LEDgap + identX;
		var yn:Number = n * LEDgap + identY;
		LED_off.x = xn;
		LED_off.y = yn;
		LED_off.width = LEDsize;
		LED_off.height = LEDsize;
		trace(xn);
		trace(yn);
		addChild(LED_off);
		//Сразу за ним создается слой с включеным светодиодом
		var LED_on:led_on = new led_on();
		LED_on.x = xn;
		LED_on.y = yn;
		LED_on.width = LEDsize;
		LED_on.height = LEDsize;
		addChild(LED_on);
		//делаем слой с СВЕТОДИОДОМ невидимым
		LED_on.visible = false;
/* ДО ЭТОГО МЕСТА ПРОГРАММА РАБОТАЕТ!*/
 
		//Создаем событие ENTER_FRAME, благодаря которому в при смене кадра будет проверяться "не пересекается с ней клип LED_on", если да, то делает клип LED_on видимым. Если не пересекает, то клип LED_on остаётся невидимым.
		addEventListener(Event.ENTER_FRAME, ver);
		function ver(e:Event):void
		{
			if (ScrArea2.hitTestObject(LED_on),true) //ScrArea2 - зараннее заготовленный мувик с анимацией
			{
				LED_on.visible = true;
			}
			else
			{
				//иначе диод выключен
				LED_on.visible = false;
			}
		}
	}
}
Сам проект
Вложения
Тип файла: zip LEDpanel.zip (10.7 Кб, 27 просмотров)

Старый 21.08.2011, 21:28
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Что-то вообще жесть какая-то.
Обработчик события и добавление слушателя ENTER_FRAME внутри цикла..
Это делать ни в коем случае нельзя.

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

Регистрация: Jul 2011
Сообщений: 67
Думаю стоит создать класс диода с функциями загорания и потухания, далее забить сколько нужно диодов в массив, разместить их как нужно и проверять каждый диод на столкновение с нужным вам объектом в цикле, если столкновение есть вызывать функцию загорания если нет то потухания.

Старый 22.08.2011, 02:43
Шурик_2 вне форума Посмотреть профиль Отправить личное сообщение для Шурик_2 Найти все сообщения от Шурик_2
  № 4  
Ответить с цитированием
Шурик_2
 
Аватар для Шурик_2

Регистрация: Dec 2007
Сообщений: 73
Отправить сообщение для Шурик_2 с помощью ICQ Отправить сообщение для Шурик_2 с помощью Skype™
Цитата:
Сообщение от ProxyGreen Посмотреть сообщение
Думаю стоит создать класс диода с функциями загорания и потухания, далее забить сколько нужно диодов в массив, разместить их как нужно и проверять каждый диод на столкновение с нужным вам объектом в цикле, если столкновение есть вызывать функцию загорания если нет то потухания.
Хорошая идея.

Просто у меня надежда поправить этот алгоритм.

Старый 22.08.2011, 04:19
ProxyGreen вне форума Посмотреть профиль Отправить личное сообщение для ProxyGreen Найти все сообщения от ProxyGreen
  № 5  
Ответить с цитированием
ProxyGreen
 
Аватар для ProxyGreen

Регистрация: Jul 2011
Сообщений: 67
В этом алгоритме вы развели много мусора и слушателей, от которых ни как нельзя будет отписаться в будущем => остановить процесс, который они реализуют будет невозможно, не говоря о потребляемой памяти.
Лучше организовать код так:

Код AS3:
 
		private function addDiods(arr:Array, num:uint) {
 
			for (var i:int = 0; i < num; i++) {
				arr.push(new Diod()); //тут создаются экземпляры класса "Diod"
				addChild(arr[arr.length - 1]);
			}
        }
 
		private function diodPos(arr:Array, cols:int, startPoint:Point, interval:int = 10):void {
			for (var i:int = 0, j:int = 0, k:int = 0 ; j < arr.length; i++, j++) {
				if (i > (cols-1)) {
					i = -1;
					j--;
					k++;
				}else {
					(arr[j] as Sprite).x = startPoint.x + (i * (arr[j] as Sprite).width) + (i * interval);
					(arr[j] as Sprite).y = startPoint.y + (k * (arr[j] as Sprite).height) + (k* interval);
				}
			}
		}
 
		private function diodColision(arr:Array, obj:*):void {
			for (var i:int = 0; i < arr.length; i++) {
				if ( (arr[i] as Diod).hitTestObject(obj)) {
					(arr[i] as Diod).light(); //светись 
				}else {
					(arr[i] as Diod).dark();  //потухни
				}
			}
		}
 
		private function enterFrameListener(e:Event) {
			diodColision(diodArray, hitObgect);
		}
В мэйн классе пишите что-то такое:

Код AS3:
private var diodArray:Array=new Array(); //массив "диодов"
private var hitObject= new BlaBla //объект с которым будет столкновение
addDiods(diodArray, 10);
diodPos(diodArray, 3, new Point(0,0));
 
stage.addEventListener(Event.ENTER_FRAME, enterFrameListener);

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

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

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


 


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


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