PDA

Просмотр полной версии : Есть ли методы, аналогичные HitTestObject?


Digital
21.09.2013, 16:09
Есть ли методы, аналогичные HitTestObject?

Akopalipsis
21.09.2013, 16:25
Есть ещё hitTestPoint http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#hitTestPoint()
А так, лучше самому, что то придумать.. Пересечение отрезков, лучей, различных фигур..

Wolsh
21.09.2013, 16:41
Еще DisplayObjectContainer#getObjectsUnderPoint() (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html#getObjectsUnderPoint%28%29)

MikroAcse
21.09.2013, 20:41
Есть ли методы, аналогичные HitTestObject?
Смотря что тебе нужно.

Вот, например, проверка пересечения двух Rectangle:
public function intersects(rect1:Rectangle, rect2:Rectangle):Boolean
{
return (!((rect1.right<rect2.left)||(rect1.left>rect2.right))) && (!((rect1.bottom<rect2.top)||(rect1.top>rect2.bottom)));
}
Для скорости, можно сделать эту функцию inline (только, если компилятор ASC2).

UPD:
Как подсказали ниже, Rectangle#intersects() все таки быстрее работает.

Akopalipsis
21.09.2013, 20:53
Для скорости, можно сделать эту функцию inline (только, если компилятор ASC2).
Расскажите пожалуйста, что это такое?

Wolsh
21.09.2013, 21:02
Всегда думал, что пересечение ректанглов определяется методом Rectangle#intersects().
Или он медленней?

UPD: Проверил, intersects() быстрее в полтора раза.

MikroAcse
21.09.2013, 21:29
UPD: Проверил, intersects() быстрее в полтора раза.
Какой именно? Мой вариант или Rectangle#intersects?

Добавлено через 2 минуты
Расскажите пожалуйста, что это такое?
Inline вставляет содержимое функции в то место, где она вызывается, например:
inline function hello(arg1:int):String {
var result:String = "hello: " + arg1;
return "world, " + result;
}
var helloStr:String = hello();
//превращается в:
var local0:String = "hello: " + 5;
var helloStr:String = "world, " + local0;

Wolsh
21.09.2013, 21:36
Какой именно?Rectangle#intersects()

MikroAcse
21.09.2013, 21:37
Rectangle#intersects()
Спасибо, Wolsh.
В интернете было написано, что мой вариант (писал не я) быстрее этого самого Rectangle#intersects;
Видимо, врут. Учту в следующий раз.

Wolsh
21.09.2013, 21:42
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Rectangle;

/**
* ...
* @author wolsh
*/
public class TimeTest extends Sprite
{
private var _counts:uint = 5000000;

public function TimeTest():void
{
stage.addEventListener(MouseEvent.CLICK, test);
}

private function test(event:MouseEvent):void
{
var r1:Rectangle = new Rectangle(100, 220, 500, 310);
var r2:Rectangle = new Rectangle(100, 310, 220, 500);
var d0:Date = new Date();
for (var i:uint = 0; i < _counts; i++)
{
/* FIRST FIGURANT CODE */
var r:Boolean = r1.intersects(r2);
/* */
}
var d1:Date = new Date();
for (var j:uint = 0; j < _counts; j++)
{
/* SECOND FIGURANT CODE */
var n:Boolean = (!((r1.right<r2.left)||(r1.left>r2.right))) && (!((r1.bottom<r2.top)||(r1.top>r2.bottom)));
/* */
}
var d2:Date = new Date();
trace("FIRST : " + (d1.time - d0.time).toString()); // FIRST : 5193
trace("SECOND : " + (d2.time - d1.time).toString()); // SECOND : 6859
}
}
}

expl
22.09.2013, 00:23
В интернете было написано, что мой вариант (писал не я) быстрее этого самого Rectangle#intersects;
Видимо, врут
Может быть на старых плеерах медленее работало. В любом случае разница не велика.

А вот создавать объект Rectangle(в вашем примере используется уже созданный) только для проверки пересекаются ли объекты - это действительно раз в 5 медленнее чем сравнить координаты вручную, ничего не создавая.

caseyryan
22.09.2013, 10:38
Для каких целей нужен аналогичный метод?

Есть еще SAT. Гораздо лучше и эффективнее всяких там хиттестов