Actionscript 3 如何使用MC目标命中数组的TestObject MC项?

Actionscript 3 如何使用MC目标命中数组的TestObject MC项?,actionscript-3,flash,hittest,Actionscript 3,Flash,Hittest,我有一个数组中的项目,每个项目都是一个movieclip,以1秒的延迟间隔播放,还有一个目标movieclip(carTarget),由箭头键控制,目的是避免与数组项目发生冲突(obstacleArray[I])。我一直在尝试创建hitTestObject语句,以便在发生冲突时发出通知。但是,我收到了一些错误,例如参数HITTESTABLOCE most不能为空,并且无法确定如何解决它 //obstacles function randomSort(a:*, b:*):Number {

我有一个数组中的项目,每个项目都是一个movieclip,以1秒的延迟间隔播放,还有一个目标movieclip(carTarget),由箭头键控制,目的是避免与数组项目发生冲突(obstacleArray[I])。我一直在尝试创建hitTestObject语句,以便在发生冲突时发出通知。但是,我收到了一些错误,例如参数HITTESTABLOCE most不能为空,并且无法确定如何解决它

//obstacles
function randomSort(a:*, b:*):Number
{
    if (Math.random() < 0.5) return -1;
    else return 1;
}
var obstacleArray:Array = [obstacleCar,obstacleCar2,obstacleCar3];
obstacleArray.sort(randomSort);

trace(obstacleArray);
trace(obstacleArray.length);

//OBSTACLE START DELAY
var timerPlay:Timer = new Timer(1000,1);
timerPlay.addEventListener(TimerEvent.TIMER, ontimerPlay);
timerPlay.start();

var i:int = 0;
var timerDelay:Timer = new Timer(1000, 3);
function ontimerPlay(evt:TimerEvent):void{

    obstacleArray[i].addEventListener(Event.ENTER_FRAME,checkHitTest);    
    //FOR EACH OBSTACLE
    timerDelay.addEventListener(TimerEvent.TIMER, ontimerDelay);
    timerDelay.start();
}

function checkHitTest(event:Event):void{
        if(carTarget.hitTestObject(obstacleArray[i]))
        {
            trace("HIT!");
        }
}

function ontimerDelay(evt:TimerEvent):void{
    obstacleArray[i].play();
    trace(obstacleArray[i]);
    i++;
}
//障碍
函数随机排序(a:*,b:*):编号
{
if(Math.random()<0.5)返回-1;
否则返回1;
}
var obstaclarray:Array=[obstacleCar,obstacleCar2,obstacleCar3];
obstacleArray.sort(随机排序);
痕迹(障碍物射线);
跟踪(obstacleArray.length);
//障碍物启动延迟
var timerPlay:定时器=新定时器(1000,1);
timerPlay.addEventListener(TimerEvent.TIMER,ontimerPlay);
timerPlay.start();
变量i:int=0;
var timerDelay:定时器=新定时器(1000,3);
函数ontimerPlay(evt:TimerEvent):无效{
obstacleArray[i].addEventListener(事件。输入\u帧,检查HitTest);
//针对每个障碍
timerDelay.addEventListener(TimerEvent.TIMER,ontimerDelay);
timerDelay.start();
}
功能检查测试(事件:事件):无效{
if(carTarget.hitTestObject(obstacleArray[i]))
{
跟踪(“击中!”);
}
}
函数ontimerDelay(evt:TimerEvent):无效{
obstacleArray[i].play();
trace(obstacleArray[i]);
i++;
}

在您尝试使用hitTestObject时,它很可能不存在。从您共享的代码中,我看不到您在代码中的何处创建它。因此,假设carTarget是舞台上的一个对象,并且当您想要使用它时,它具有初始化的属性或对象hitTestObject-假设这些东西,那么您需要确保当此代码运行时,该对象仍然存在。

最有可能的问题在于这段代码:

function checkHitTest(event:Event):void{
        if(carTarget.hitTestObject(obstacleArray[i]))
        {
            trace("HIT!");
        }
}
在我使用计时器调用进行更改之后,obstacleArray[i]将为null或更糟的值——这是您需要检查的对象之外的另一个对象

您应该将此更改为:

function checkHitTest(event:Event):void{
        if(carTarget.hitTestObject(event.target))
        {
            trace("HIT!");
        }
}

event.target将从Enterframe event调用checkHitTest获得当前障碍物,谢谢您的回复,但更多的问题是在何处放置hitTestObject语句—重复检查命中。目前它没有这样做,只回复TypeError:Error#2007:Parameter hitTestObject必须为非空?