Flash 在Actionscript 3中优化碰撞检测。

Flash 在Actionscript 3中优化碰撞检测。,flash,actionscript-3,collision-detection,Flash,Actionscript 3,Collision Detection,我正试图在ActionScript3中制作我的第一个游戏。这是一个简单的炮兵游戏,你在左下角有一把枪,AIs在屏幕上飞过,你必须击落它。现在,在一个分级射击游戏中,这是如何实现的,要么是从枪中发射一颗子弹,然后用AI movieClip对该子弹进行命中测试,要么就是简单地移除(或播放死亡动画)AI movieClip。但问题是。我两个都不想做。我想展示一支射速很快的枪,因此没有子弹。我也不希望玩家点击AI电影剪辑来摧毁它们(只要枪/炮塔指向正确的方向就足够了)。这就是我试过的 这张图片应该有助于

我正试图在ActionScript3中制作我的第一个游戏。这是一个简单的炮兵游戏,你在左下角有一把枪,AIs在屏幕上飞过,你必须击落它。现在,在一个分级射击游戏中,这是如何实现的,要么是从枪中发射一颗子弹,然后用AI movieClip对该子弹进行命中测试,要么就是简单地移除(或播放死亡动画)AI movieClip。但问题是。我两个都不想做。我想展示一支射速很快的枪,因此没有子弹。我也不希望玩家点击AI电影剪辑来摧毁它们(只要枪/炮塔指向正确的方向就足够了)。这就是我试过的

这张图片应该有助于描绘整个事情

  • 尝试将“线”连接到炮塔,并检查是否与AI剪辑发生碰撞。这显然失败了,因为直线倾斜时存在边界框问题

  • 我试着把多个微小的movieClips放在一条线上,在循环中遍历它们,并检查是否与AI发生冲突。这种方法部分有效,但速度太慢,似乎不是“正确”的方法

  • 我画了两条假设线。一个在p1和p2之间,另一个连接p3和p4(请参见上图)。p3---p4的长度=AI.width,是一条穿过AI电影剪辑中心的水平线。鼠标单击后,我检查这两条线之间的任何交点。现在如果我在屏幕上有多个AI,我需要再次遍历它们,画一个新的p3---p4,并检查与p1---p2的交点

  • 我现在正在使用方法3,我有一种感觉,一旦我开始在游戏中添加更多内容,帧速率就会受到影响。我相信应该有一种更简单/优化的方法来实现这一点(也许是非常简单的方法)。附上一些相关代码

    船上游戏

    var baseAI:BaseAI;
    var AIList:Array= new Array;
    public function shipGame():void{
                trace("still connected!!");
                /*
                irrelevant code..
                */
                stage.addEventListener(Event.ENTER_FRAME, updateGame);
                var a:MovieClip = new MovieClip;
                aiTimer = setInterval(StartAI, 2000);
    }
    public function StartAI():void {
                baseAI = new BaseAI(this);
                AIList.push(baseAI);
    }
    
    public function updateGame(event:Event):void    {
                /*
                code to rotate the turret here..
                */
    
                for (var i:int = 0; i < AIList.length; i++) 
                {
                    if (AIList[i].myx < 100) {
                        AIList[i].basicAI.parent.removeChild(AIList[i].basicAI);
                        AIList.splice(i, 1);
                    }
                }
    
                if (mouseDn) {
                    basicTurret.gotoAndPlay(2);// Fire animation
                    for (var j:int = 0; j < AIList.length; j++) 
                    {
                        if ( intersection(AIList[j])) // intersection(bai:BaseAI) returns boolean. Works fine. 
                        {
                            AIList[j].shot = true;
                        }
                    }
                }
    }
    

    所有当前的方法基本上都依赖于Flash的渲染器来知道舰船和子弹线的位置。但是在你的例子中,因为你在运动部件之间有一个相对简单的几何关系,用解析的方法处理这个问题会快得多

    考虑一下这样的情况,一艘船正好停在你的枪口上。在这种情况下,枪、船和屏幕底部形成一个直角三角形。如果我们将
    theta
    定义为枪与屏幕底部之间的角度,则以下内容适用:

    tangent(theta) = ship.y / ship.x
    
    其中,
    x
    y
    从枪的右侧和上方测量。现在,您可以对其进行概括,并将其用于命中测试。当枪开火时,首先找到
    theta
    。然后,对于每艘飞船,您可以通过如下操作轻松确定飞船与火线的垂直或水平距离:

    var theta = /*determine theta based on where the mouse was clicked*/
    var tanTheta = tangent(theta);
    for each (ship) {
        var gunX = ship.y / tanTheta;
        if ( abs(gunX - ship.x) < ship.width/2 ) {
            // a hit occurred
        }
    }
    
    var theta=/*根据鼠标单击的位置确定θ*/
    var tanTheta=切线(θ);
    每艘(船){
    var gunX=船舶y/tanTheta;
    如果(abs(gunX-ship.x)
    这只是伪代码,希望你能理解。不管怎样,这就是我要做的——这将比使用真实命中测试进行的任何操作都要快得多,而且对于所描述的情况,它也应该工作得很好

    var theta = /*determine theta based on where the mouse was clicked*/
    var tanTheta = tangent(theta);
    for each (ship) {
        var gunX = ship.y / tanTheta;
        if ( abs(gunX - ship.x) < ship.width/2 ) {
            // a hit occurred
        }
    }