使角色从镜头中逃脱
Posted
技术标签:
【中文标题】使角色从镜头中逃脱【英文标题】:Make character escape from shot 【发布时间】:2010-03-25 14:49:53 【问题描述】:各位数学高手大家好,我有一个问题要找你们:
我有一个 2D 游戏(自上而下),我想让角色从镜头中逃脱,但不只是离开镜头(我的意思是,不要被镜头推动),我想要它有一个很好的闪避技能。
变量是:
shotX - 拍摄 x 位置 shotY - 拍摄 y 位置 shotSpeedX - 射门 x 速度 shotSpeedY - 射门 x 速度 charX - 字符 x 位置 charY - 字符 y 位置 keyLeft - 设置为 true 使角色按下向左键 keyRight - 设置为 true 使角色按下向右键 keyUp - 设置为 true 使角色按下向上键 keyDown - 设置为 true 使角色按下向下键我能听懂以下语言:
C/C++ Java 动作脚本 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;
【问题讨论】:
什么?他们是math masters
,而不是mind readers
...
您应该对您使用的语言和图形包有所了解,否则我们将无法为您提供太多帮助。您能否添加更多背景信息?你已经在这个游戏上做了哪些工作?你真的想根据一些随机的 SO 用户告诉你的关于移动一个图形相对于另一个图形的内容为整个游戏选择一种编程语言吗?
我用的是Actionscript 3,图形不用考虑,你有x和y位置,镜头太小不用考虑。
【参考方案1】:
一些观察:
最佳躲避可能涉及从子弹方向以 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) 的最近点,即您想跑到的方向。您可能可以从我在 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 阳性:正确 bx 负:左 按正数:向上(除非 (0, 0) 位于左上角,y 位于左下角...) 否定:向下我想你应该能够自己想出其余的 - 否则,祝你编写自己的游戏好运!
【讨论】:
你应该用编程语言写第一个例子>_>【参考方案2】:我没有遵循什么路线
var angle:Number = Math.atan2(charY - (shotY + shotSpeedY), charX - (shotX + shotSpeedX));
应该是这样做的。向量 ( charY - shotY, charX - shotX ) 将是从镜头位置指向角色位置的半径向量。但是,当您从其中减去速度向量时,您会得到什么,就像您在这一行中所做的那样?
在我看来,你需要做的是:
计算半径矢量 (rY, rX) 其中 rY = shotY - charY; rX = xhotX - charX
如果角色没有被限制在罗盘点,则计算最佳的跳跃方向。 从从镜头特征半径矢量旋转 90 度的矢量开始。说 vJump = ( rX, -rY )。 (我认为达伦的计算略有错误——你正在调换两个坐标,并反转它们的一个符号。) 角色要么想朝 vJump 的方向跳跃,要么朝 -vJump 的方向跳跃。要知道哪个,请使用 (shotSpeedY, shotSpeedX) 获取 vJump 的标量积。如果这是肯定的,那么角色会跳向子弹,这显然是你不想要的,所以在这种情况下,颠倒 vJump 的两个组件的符号。
在最接近 vJump 的允许方向上跳跃。在您列出的代码中,您被限制在对角线方向之一上跳跃——您永远不会在主要方向之一上跳跃。这实际上可能是数学上的最优解,因为对角线跳跃可能比基数跳跃长 1.414 倍。
但是,如果您的跳跃距离实际上是相等的,或者如果您只是不喜欢角色总是沿对角线跳跃时的样子,您可以通过计算 vJump 和八个方向向量中的每一个 (0,1)、(0.7071,0.7071)、(1,0)、(0.7071,-0.7071) 等。取给您最大正标量积的方向。鉴于目前的模式,通过一些巧妙的编程,您可以在不到 8 次测试中做到这一点。
请注意,此算法避免了任何比加法和乘法更复杂的数学运算,因此可能比需要三角函数的算法具有更好的性能。
【讨论】:
那条线考虑镜头在下一帧的位置:)以上是关于使角色从镜头中逃脱的主要内容,如果未能解决你的问题,请参考以下文章
[Unity3D] 多人游戏中镜头固定角度、随角色移动的实现方式