当前位置: 首页 > 知识库问答 >
问题:

8个方向在各个方向的一致运动速度,如何从方向键获得运动角度?

慕容烨
2023-03-14

早晨的最高峰是地球表面的人们。

问题是:如何从箭头键获得方向角。

前言:在基本的自上而下游戏中移动的标准方法是根据方向从更新方法中添加x和/或y。

if (moveUp)     playerY -= delta * speed;
if (moveDown)   playerY += delta * speed;
if (moveLeft)   playerX -= delta * speed;
if (moveRight)  playerX += delta * speed;

这是优雅的四个方向的运动(我相信),因为无论什么组合键按下,运动的方向将是一致的。上下向左按会向左移动,因为上下抵消。但是当沿着对角线移动时,台阶会太大。如果速度为20,向左移动将每秒向左移动20,向上移动将每秒向上移动20。但向上向左移动将以每秒28.24多一点的速度移动。

这里的解决方案是使用cos和sin来得到新的x和y,一旦你知道了角度,这就很容易了:

playerX += Math.cos(Math.toRadians(angle)) * delta * speed;
playerY -= Math.sin(Math.toRadians(angle)) * delta * speed; //y is inverted

但是,至少对我来说,这提出了一个新问题:角度是什么?在我的KeyListener中,我正在为每个箭头键设置/清除布尔值。我可以使用大量的if语句:

if (moveUp)     angle = 90;
if (moveDown)   angle = 270;
if (moveRight)  angle = 0;
if (moveLeft)   angle = 180;
if (moveUp && moveLeft)     angle = 135;
if (moveUp && moveRight)    angle = 45;
if (moveDown && moveLeft)   angle = 225;
if (moveDown && moveRight)  angle = 315;
//...etc... for all combinations

就我的一生而言,我找不到一种性感的方式来获得按下方向键的运动角度。我觉得这应该是一个常见的问题,游戏设计101,但激烈的谷歌搜索并没有让我找到任何东西(因为很难用语言来表达这个问题,这让我更加困难)。在所有例子中,它们要么只是保留了对角线更快的功能(就像我的第一个代码片段),要么提前知道角度(即朝鼠标移动),要么是2D侧滚动条。

肯定有一个性感的数学方法(或者别的什么)可以用几句话来表达吗?还是我完全错了?

编辑:后回答代码(如下所示):

double x=0, y=0;
if (moveLeft) x -= 1;
if (moveRight) x += 1;
if (moveUp) y -= 1;
if (moveDown) y += 1;

double length = Math.sqrt(x * x + y * y);
if (length != 0) {
    x /= length;
    y /= length;

    x *= delta*speed;
    y *= delta*speed;

    playerX += x;
    playerY += y;
}

共有1个答案

田佐
2023-03-14

使用二维向量。比如:

movement = new Vector2D();

if (moveLeft) movement.x += 1;
if (moveRight) movement.x -= 1;
if (moveUp) movement.y -= 1;
if (moveDown) movement.y += 1;

movement.normalize();   // Caps the movement vector at a length of one, even when it's at an odd angle
movement *= desiredMovementSpeed * frameDeltaTime;  // Plug in suitable values here
// FIXME: Do some collision detection here, probably
playerX += movement.x;
playerY += movement.y;

我想有一个适合你的2D向量类。否则,规范化向量就像将其所有分量除以其长度一样简单,例如:

length = sqrt(this.x * this.x + this.y * this.y);
this.x /= length;
this.y /= length;
 类似资料:
  • 节点(汽车)撞上“加速”型障碍物后,应该加速。相反,它变慢并开始偏离直线运动。我检查了代码是否正确执行,我假设问题是节点的坐标系或类似性质的东西。 所以汽车的x分量确实增加了,但不会导致他向所需的方向移动。就像我说的,世界上的X光确实指向了我希望汽车继续行驶的方向。在增加速度之前,汽车也在向正确的方向移动。 我想明白为什么增加汽车的速度会减慢它的速度,为什么有时会使它稍微向右/向左移动,就好像速度

  • 问题内容: 是否有一种相对简单的旋转SKSpriteNode的方法,使其始终面对其移动方向?我班的Gamecene有一个带有相对物理实体的对象系统,它们在碰撞时会相互施加脉冲。这使得很难准确地跟踪对象的移动方向。某些对象的形状也不规则,这会使事情更加混乱。我尝试使用三角函数(例如反正切),但是它仅在非常特殊的情况下可以正常使用。可能有一种方法可以找出SKSpriteNode轨迹的角度,以便可以将对

  • 以下是您将看到的一些方法的快速描述: > :返回船的边界(一个矩形) :返回表示船边界中心的Vector2d。 :一个,它表示船的速度(每帧添加到位置) :一个新的,当给定一个角度(以弧度为单位)时,将其标准化 :不是线性插值!如果你想看代码,这里是(在类中): 当玩家没有按键时,飞船应该减速。以下是我为此所做的: 然而,现在我意识到我希望它在向目标移动时漂移。我试过这个: 这当然不会真的达到零速

  • 我开始使用动画js,我想在我的Angular应用程序中包含一个动画。 在尝试这样做时,我发现当放置动画的< code>div依赖于指令< code>ngIf时,动画不起作用。当ngIf中的条件为真时,图像正确加载,但它没有动画。删除指令解决了这个问题,但我想有条件地展示它。 JS: CSS: HTML工作正常: 超文本标记语言没有动画: HTML也不工作: 我应该做些什么来使动画符合Angular

  • 问题内容: 无论当前屏幕的方向(横向或纵向)如何,我都希望获得当前的磁方向。 我找到了这个例子,但它不是方向独立的,对不对?而这也帮不了我。我确实也阅读了http://android- developers.blogspot.de/2010/09/one-screen-turn-deserves- another.html 。 这是我当前使用的方法,不想使用(过短的)废弃方法: 但是最后一部分肯定

  • 本文向大家介绍写一个方法判断页面滚动方向相关面试题,主要包含被问及写一个方法判断页面滚动方向时的应答技巧和注意事项,需要的朋友参考一下