如果这是一个非常明显的问题,请道歉。
我想在迷你游戏中添加一个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++;
}
答案 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和当前播放的障碍物之间的每一帧执行一次命中测试。
关于词汇量的说明:
修改
关于您在评论中提到的错误,我之前的例子是错误的。我指的是当前播放的索引为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)
您创建的第一个计时器仅持续一秒钟。这意味着您只能在障碍物开始播放之前有效地检查一次碰撞。 因此,当你的障碍正在播放时,第一个计时器处理程序没有被调用。您可以跟踪以验证这一点。