【问题标题】:How to hittest for all instances of a movieclip - ACTIONSCRIPT 2如何对影片剪辑的所有实例进行命中测试 - ACTIONSCRIPT 2
【发布时间】:2012-02-18 14:31:21
【问题描述】:

我正在制作一个塔防游戏,并且已经达到了我的塔以适当的间隔发射子弹的地步。但我需要能够删除影片剪辑。例如,如果一座塔发射了一颗子弹,它会制作一个子弹动画剪辑的副本,该动画剪辑的目标是特定敌人的副本。但是,我无法弄清楚如何配置 hitTest。有什么方法可以让 hittest 检查从特定对象复制的所有子影片剪辑?

编辑:我添加了这个功能,即每秒执行一次。但由于某种原因,它并没有确认点击量。

function checkHits(){//checks for hits between enemies and bullets
for (var zz = 0; zz < bulletArray.length; zz += 1)//checks for each bullet
{
    for(var yy=0;yy<enemiesArray.length;yy+=1){//checks for each enemy
        trace("enemies loc"+yy+":"+enemiesArray[yy]);
        trace("bullet loc"+zz+":"+bulletArray[zz]);
        if(bulletArray[zz].hitTest(enemiesArray[yy])){
            trace("HIT!");
           removeMovieClip(bulletArray[zz]);
           removeMovieClip(enemiesArray[yy]);
           bulletArray.splice(zz,1);
           bulletArray.splice(yy,1);
           }//end if
    }//end for
}//end for

}

function dupeCircle()
{
//trace("Dupe circle initiated");
duplicateMovieClip(circlebase, "_root.circle" + circleCount, circleCount);
bulletArray.push("circle" + circleCount);
trace(bulletArray[0]._width);
circleCount += 1;
}

这是添加圆圈的对象的代码。

【问题讨论】:

    标签: flash actionscript actionscript-2 hittest


    【解决方案1】:

    您可以保留一个数组,其中包含您要测试的所有影片剪辑,然后遍历该数组并检查每个。因此,每当您将一个添加到屏幕时,将其添加到该数组中。然后,当您要测试时,请测试该阵列中的每个人。如果要删除它,请将其从阵列和屏幕中删除。

    编辑

    这是我在这种情况下的想法......

    function dupeCircle() 
    {    
        //trace("Dupe circle initiated"); 
        bulletArray.push(duplicateMovieClip(circlebase, "_root.circle" + circleCount, circleCount));
        circleCount += 1; 
     }
    

    基本上只需将实际的影片剪辑存储在数组中,然后您就可以使用bulletArray[index].hitTest 执行您尝试执行的操作,它应该可以正常工作。 (在为另一个数组存储实际影片剪辑的地方也做同样的事情)

    【讨论】:

    • 我想到了,但我该如何管理何时检查呢?如果屏幕上有 30 个敌人和 30 颗子弹,每个实例是否应该不断检查?或者是为每个子弹和每个敌人建立一个堆叠的“每个”数组的更好方法,它贯穿所有这些;并且每秒检查一次?
    • 嗯,您可以使用许多不同的方法来进行检查。我在制作游戏时喜欢做的一件事是创建一个“主循环”,因为我习惯了 C++ 并且总是有一个主循环。我不知道这是否是在 Flash 中执行此操作的最佳方式,但我就是这样做的,并且没有遇到任何问题。我认为计时器是实现这个循环的好方法。您添加的代码看起来是正确的想法。不知道为什么打不着。尝试将代码发布到调用该函数的位置(事件侦听器部分)以及将敌人和子弹添加到数组的位置。
    • 我已经检查并通过故障排除发现它可以识别阵列中的对象。例如,我可以使用 removeMovieClip(enemiesArray[yy]) 让敌人离开舞台,但我无法访问影片剪辑上的任何方法或属性。我认为这是我的问题,因为我在影片剪辑上使用了 hitTest 函数。是否有某些原因我无法访问这些属性?编辑:它们都出现未定义
    • 不管怎样,checkHits 功能设置为每帧都关闭
    • 好吧,如果所有属性都为 NULL,那肯定是不对的...发布将代码添加到数组的位置
    【解决方案2】:

    您正在从 bulletArray 中删除 2 次:

           bulletArray.splice(zz,1);
           bulletArray.splice(yy,1);
    

    我猜最后一个应该是清除敌人。当您稍后尝试移除已经从舞台上移除的敌人时,这可能会引发错误?

    【讨论】:

    • 如果我先拼接,那么当我尝试移除时,它会移除错误的对象,我相信
    • 我的意思是你移除了 2 次子弹并且你没有从敌人阵列中移除敌人。最后一行不应该是enemyArray.splice(yy,1) 而不是bulletArray.splice(yy,1);?
    • 谢谢。我错过了,但我不认为这是导致问题的原因。
    • 是的,这种情况实际上是不可能的,因为如果将其从舞台上移除,它不会对任何东西产生影响。那时不知道:/
    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2017-06-24
    • 2016-01-15
    • 2014-09-19
    • 2012-02-04
    • 2012-02-20
    相关资源
    最近更新 更多