gpt4 book ai didi

flash - 优化 Actionscript 3 中的碰撞检测。

转载 作者:行者123 更新时间:2023-12-04 06:10:01 25 4
gpt4 key购买 nike

我正在尝试在 Actionscript 3 中制作我的第一款游戏。它是一个简单的火炮游戏,你在左下角有一把枪,AI 飞过屏幕,你必须将其击落。现在,在分类射击游戏中,这是通过从枪中发射子弹并使用 AI 影片剪辑对该子弹进行 HitTest 或简单地移除(或播放死亡动画)AI 影片剪辑来实现的。但问题就在这里。我不想做任何一个。我想展示一把射速很快的枪,因此没有子弹。而且我也不希望玩家完全点击 AI 影片剪辑来摧毁它们(只要枪/炮塔指向正确的方向就足够了)。所以这就是我尝试过的。

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

image

  • 尝试将“线”连接到炮塔并检查与 AI 剪辑的碰撞。由于线倾斜时的边界框问题,这显然失败了。
  • 我尝试将多个小电影剪辑放在线上,并在循环中遍历它们并检查是否与 AI 发生任何碰撞。这种方法部分奏效,但速度太慢,而且似乎不是“正确”的方法。
  • 我画了两条假设线。 p1 和 p2 之间以及其他连接 p3 和 p4 之间的一个(请参见上图)。 p3----p4 的 lenght = AI.width 是一条穿过 AI MovieClip 中心的水平线。在鼠标单击时,我检查这两条线之间是否有任何交点。现在,如果我在屏幕上有多个 AI,我再次需要遍历它们中的每一个,绘制一个新的 p3-----p4 并检查与 p1-----p2​​ 的交集。

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

    shipGame.as
    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;
    }
    }
    }
    }

    基础人工智能
    var main:shipGame;
    var myy:Number;
    var myy:Number;
    public function BaseAI(doc:shipGame):void{
    main = doc;
    basicAI = new BasicAI(); // BasicAI is a movieClip in the library
    main.addChild(basicAI);
    basicAI.x = 400;
    basicAI.y = Math.abs(Math.random() * (280)) + 20;
    myy = basicAI.y;
    basicAI.addEventListener(Event.ENTER_FRAME, keepMoving);
    }

    public function keepMoving(evt:Event):void {
    basicAI.x -= 5;
    myx = basicAI.x;

    if (shot && alive) {
    alive = false;
    basicAI.gotoAndPlay(2);
    }
    }

    最佳答案

    您当前的所有方法基本上都依赖于 Flash 的渲染器来了解船只和子弹线的位置。但是在您的情况下,由于您在移动部件之间具有相对简单的几何关系,因此分析处理问题会快得多。

    考虑这样一种情况,一艘船正好坐在你的枪的火线上。在这种情况下,枪、船和屏幕底部形成一个直角三角形。如果我们定义 theta是枪和屏幕底部之间的角度,那么以下将成立:

    tangent(theta) = ship.y / ship.x

    哪里 xy从枪向右和向上测量。现在您可以概括这一点并将其用于您的 HitTest 。开枪的时候先找 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
    }
    }

    这只是伪代码,但希望你能明白。无论如何,这就是我要做的 - 这将比您使用真正的 HitTest 所做的任何事情都快得多,并且对于所描述的情况,它应该也能正常工作。

    关于flash - 优化 Actionscript 3 中的碰撞检测。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7885705/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com