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

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

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

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
hunterr, конкретно в вашем случае чем являются объекты? Окружности, многоугульники или же это произвольные формы. Если второе, то возможно ли расмотреть объекты как окружности?
__________________
ranga

Старый 01.11.2011, 15:02
crazyone вне форума Посмотреть профиль Отправить личное сообщение для crazyone Найти все сообщения от crazyone
  № 12  
Ответить с цитированием
crazyone
 
Аватар для crazyone

блогер
Регистрация: Nov 2007
Адрес: Киев
Сообщений: 557
Записей в блоге: 2
Цитата:
Сообщение от hunterr Посмотреть сообщение
Наиболее заинтересовал способ который предложил crazyone.
Вот только можно чуть подробнее о том, как его реализовать? А то я слабо понял.
Заранее благодарен.

Немного уточню. У меня сразу же возникло два глупые вопросы:
1. Что такое битмапа?
2. Что такое блендер?
1. BitmapData;
2. Не блендер, а BlendMode - один из параметров метода BitmapData.draw();

Мне тут самому интересно стало, я наваял такой вот код. Работает:

Код AS3:
package  {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BlendMode;
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
 
	/**
	 * ...
	 * @author DoctorSTaL
	 */
	public class PixelHitTest extends Sprite {
		private var triangle:Sprite;
		private var circle:Sprite;
		private var bitmap:Bitmap;
 
		public function PixelHitTest() {
			super();
			addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
		}
		private function addedToStageHandler(event:Event):void {
			removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
			init();
		}
 
		// Создаем наши объекты
		private function init():void {
			circle = new Sprite();
			with (circle.graphics) {
				beginFill(0x336699);
				drawCircle(0,0,50);
				endFill();
			}
			circle.startDrag(true);
 
			triangle = new Sprite();
			with (triangle.graphics) {
				beginFill(0x0000FF);
				lineTo(100, 10);
				lineTo(50, 100);
				endFill();
			}
			triangle.x = 30;
			triangle.y = 40;
 
			addChild(triangle);
			addChild(circle);
 
			bitmap = new Bitmap(); // Просто, чтобы было видно, что и куда у нас рисуется
			bitmap.y = 250;
			addChild(bitmap);
 
			addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
		}
		private function mouseMoveHandler(event:MouseEvent):void {
			if (realHitTest(circle, triangle)) {
				trace("They do!");
			}else {
				trace("They do not!");
			}
		}
 
		private function realHitTest(first:DisplayObject, second:DisplayObject):Boolean {
 
			var fBBox:Rectangle = first.getBounds(this);
			var sBBox:Rectangle = second.getBounds(this);
			if (fBBox.intersects(sBBox)) { // чтобы не делать лишних попиксельных проверок и больших битмап
				var bounds:Rectangle = fBBox.union(sBBox); // общие границы двух объектов
				var bdata:BitmapData = new BitmapData(bounds.width, bounds.height,false,0); // Битмапа с новыми размерами
				bitmap.bitmapData = bdata; // Просто, чтобы было видно, что и куда у нас рисуется
 
				// Отрисовываем первый объект. Обратите внимание на ColorTransform.
				// За счет оффсетов в нем мы отрисовываем весь объект одним цветом - красным.
				var fp:Point = globalToLocal(first.localToGlobal(new Point()));
				var fMtrx:Matrix = new Matrix();
				fMtrx.translate(fp.x-bounds.x, fp.y-bounds.y);
				bdata.draw(first, fMtrx, new ColorTransform(1, 1, 1, 1, 255, -255, -255, 0));
 
				// Накладываем на него другой. Обратите внимание 
				// на BlendMode.ADD - мы добавляем на битмапу второй
				// объект, но уже зеленым цветом. Зеленым по красному
				// получается желтый ( 0xff0000 + 0x00ff00 = 0xffff00).
				var sp:Point = globalToLocal(second.localToGlobal(new Point()));
				var sMtrx:Matrix = new Matrix();
				sMtrx.translate(sp.x-bounds.x,sp.y-bounds.y);
				bdata.draw(second, sMtrx, new ColorTransform(1, 1, 1, 1, -255, 255, -255, 0), BlendMode.ADD);
 
				// Если в битмапе нет желтого - объекты не накладываются. 
				// Впринципе, можно пользовать threshold, но не знаю - будет ли лучше.
 
				return !bdata.getColorBoundsRect(0xffffff, 0xffff00).isEmpty();
			}
			bitmap.bitmapData = null;
			return false;
		}
 
 
 
	}
 
}

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

Регистрация: Sep 2011
Адрес: Планета Земля
Сообщений: 42
Все! Наконец-то работает! Огромное спасибо всем!
__________________
мечта сбываться если она становиться целью...

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

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

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


 


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


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