我需要在舞台上添加一个 MovieClip,其限制是它只能添加到舞台上的空白区域。舞台本身要么包含复杂的形状,要么可由用户操作,即他可以拖动/移动对象来改变空白区域。hitTest 和 hitTestObject 方法需要舞台上已有的 DisplayObject。正确的方法是什么 - 我能想象的唯一解决方案是将我的对象添加到舞台上,然后反复进行命中测试?
[想象一下,就像在视频游戏中添加精灵一样——它们必须在空白区域生成;如果它们从彼此的内部弹出,那么看起来会很奇怪。]
我需要在舞台上添加一个 MovieClip,其限制是它只能添加到舞台上的空白区域。舞台本身要么包含复杂的形状,要么可由用户操作,即他可以拖动/移动对象来改变空白区域。hitTest 和 hitTestObject 方法需要舞台上已有的 DisplayObject。正确的方法是什么 - 我能想象的唯一解决方案是将我的对象添加到舞台上,然后反复进行命中测试?
[想象一下,就像在视频游戏中添加精灵一样——它们必须在空白区域生成;如果它们从彼此的内部弹出,那么看起来会很奇怪。]
好吧,当你创建一个新类时,只需用一个变量将其关闭并将可见性设置为 false,然后循环直到没有 hitTest。
一个愚蠢的例子:
public class someClass extends Sprite
{
private var objectsOnStage:Array;
public function someClass(objectsArray:Array) {
objectsOnStage = objectsArray;
visible = false;
addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event){
removeEventListener(Event.ADDED_TO_STAGE, init);
addEventListener(Event.ENTER_FRAME, SEARCH);
}
private function SEARCH(e:Event) {
var doesHit:Boolean = false;
x = Math.round(Math.random() * (550 - 0)) + 0;
y = Math.round(Math.random() * (400 - 0)) + 0;
for (var i:int = 0; i < objectsOnStage; i++) {
if (doesHit) break;
if (this.hitTestObject(objectsOnStage[i])) {
doesHit = true;
}
}
if (doesHit) return;
placedInit();
}
private function placedInit() {
visible = true;
removeEventListener(Event.ENTER_FRAME, SEARCH);
//now init the stuff you want.
}
}
我知道这篇文章已经很老了,但万一它对任何人有帮助——
如果您需要对不在舞台上的影片剪辑进行命中测试。一种解决方法是先将其光栅化为位图。
var bitmapData:BitmapData = new BitmapData(mc.width, mc.height, true, 0x0000000);
bitmapData.draw(mc);
if (bitmapData.getPixel32(x, y) > 0) {
// Hit true.
}
您只需检查两个剪辑的边界框是否重叠。像这样:
import flash.geom.Rectangle;
import flash.display.MovieClip;
// create simple movie clips that has a rectangle shape inside
var sym1 : MovieClip = new Sym1();
var sym2 : MovieClip = new Sym2();
// get a rectanle of both clipt
var boundingBox1 : Rectangle = sym1.getBounds(this);
var boundingBox2 : Rectangle = sym2.getBounds(this);
// check if bounding boxes of both movie clips overlaps
// so it works like hitTestObject() method
trace( boundingBox1.intersects( boundingBox2) )