Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何在计时器类中添加hitTestObject语句?_Actionscript 3_Flash_Timer_Hittest - Fatal编程技术网

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

Actionscript 3 如何在计时器类中添加hitTestObject语句?,actionscript-3,flash,timer,hittest,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 re

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

我想在迷你游戏中添加一个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++;

} 
函数随机排序(a:*,b:*):编号
{
if(Math.random()<0.5)返回-1;
否则返回1;
}
var obstaclarray:Array=[obstacleCar,obstacleCar2,obstacleCar3];
obstacleArray.sort(随机排序);
//(不需要shuffledLetters[]数组)
痕迹(障碍物射线);
跟踪(obstacleArray.length);
//障碍物启动延迟
var timerPlay:定时器=新定时器(1000,1);
timerPlay.addEventListener(TimerEvent.TIMER,ontimerPlay);
timerPlay.start();
变量i:int=0;
var timerDelay:定时器=新定时器(1000,3);
函数ontimerPlay(evt:TimerEvent):无效{
if(carTarget.hitTestObject(obstacleArray[i])==true){
跟踪(“击中!”);
}
//针对每个障碍
timerDelay.addEventListener(TimerEvent.TIMER,ontimerDelay);
timerDelay.start();
}
函数ontimerDelay(evt:TimerEvent):无效{
obstacleArray[i].play();
微量元素(i);
i++;
} 

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

将此项添加到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和当前播放的障碍物之间的每一帧执行一次命中测试

关于你的词汇的注释:

  • 代码中没有任何循环。“如果”语句不是 循环,它被称为“条件语句”
  • ontimerDelay()将被调用3次,但它实际上不是一个循环, 即使它被反复调用
  • 在代码中,您没有向计时器类添加命中测试。 类是用来创建类实例的蓝图 (timerPlay和timerDelay)。您正在向“事件侦听器”添加命中测试 已向timer类的“实例”注册
  • 编辑

    关于你在评论中提到的错误,我前面的例子是错误的。我指的是目前正在播放的索引为I的电影剪辑,但它应该是I-1。每次播放新的障碍电影剪辑时,都会增加i,因此i不再是当前播放的电影剪辑的索引。唯一一次你不需要减去1是当我为0时。我更新了我以前的示例

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

    编辑

    如果您只希望在两个对象之间开始接触时跟踪“命中”,则需要跟踪上次命中测试的结果。在enterFrameListener中,您可以检查最后一帧中是否有点击。如果上一帧中没有命中,而当前帧中有命中,则可以跟踪“命中”。如果上一帧中有命中,而当前帧中有命中,则可以跳过trace语句

    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秒。这意味着你只能有效地检查一次碰撞,而且在障碍物开始发挥作用之前也是如此。
    因此,当你的障碍物在游戏中时,不会调用第一个计时器处理程序。您可以跟踪以验证这一点。

    谢谢您的帮助,这澄清了许多理解。我听从了你的建议,但在跑步时遇到了问题。首先是迁移警告1090,其次是在运行时。在Mc完成之后。TypeError:Error#2007:参数hitTestObject必须为非null。flash.display::DisplayObject/_hitTest()at flash.display::DisplayObject/hitTestObject()at Tsunamigetaway v_fla::MainTimeline/OneInterFrame()[Tsunamigetaway v_fla.MainTimeline::frame83:83]第83行:指的是if(cartaget.hitTestObject(obstacleArray[i])==true){@user2075625我添加了另一个代码示例,希望能够清除错误。让我知道它是否有效。为回来干杯!恐怕它仍然不能正常工作。-它仍然显示迁移警告,并且2007错误仍然出现。但是,我发现,通过添加if语句if(I<2){I++;}.命中确实出现,但看起来是随机的(即使只有一次碰撞,也会出现多个命中。在所有3个项目都玩过之后,连续出现)再次感谢。@user2075625我认为发生迁移警告是因为我将事件侦听器命名为OnInterFrame,并且在Actionscript 2.0中有一个名为OnInterFrame的内置函数。我更新了代码示例,以便侦听器具有不同的名称。我认为问题在于,我没有提到3个数组项中的每一个都具有相同的名称这是独特的经典tween。You's方法确实有效,但仅当测试特定MC(例如objectCar)时,它现在意味着它在MC经过目标时跟踪每次刷新的命中率。非常抱歉出现任何混淆!