如何在计时器类中添加hitTestObject语句?

时间:2013-02-15 23:19:02

标签: actionscript-3 flash timer hittest

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

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

提前谢谢!

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++;

} 

2 个答案:

答案 0 :(得分: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”语句不是a 循环,它被称为“条件语句”。
  2. ontimerDelay()将被调用3次,但它实际上不是一个循环, 即使它被反复调用。
  3. 在您的代码中,您没有向计时器类添加命中测试。 类是用于创建类实例的蓝图 (timerPlay和timerDelay)。您正在为“事件监听器”添加命中测试 注册了计时器类的“实例”。
  4. 修改

    关于您在评论中提到的错误,我之前的例子是错误的。我指的是当前播放的索引为i的影片剪辑,但它应该是i - 1.每次播放新的障碍物影片剪辑时,你增加i,所以我不再是当前正在播放的影片剪辑的索引。你不需要减去1的唯一时间是当我为0.我更新了我之前的例子。

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

    修改

    如果您只希望在两个对象之间的联系开始时跟踪“命中”,则需要跟踪上次命中测试的结果。在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

答案 1 :(得分:0)

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