让角色从镜头中逃脱

时间:2010-03-25 14:49:54

标签: math actionscript

大家好,我遇到了一个问题:

我有一个2D游戏(自上而下),我想让角色从镜头中逃脱,但不仅仅是离开镜头(我的意思是,不要被镜头推动),我想要它具有良好的躲避技巧。

变量是:

  • shotX - 拍摄x位置
  • shotY - 拍摄y位置
  • shotSpeedX - 拍摄x速度
  • shotSpeedY - 拍摄x速度
  • charX - 字符x位置
  • charY - character y position
  • keyLeft - 设置为true以使角色按下左侧键
  • keyRight - 设置为true以使角色按向右键
  • keyUp - 设置为true以使角色按下向上键
  • keyDown - 设置为true以使角色按下向下键

我可以理解以下语言:

  • C / C ++
  • 爪哇
  • Actionscript 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;
}

2 个答案:

答案 0 :(得分:2)

一些观察结果:

  • 最佳躲避可能涉及从子弹方向以90度角移动。这样,你就可以最快地摆脱伤害。
  • 如果你做错了,你想向子弹的方向犯错,因为这会给你带来时间。
  • 您可以使用标量积计算子弹方向90度
  • 找到最接近计算最佳角度的罗盘方向(4个可能的答案)
    • 你被允许同时上去和离开吗?现在你有8个可能的子弹答案
  • 根据第二点在最佳方向躲避的奖励积分

两个向量(ax,ay)和(bx,by)的标量乘积是ax * bx + ay *。如果它们是正交的(90度),则为0。所以,给定子弹(ax,ay),找到一个方向(bx,by)来运行,其标量乘积为0:

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

现在找到罗盘上最近的点(bx,by),你想要跑的方向。你可以从SO的答案中找出我的问题的答案:How to "snap" a directional (2D) vector to a compass (N, NE, E, SE, S, SW, W, NW)?(请注意,我在那里使用了一个不稳定的坐标系......)

如果您只有4个罗盘方向,最简单的方法是:

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

较大的矢量组件将向您显示总体方向 -

  • bx positive:right
  • bx negative:left
  • by positive:up(除非(0,0)左上角,左下角为y;)
  • by negative:down

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

答案 1 :(得分:0)

我没有关注行

var angle: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方向跳跃,要么向-jJump方向跳跃。要知道哪个,请使用vJump的标量积(shotSpeedY,shotSpeedX)。如果这是积极的,那么角色就会向子弹跳跃,这显然是你不想要的,所以在这种情况下要反转vJump的两个组成部分的符号。

  3. 跳转到最接近vJump的允许方向。在你列出的代码中,你被限制在一个对角线方向上跳跃 - 你永远不会跳进其中一个基本方向。事实上,这可能是数学上最优的解决方案,因为对角线跳跃可能比基数跳跃长1.414倍。

  4. 如果您的跳跃实际上是相等的距离,或者如果您不喜欢角色总是沿对角线跳跃的样子,您可以通过计算vJump和之间的标量积来测试八个基本和中间方向中的每一个。八个方向向量(0,1),(0.7071,0.7071),(1,0),(0.7071,-0.7071)等中的每一个。采取给你最大的正标量积的方向。鉴于存在的模式,通过一些巧妙的编程,您可以在少于八次测试中完成此操作。

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