2017-03-15 38 views
1

我正在製作一個2D自上而下的Java射擊遊戲(uni項目),但彈出瞄準問題 - 我不確定角度不正確的原因,以及如何糾正它。我如何糾正一個稍微偏離矢量運動的java(2D遊戲)

玩家在mousedown上的光標位置發射子彈。我正在使用dx/y =(x/ytarget - x/yorigin),用dx每個刻度標準化和增加項目符號x/y pos。

當光標移動時,觸發角度跟蹤光標 - 但角度偏離45度左右白色圓圈爲玩家,紅色爲光標,子彈爲黃色圓點。

我沒有代表張貼圖像(第一篇文章),這裏是一個鏈接,顯示角度的錯誤。

http://i.imgur.com/xbUh2fX

這裏是子彈類:

注 - 更新()是由主遊戲循環

import java.awt.*; 
import java.awt.MouseInfo; 

public class Bullet { 

private double x; 
private double y; 
private int r; 

private double dx; 
private double dy; 
private double speed; 
private double angle; 
private Point c; 

private Color color1; 

public Bullet(int x, int y) { 

    this.x = x; 
    this.y = y; 
    r = 3; 
    speed = 30; 
    color1 = Color.YELLOW; 

    c = MouseInfo.getPointerInfo().getLocation(); 

// getting direction 
    dx = c.x - x; 
    dy = c.y - y; 
    double distance = Math.sqrt(dx*dx + dy*dy); 
    dx /= distance; 
    dy /= distance; 

} 

public boolean update() { 

    x += dx*speed; 
    y += dy*speed; 

    if(x < -r || x > GamePanel.WIDTH + r || 
     y < -r || y > GamePanel.HEIGHT + r) { 
     return true; 
    } 

    return false; 

} 

public void draw(Graphics2D g) { 

    g.setColor(color1); 
    g.fillOval((int) (x - r), (int) (y - r), 2 * r, 2 * r); 

} 

}

+0

只是一個想法,嘗試更改x和y爲float而不是int,以避免丟失精度。我也會嘗試通過代碼來查看每個階段的變量值。 –

+0

你的計算看起來沒錯。但'MouseInfo.getPointerInfo()。getLocation();'在同一個座標系中工作嗎? – MBo

+0

@Mbo我相信它將x和y座標返回爲double。據https://docs.oracle.com/javase/7/docs/api/java/awt/Point.html ..我錯過了什麼? – sbrez

回答

0

叫我有一個類似的遊戲,這是我使用的代碼

import java.awt.Graphics2D; 

import araccoongames.pongadventure.game.Entity; 
import araccoongames.pongadventure.game.Game; 
import araccoongames.pongadventure.game.MapLoader; 

public class Ball extends Entity { 

private float speed = 8; 
private float speedx; 
private float speedy; 
private float degree; 

public Ball(float posx, float posy, Game game) { 
    super(0, 0, game); 

    this.posx = posx; 
    this.posy = posy; 

    // posx = ball x position 
    // posy = ball y position 
    // game.input.MOUSEY = mouse y position 
    // game.input.MOUSEX = mouse x position 

    degree = (float) (270 + Math.toDegrees(Math.atan2(posy - game.input.MOUSEY, posx - game.input.MOUSEX))) % 360; 

    speedx = (float) (speed * Math.sin(Math.toRadians(degree))); 
    speedy = (float) (speed * Math.cos(Math.toRadians(degree))); 
} 

@Override 
public void render(Graphics2D g) { 
    drawImage(game.texture.SPRITE[0][1], g); 
} 

@Override 
public void update() { 
    posx += speedx; 
    posy -= speedy; 

} 

} 
+0

嘗試了這個實現..並得到一個非常類似的結果與傾斜角度的火災。這導致我相信錯誤不是數學,而是其他地方可能?感謝您的幫助。 – sbrez