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

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

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

Регистрация: Feb 2012
Сообщений: 1,540
По умолчанию HitTest сложных объектов

Тема выделена из http://flasher.ru/forum/showthread.php?t=175226


Чтобы не создавать новую тему, в чем ошибка?:
Код AS3:
public static function hitObject(obj1:MovieClip,obj2:MovieClip):Boolean {
                var bmpd1:BitmapData = new BitmapData(2000, 2000, true, 0x00ffffff);
                bmpd1.draw(obj1)
                var bmp1:Bitmap = new Bitmap(bmpd1);
                bmp1.x = obj1.x;
                bmp1.y = obj1.y;
 
                var bmpd2:BitmapData = new BitmapData(2000, 2000, true, 0x00ffffff);
                bmpd2.draw(obj2)
                var bmp2:Bitmap = new Bitmap(bmpd2);
                bmp2.x = obj2.x;
                bmp2.y = obj2.y;
 
                return bmpd1.hitTest(new Point(bmp1.x,bmp1.y), 255, bmpd2, new Point(bmp2.x,bmp2.y), 255)
        }
Неправильно работает.
Мне нужно узнать, пересекаются ли объекты.


Последний раз редактировалось Wolsh; 15.02.2012 в 16:13.
Старый 13.02.2012, 00:36
elder_Nosferatu вне форума Посмотреть профиль Отправить личное сообщение для elder_Nosferatu Найти все сообщения от elder_Nosferatu
  № 2  
Ответить с цитированием
elder_Nosferatu
 
Аватар для elder_Nosferatu

Регистрация: Nov 2010
Адрес: 48° 55'N 24° 42'E GMT +2:00
Сообщений: 399
Записей в блоге: 1
Цитата:
Сообщение от MikroAcse Посмотреть сообщение
...
Мне нужно узнать, пересекаются ли объекты.
А в чем фишка вашего метода? Ну... кроме расходов памяти на две битмапы по 4 ! МегаПикселя ! ну и процессорного времени на обработку?

Параметры у вас MovieClip-ные, почему бы не использовать hitTestObject?

Добавлено через 3 минуты
ЗЫ: Еслы для вас решить проблему по вашему - дело принципа, то попробуйте кинуть на экран то, во что вы превращаете входные параметры и оценить вызуально, может своими глазами увидете в чем несоответствие желаемого и полученого...

Старый 14.02.2012, 02:38
Цветкофф вне форума Посмотреть профиль Отправить личное сообщение для Цветкофф Найти все сообщения от Цветкофф
  № 3  
Ответить с цитированием
Цветкофф

Регистрация: May 2008
Адрес: москва
Сообщений: 63
Цитата:
Сообщение от MikroAcse Посмотреть сообщение
в чем ошибка?
Код AS3:
public static function hitObject(obj1:MovieClip,obj2:MovieClip):Boolean {
	return obj1.hitTestObject(obj2);
}
не надо заниматься изобретением велосипеда

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

Регистрация: Feb 2012
Сообщений: 1,540
Цветкофф, где-то я вас "видел".
Я понял, что это можно сделать только через static function

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

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

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

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Говорят то о велосипедах, и правильно говорят что их изобретением не надо заниматься. Да вот только не о тех велосипедах говорят что надо. Цветкофф, речь идет не о пересечении "рамок" двух DisplayObject, а о BitmapData.
__________________
Я мало чего умею, но зато хорошо умею учиться...

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

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

Старый 15.02.2012, 00:32
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 8  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Сорри за неточность.
Цитата:
Сообщение от MikroAcse Посмотреть сообщение
в чем ошибка?:
Код AS3:
public static function hitObject(obj1:MovieClip,obj2:MovieClip):Boolean {
			    var bmpd1:BitmapData = new BitmapData(2000, 2000, true, 0x00ffffff);
	            bmpd1.draw(obj1)
	            var bmp1:Bitmap = new Bitmap(bmpd1);
				bmp1.x = obj1.x;
	            bmp1.y = obj1.y;
 
				var bmpd2:BitmapData = new BitmapData(2000, 2000, true, 0x00ffffff);
	            bmpd2.draw(obj2)
	            var bmp2:Bitmap = new Bitmap(bmpd2);
				bmp2.x = obj2.x;
	            bmp2.y = obj2.y;
 
			    return bmpd1.hitTest(new Point(bmp1.x,bmp1.y), 255, bmpd2, new Point(bmp2.x,bmp2.y), 255)
		}
Цитата:
Сообщение от Цветкофф Посмотреть сообщение
Цитата:
Сообщение от MikroAcse Посмотреть сообщение
в чем ошибка?:
Код AS3:
public static function hitObject(obj1:MovieClip,obj2:MovieClip):Boolean {
	return obj1.hitTestObject(obj2);
}
не надо заниматься изобретением велосипеда
С кода MikroAcse можно понять что проблема в нахождении наложения непрозрачных пикселей двух битмапдат.
Цитата:
BitmapData#hitTest() - Выполняет распознавание на уровне пикселей между одним растровым изображением и точкой, прямоугольником или другим растровым изображением.
А с кода Цветкофф можно понять, что он имеет в виду:
Цитата:
DisplayObject#hitTestObject() - Вычисляет ограничительную рамку экранного объекта, чтобы определить, не перекрывает и не пересекает ли она ограничительную рамку экранного объекта obj.
Добавлено через 3 минуты
В итоге вместо того, чтобы помочь человеку, получился ненужный совет сделать то, чего тс не хочет делать, и при том, не являющееся хорошим способом в конкретном случае.

Добавлено через 5 минут
А конкретный случай - это нахождение пересечения двух обьектов неправильной формы.
__________________
Я мало чего умею, но зато хорошо умею учиться...

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну теперь ок.
Значит, путь такой.
1) Определяем, накладываются ли рамки объектов – т.е. стоит ли вообще огород городить. Если да, то
2) Определяем прямоугольник, принадлежащий обоим рамкам, то есть прямоугольник наложения.
3) Отрисовываем часть первого объекта, попадающую в эту область, в битмапдату. То же делаем со вторым объектом.
4) Загоняем альфаканал одного объекта в красный канал тестовой битмапдаты (области пересечения рамок).
5) Загоняем альфаканал второго объекта в зеленый канал
6) Проверяем битмапдату на наличие желтого цвета.
Все.

Добавлено через 24 минуты
HardCoder скромно удалил свое сообщение, в котором справедливо поправил меня – после 3-го пункта можно тупо использовать BitmapData#hitTest() для сравнения двух битмапдат.
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 15.02.2012 в 01:37.
Создать новую тему Ответ Часовой пояс GMT +4, время: 15:35.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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