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

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

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

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
По умолчанию Как работает BitmapData.hitTest?

Нужна формула, для определения того, как определяет hitTest непрозрачный (с пороговой альфой) пиксель.
Разница появляется на некоторых файлах с разным порогом альфы.
Код AS3:
package 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.text.TextField;
 
	public class Main extends Sprite 
	{
 
		[Embed(source = '../fla/sun.png')]
		private var Sun:Class;
 
		private var tf:TextField;
		private function log(text:String):void {
			tf.appendText(text + '\n');
		}
 
		public function Main() {
 
			tf = new TextField();
			tf.width = tf.height = 300;
			tf.border = true;
 
			addChild(tf);
 
			if (stage) addedToStageListener();
			else addEventListener(Event.ADDED_TO_STAGE, addedToStageListener);
		}
 
		private function addedToStageListener(event:Event = null):void {
			var pic:Bitmap = new Sun() as Bitmap;
			var bmd:BitmapData = pic.bitmapData;
			var i:int, j:int;
 
			var v:Vector.<uint> = bmd.getVector(bmd.rect);
			var k:int = 0;
			for (j = 0; j < bmd.height; j++) {
				for (i = 0; i < bmd.width; i++) {
					var thrasholdAlpha:uint = 1;
					var hitTest:Boolean = bmd.hitTest(new Point(), thrasholdAlpha, new Point(i, j));
					var hitPixel:Boolean = (v[k] >>> 24) > thrasholdAlpha;// нужна правильная формула
					                                                      // (v[k] >>> 24) >= thrasholdAlpha) дает другой эффект
					if (hitTest != hitPixel) {
						// выводим пиксель
						log('hitTest:' + String(hitTest) + ', hitPixel: ' + String(hitPixel) + ', pixel: 0x' + v[k].toString(16));
					}
					k++;
				}
			}
		}
	}
}
Изображения
 

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

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
По-моему здесь лучше использовать getPixel() вместо тормозного hitTest

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

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Так я для этого и задал вопрос на форуме.
Как с помощью getPixel() (что то же самое что и getPixels и getVector) сделать то же самое, что и делает hitTest?

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

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
(что то же самое что и getPixels и getVector)
Не то же самое.
Цитата:
сделать то же самое, что и делает hitTest?
Например так:

Код AS3:
var pixel:uint = someImage.bitmapData.getPixel(this.x, this.y);							
var alpha:uint = (pixel >> 24)  & 0xff; 
 
if (alpha > 100) {
     // замеряем уровень альфа канала от 0 до 255
}


п.с. Писал по памяти, может где-то ошибся. Но думаю идея ясна

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

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Млин...извиняюсь, Вы читаете сообщения полостью? То что Вы написали, есть в первом посту...и в данном случае getPixels и getVector то же самое...
Вообщем, hitTest как-то странно работает, вот я и хочу разобраться, что за формула у него внутри. Вот собрал демку...там проект FlashDevelop и есть готовый swf.
Вложения
Тип файла: zip test_flash.zip (90.6 Кб, 66 просмотров)

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

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

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


 


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


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