Math 使角色从镜头中逃脱

Math 使角色从镜头中逃脱,math,actionscript,Math,Actionscript,大家好,数学大师们,我有个问题要问你们: 我有一个2D游戏(自上而下),我想让角色逃离镜头,但不只是离开镜头(我的意思是,不要被镜头推),我希望它有良好的躲避技能 变量包括: shotX-shotX位置 shotY-shot-y位置 shotSpeedX-shot x速度 快拍-快拍x速度 字符x位置 charY-字符y位置 keyLeft-设置为true可使角色按向左键 keyRight-设置为true可使角色按向右键 keyUp-设置为true可使角色按向上键 keyDown-设置为tru

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

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

变量包括:

  • shotX-shotX位置
  • shotY-shot-y位置
  • shotSpeedX-shot x速度
  • 快拍-快拍x速度
  • 字符x位置
  • charY-字符y位置
  • keyLeft-设置为true可使角色按向左键
  • keyRight-设置为true可使角色按向右键
  • keyUp-设置为true可使角色按向上键
  • keyDown-设置为true以使角色按下向下键
我能听懂以下语言:

  • 信用证++
  • 爪哇
  • 动作脚本2/3
  • Javascript
我得到了这段代码(Actionscript 3),但有时它不起作用:

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;
}
var escapeToLeft:Boolean=false;
变量r:Number=Math.atan2(0-shotSpeedY,0-shotSpeedX)
变量角度:数值=数学atan2(charY-(shotY+shotSpeedY),charX-(shotX+shotSpeedX));
变量b:Number=diepix.fixRotation(r角);//此函数使数字介于-180和180之间
如果(b某些观察结果:

  • 最佳闪避可能包括与子弹方向成90度角移动。这样,你可以最快地摆脱伤害
  • 如果你真的犯了错误,你就要朝着子弹的方向犯错误,因为这会为你赢得时间
  • 可以使用标量积计算子弹方向的90度角
  • 找到最接近计算出的最佳角度的罗盘方向(4个可能的答案)
    • 你可以同时上去和离开吗?现在你有了8个可能的答案
  • 根据第二点在最佳方向闪避的奖励点数
两个向量(ax,ay)和(bx,by)的标量积是ax*bx+ay*by。如果它们正交(90度),则为0。因此,给定项目符号(ax,ay),找到标量积为0的运行方向(bx,by):

ax * bx must equal ay * by, so  (bx, by) = (-ax, -ay)
现在找到指南针上最接近的点(bx,by),你想跑的方向。你可能可以从我的问题的答案中找到技术,所以:(注意,thow,我在那里使用了一个不可靠的坐标系…)

如果您只有4个指南针方向,最简单的路径是:

 max(abs(bx), abs(by))
较大的向量分量将向您显示大致的方向

  • bx阳性:对
  • bx负片:左
  • 按正:向上(除非(0,0)在左上角,y在左下角为正…)
  • 按负数:向下

我想你应该能自己想出其余的,否则,祝你好运,写你自己的游戏吧!

我没听懂你的意思

变量角度:数值=数学atan2(charY-(shotY+shotSpeedY),charX-(shotX+shotSpeedX))

向量(charY-shotY,charX-shotX)将是从快照位置指向角色位置的半径向量。但是当你从中减去一个速度向量时,你得到了什么,就像你在这一行中做的那样

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

  • 计算半径向量(rY,rX),其中rY=shotY-charY;rX=xhotX-charX

  • 如果角色不受罗盘点约束,则计算最佳跳跃方向。 从一个与镜头角色半径向量旋转90度的向量开始。假设vJump=(rX,-rY)。(我认为Daren的计算有点错误——你正在转换两个坐标,并反转其中一个符号。) 角色应该想跳转到vJump的方向或-vJump的方向。要知道是哪个方向,请使用(shotSpeedY,shotSpeedX)获取vJump的标量积.如果这是肯定的,那么角色正朝着子弹跳去,这显然是你不想要的,所以在本例中,将vJump的两个分量的符号颠倒过来

  • 在最接近vJump的允许方向上跳转。在您列出的代码中,您被限制在一个对角线方向上跳转——您永远不会在一个基数方向上跳转。这实际上可能是数学上的最佳解决方案,因为对角线跳转可能比基数跳转长一倍为1.414

  • 但是,如果您的跳跃距离实际上相等,或者如果您不喜欢角色始终沿对角线跳跃的样子,则可以通过计算vJump与八个方向向量(0,1)、(0.7071,0.7071)、(1,0)、(0.7071,-0.7071)之间的标量积来测试八个基本方向和中间方向中的每一个,等等。选择给您提供最大正标量积的方向。给定当前的模式,通过一些巧妙的编程,您可以在不到八个测试中完成这项工作


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

    什么?他们是
    数学大师
    ,而不是
    读心术者
    …你应该知道你使用的是什么语言和图形包,否则我们就不需要了e能够给你很多帮助。你能添加更多的背景信息吗?你在这个游戏上做了哪些工作?你真的想根据一些随机用户告诉你的关于移动一个图形相对于另一个图形的内容来选择整个游戏的编程语言吗?我使用的是Actionscript 3,图形不应该被考虑在内,你必须X和Y位置,镜头太小,不需要考虑。你应该用编程语言写第一个例子> >这条线考虑下一帧的投篮位置。