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;
}
}
}
任何幫助,將不勝感激。
我明白了你的觀點。所以,我應該加入加速度矢量還是加減速,以使其移動得更快或更慢,然後將極限設置爲特定的topSpeed,以便它不會繼續加速?我還從http://processing.org/learning/pvector/ – Heisenburg 2012-07-12 19:56:51
得到了PVector類的想法。我無法對加速進行限制。例如,我的對象不會在對角線中移動。如果我按右鍵然後它會正確,但是當我按下上鍵時,它會直線上升。您有任何建議或任何有關我想要做什麼的信息的好網站?我一直無法找到有關這方面的好消息。 – Heisenburg 2012-07-13 03:12:13
@海森堡我認爲首先決定運動模型對你來說很重要。一個這樣的模型將是一輛汽車,它具有可以獨立駕駛的航向和速度,並且運動始終朝向航向。另一個將是一個「太空船」,您可以在其中獲得2D/3D速度,並可以通過在任何方向應用加速度來改變它。最好想一想,並再次詢問[這裏](http://gamedev.stackexchange.com/)。 – denahiro 2012-07-13 06:58:31