簡體   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