2012-07-12 38 views
1

我正在嘗試做一個幾何戰爭風格的遊戲,我在路障。我一直試圖找出一種方法來順利移動我的圖形對象。但它只是向一個方向移動。例如,如果我按向上按鈕,然後它上升,然後當我按下頂部的右按鈕,然後我沿着右上角向對角線移動。但我希望我的目標能夠順利地從直行轉向朝右上方。這是我的代碼到目前爲止:如何在Java中平滑移動圖形對象360度?

public class MoveTest extends JPanel implements ActionListener, KeyListener { 

Timer t = new Timer(5, this); 
double x = 0, y = 0, velX = 0, velY = 0; 
private Set<Integer> pressed = new HashSet<Integer>(); 
private static int WIDTH = 800; 
private static int HEIGHT = 600; 
private double d = 0; 
private double topSpeed = 0; 
private boolean stop = false; 
private double a = 0; 

PVector location; 
PVector velocity; 
PVector acceleration; 

public MoveTest() { 
    location = new PVector(WIDTH/2,HEIGHT/2); 
    velocity = new PVector(0,0); 
    acceleration = new PVector(0,0); 
    topSpeed = 5.0; 
    t.start(); 
    addKeyListener(this); 
    setFocusable(true); 
    setFocusTraversalKeysEnabled(false); 
} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setColor(Color.GREEN); 
    g2.drawOval((int)location.x, (int)location.y, 40, 40); 
} 

void update() { 
    velocity.add(acceleration); 
    if(stop == false) { 
    velocity.limit(topSpeed); 
    } 
    else { 
    velocity.decellerate(0); 
    } 
    location.add(velocity);  
} 

public void north() { 
    acceleration = new PVector(0,-5); 
} 

public void south() { 
    acceleration = new PVector(0,5); 
} 

public void west() { 
    acceleration = new PVector(-5,0); 
} 

public void east() { 
    acceleration = new PVector(5,0); 
} 

public void northEast() { 
    acceleration = new PVector(5,-5); 
} 

public void northWest() { 
    acceleration = new PVector(-5,-5); 
} 

public void southEast() { 
    acceleration= new PVector(5,5); 
} 

public void southWest() { 
    acceleration = new PVector(-5,5); 
} 

public void stop(){ 
    stop = true; 
} 


public void actionPerformed(ActionEvent arg0) { 
    //System.out.println("" + velocity.x + " " + velocity.y); 
    repaint(); 
    update(); 
    checkEdges(); 
} 

public void keyPressed(KeyEvent e) { 

int code = e.getKeyCode(); 

stop = false; 

pressed.add(code); 

if(pressed.size() > 1) { 
    if(pressed.contains(KeyEvent.VK_W) && pressed.contains(KeyEvent.VK_D)) { 
    northEast(); 
    } 
    if(pressed.contains(KeyEvent.VK_W) && pressed.contains(KeyEvent.VK_A)) { 
    northWest(); 
    } 
    if(pressed.contains(KeyEvent.VK_S) && pressed.contains(KeyEvent.VK_D)) { 
    southEast(); 
    } 
    if(pressed.contains(KeyEvent.VK_S) && pressed.contains(KeyEvent.VK_A)) { 
    southWest(); 
    } 
} 

else if(pressed.size() == 1){ 
    if(code == KeyEvent.VK_W) { 
    north(); 
    } 
    if(code == KeyEvent.VK_S) { 
    south(); 
    } 
    if(code == KeyEvent.VK_D) { 
    east(); 
    } 
    if(code == KeyEvent.VK_A) { 
    west(); 
    } 
} 
} 

public void keyReleased(KeyEvent e) { 
    pressed.remove(e.getKeyCode()); 
    if(pressed.size() == 0) { 
    stop(); 
    } 
} 

public void keyTyped(KeyEvent e) { 

} 

void checkEdges() { 
    if(location.x > WIDTH) { 
    location.x = 0; 
    } 
    else if(location.x < 0) { 
    location.x = WIDTH; 
    } 
    if(location.y > HEIGHT) { 
    location.y = 0; 
    } 
    else if(location.y < 0) { 
    location.y = HEIGHT; 
    } 
} 

} 

任何幫助,將不勝感激。

回答

1
//MoveTest 
topSpeed = 5.0; 

//update 
velocity.add(acceleration); 
if(stop == false) { 
    velocity.limit(topSpeed); 

//south 
acceleration = new PVector(0,5); 

因此,如果您按下按鍵,您的加速度始終爲5或7(可能是錯誤)單位。然後,將其添加到速度,然後將其限制爲5.您的加速度非常強,幾乎沒有慣性。嘗試更小的加速度或更大的topSpeed,它應該變得更平滑。

另外:你補償幀率?我沒有看到它在你的代碼中,但我不知道PVector的實現。

+0

我明白了你的觀點。所以,我應該加入加速度矢量還是加減速,以使其移動得更快或更慢,然後將極限設置爲特定的topSpeed,以便它不會繼續加速?我還從http://processing.org/learning/pvector/ – Heisenburg 2012-07-12 19:56:51

+0

得到了PVector類的想法。我無法對加速進行限制。例如,我的對象不會在對角線中移動。如果我按右鍵然後它會正確,但是當我按下上鍵時,它會直線上升。您有任何建議或任何有關我想要做什麼的信息的好網站?我一直無法找到有關這方面的好消息。 – Heisenburg 2012-07-13 03:12:13

+0

@海森堡我認爲首先決定運動模型對你來說很重要。一個這樣的模型將是一輛汽車,它具有可以獨立駕駛的航向和速度,並且運動始終朝向航向。另一個將是一個「太空船」,您可以在其中獲得2D/3D速度,並可以通過在任何方向應用加速度來改變它。最好想一想,並再次詢問[這裏](http://gamedev.stackexchange.com/)。 – denahiro 2012-07-13 06:58:31