代码之家  ›  专栏  ›  技术社区  ›  user216441

使角色从镜头转义

  •  0
  • user216441  · 技术社区  · 14 年前

    大家好,我有个问题要问你们:

    我有一个2d游戏(自上而下),我想让角色从一个镜头中逃脱,但不只是离开镜头(我的意思是,不要被镜头推),我希望它有一个很好的躲闪技能。

    变量包括:

    • shot x-shotx位置
    • shot y-shot y位置
    • shot speed x-射击x速度
    • ShotSpeedy-射击X速度
    • 字符x位置
    • 小心-角色Y位置
    • key left-设置为true使字符按向左键
    • key right-设置为true使字符按向右键
    • key up-设置为true使字符按to up键
    • key down-设置为true使字符按down键

    我能懂下列语言:

    • C/C++
    • 爪哇
    • 动作脚本2/3
    • JavaScript

    我有这段代码(ActionScript3),但有时不起作用:

    var escapeToLeft:Boolean = false;
    var r:Number = Math.atan2(0 - shotSpeedY, 0 - shotSpeedX)
    var angle:Number = Math.atan2(charY - (shotY + shotSpeedY), charX - (shotX + shotSpeedX));
    var b:Number = diepix.fixRotation(r-angle); // This function make the number between -180 and 180
    if(b<0) {
     escapeToLeft = true;
    }
    r += (escapeToLeft?1:0 - 1) * Math.PI / 2;
    var cx:Number = Math.cos(r);
    var cy:Number = Math.sin(r);
    if(cx < 0.0) {
     keyLeft = true;
    }else {
     keyRight = true;
    }
    if(cy < 0.0) {
     keyUp = true;
    }else {
     keyDown = true;
    }
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Community Dunja Lalic    7 年前

    一些观察:

    • 最佳躲闪可能涉及到与子弹方向成90度角的移动。这样,你就可以最快地摆脱伤害。
    • 如果你真的犯错了,你就要朝着子弹的方向犯错,因为这会为你赢得时间。
    • 你可以用标量积计算与子弹方向成90度
    • 找到最接近计算出的最佳角度的罗盘方向(4个可能的答案)
      • 你可以同时上下吗?现在你有8个可能的子弹答案
    • 根据第二点在最佳方向闪避的加分

    两个向量(ax,ay)和(bx,by)的标量积是ax*bx+ay*by。如果它们是正交的(90度),则为0。因此,给定项目符号(ax,ay),找到一个方向(bx,by)来运行,该方向的标量积为0:

    ax * bx must equal ay * by, so  (bx, by) = (-ax, -ay)
    

    现在要找到指南针上最接近的点(BX,BY),您要运行到的方向。你也许可以从我的一个问题的答案中找到技巧,所以: How to "snap" a directional (2D) vector to a compass (N, NE, E, SE, S, SW, W, NW)? (注意,thow,我在用一个不稳定的坐标系…)

    如果你只有4个指南针方向,最简单的方法是:

     max(abs(bx), abs(by))
    

    更大的矢量分量会告诉你大致的方向。

    • BX阳性:对
    • BX阴性:左
    • 按正数:向上(除非(0,0)在左上,Y在左下…)
    • 按负数:向下

    我想你应该可以自己想出剩下的-否则,祝你自己写游戏好运!

        2
  •  0
  •   Dan Menes    14 年前

    我不是在听什么

    var角度:number=math.atan2(chary-(shoty+shotspeedy),charx-(shotx+shotspeedx));

    是应该做的。向量(chary-shoty,charx-shotx)是从镜头位置指向角色位置的半径向量。但是当你从中减去一个速度向量,就像你在这条直线上做的那样,你得到了什么?

    在我看来,你需要做的是:

    1. 计算半径向量(ry,rx),其中ry=shoty-chary;rx=xhotx-charx

    2. 如果角色不受指南针点的约束,则计算最佳跳跃方向。 从一个从镜头角色半径向量旋转90度的向量开始。说vjump=(rx,-ry)。(我认为达伦的计算有点错误——你正在调换两个坐标,并反转其中一个符号。) 角色应该希望跳转到vjump方向或-vjump方向。要知道哪一个,请使用vjump的标量积(shotspeedy,shotspeedx)。如果这是肯定的,那么角色就朝着子弹跳去,这显然是你不想要的,所以在本例中,将vjump的两个组件的符号颠倒过来。

    3. 以最接近vjump的允许方向跳跃。在您所列出的代码中,您被约束为跳转到一个对角线方向——您永远不会跳转到一个基数方向。这实际上可能是数学上的最优解,因为对角线跳跃可能比基数跳跃长1.414倍。

    如果你的跳跃实际上是相等的距离,但是,如果你只是不喜欢它看起来如果字符总是对角线跳跃,你可以通过计算vjump和八个方向向量(0,1),(0)之间的标量积来测试八个基本方向和中间方向中的每一个。7071,0.7071),(1,0),(0.7071,-0.7071)等。沿着给出最大正标量积的方向。考虑到目前的模式,通过一些聪明的编程,您可以在不到8个测试中完成这项工作。

    请注意,该算法避免了任何比加法和乘法更复杂的数学运算,因此可能比需要trig函数的函数有更好的性能。