0

如果这是一个非常明显的问题,请道歉。

我想在迷你游戏中添加一个 hitTestObject if 循环。障碍物是一个数组中的 3 个项目,所有 3 个项目都是以 1 秒的计时器类延迟连续单独播放的电影剪辑。但是由于循环(我假设)hitTestObject if 语句没有返回跟踪“命中”或任何错误 - 我应该如何解决这个问题?

先感谢您!

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

//(no need for the shuffledLetters[] Array)
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{
    if (carTarget.hitTestObject(obstacleArray[i]) == true){
    trace("HIT!");
    }
    //FOR EACH OBSTACLE

    timerDelay.addEventListener(TimerEvent.TIMER, ontimerDelay);
    timerDelay.start();

}
function ontimerDelay(evt:TimerEvent):void{
    obstacleArray[i].play();
    trace(i);
    i++;

} 
4

2 回答 2

0

您创建的第一个计时器仅持续一秒钟。这意味着您只有效地检查一次碰撞,并且在您的障碍物开始播放之前也是如此。因此,当您的障碍物正在播放时,不会调用第一个计时器处理程序。您可以跟踪以验证这一点。

于 2013-02-16T03:30:24.887 回答
0

现在,您正在执行一次命中测试,在任何障碍影片剪辑播放之前。您可能希望每帧重复执行命中测试。

将此添加到onTimerDelay()

if(i === 0) {
    stage.addEventListener(Event.ENTER_FRAME, enterFrameListener)
}

然后在 ontimerDelay() 之外创建侦听器函数,并将命中测试放在那里:

function enterFrameListener(evt:Event):void {
    var index:int = Math.max(0, i - 1);
    if (carTarget.hitTestObject(obstacleArray[index]) == true){
        trace("HIT!");
    }
}

这将在 carTarget 和当前播放的障碍物之间的每一帧执行一次命中测试。

关于你的词汇的注释:

  1. 您的代码中没有任何循环。“if”语句不是循环,它被称为“条件语句”。
  2. ontimerDelay() 将被调用 3 次,但它并不是真正的循环,即使它被重复调用。
  3. 在您的代码中,您没有向计时器类添加命中测试。类是一种用于制作类实例(timerPlay 和 timerDelay)的蓝图。您正在向使用计时器类的“实例”注册的“事件侦听器”添加命中测试。

编辑

关于您在评论中提到的错误,我之前的示例是错误的。我指的是当前播放的影片剪辑,索引为 i,但实际上应该是 i - 1。每次播放新的障碍影片剪辑时,都会增加 i,因此 i 不再是当前播放的影片剪辑的索引. 唯一不需要减去 1 的情况是当 i 为 0 时。我更新了我之前的示例。

我还将事件侦听器注册移动到 onTimerDelay 中并将其包装在 if 语句中,以便在第一个影片剪辑开始播放之前不会执行命中测试。

编辑

如果您只想在两个对象开始接触时跟踪“Hit”,则需要跟踪最后一次碰撞测试的结果。在 enterFrameListener 中,您可以检查最后一帧是否有命中。如果上一帧没有命中而当前帧有命中,则可以追踪“命中”。如果在最后一帧中命中并且在当前帧中命中,则可以跳过跟踪语句。

var lastHitTestResult:Boolean = false;

function enterFrameListener(evt:Event):void {
    var index:int = Math.max(0, i - 1);
    var currentHitTestResult:Boolean = carTarget.hitTestObject(obstacleArray[index])
    if(lastHitTestResult === false && currentHitTestResult === true) {
        trace("HIT!")
    }
    lastHitTestResult = currentHitTestResult
}

只需确保在 onTimerDelay 中将 lastHitTestResult 重置为 false

于 2013-02-16T03:06:10.863 回答