Actionscript 3 如何在计时器类中添加hitTestObject语句?
如果这是一个非常明显的问题,请道歉 我想在迷你游戏中添加一个hitTestObject if循环。 障碍物是一个阵列中的3个项目,所有3个都是连续播放的电影片段,计时器类延迟为1秒。 然而,由于循环(我假设)hitTestObject if语句没有返回跟踪“hit”或任何错误,我应该如何解决这个问题 提前谢谢你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
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和当前播放的障碍物之间的每一帧执行一次命中测试
关于你的词汇的注释:
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经过目标时跟踪每次刷新的命中率。非常抱歉出现任何混淆!