大家好,我遇到了一个问题:
我有一个2D游戏(自上而下),我想让角色从镜头中逃脱,但不仅仅是离开镜头(我的意思是,不要被镜头推动),我想要它具有良好的躲避技巧。
变量是:
我可以理解以下语言:
我有这个代码(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;
}
答案 0 :(得分:2)
一些观察结果:
两个向量(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))
较大的矢量组件将向您显示总体方向 -
我想你应该能够自己想出其余的东西 - 否则,祝你写好自己的游戏好运!
答案 1 :(得分:0)
我没有关注行
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方向跳跃,要么向-jJump方向跳跃。要知道哪个,请使用vJump的标量积(shotSpeedY,shotSpeedX)。如果这是积极的,那么角色就会向子弹跳跃,这显然是你不想要的,所以在这种情况下要反转vJump的两个组成部分的符号。
跳转到最接近vJump的允许方向。在你列出的代码中,你被限制在一个对角线方向上跳跃 - 你永远不会跳进其中一个基本方向。事实上,这可能是数学上最优的解决方案,因为对角线跳跃可能比基数跳跃长1.414倍。
如果您的跳跃实际上是相等的距离,或者如果您不喜欢角色总是沿对角线跳跃的样子,您可以通过计算vJump和之间的标量积来测试八个基本和中间方向中的每一个。八个方向向量(0,1),(0.7071,0.7071),(1,0),(0.7071,-0.7071)等中的每一个。采取给你最大的正标量积的方向。鉴于存在的模式,通过一些巧妙的编程,您可以在少于八次测试中完成此操作。
请注意,此算法避免了任何比加法和乘法更复杂的数学运算,因此可能比需要触发函数的数据具有更好的性能。