繁体   English   中英

所有方向的8向一致移动速度,如何从方向键获得移动角度?

[英]8-direction consistent movement speed in all directions, how to get angle of movement from direction keys?

对于地球各种表面上的人们来说,清晨。

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

序言:在基本的自上而下游戏中移动的标准方法是在更新方法中添加到x和/或y,具体取决于方向。

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

这对于4向运动来说是优雅的(我相信),因为无论按下哪种按键组合,运动方向都是一致的。 例如,向上 - 向下按下将向左移动,因为上下取消。 但是当沿对角线移动时,步数会太大。 如果速度为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侧滚动器。

当然有一种性感的肮脏方式(或者某种东西)可以用几行来解决它? 或者我接近这个完全错误?

编辑:回答后代码(由korona发布):

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;
}

使用二维向量。 像这样的东西:

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM