2015-10-06 47 views
0

我試圖創建一個可以在屏幕上自由移動,同時也旋轉,使其朝向一個圓或某一點的矩形。 我現在的狀態,使得在一個非常奇怪的方式對象移動,似乎無法修復它。旋轉一圈,而不會影響運動

import javax.swing.JFrame; 

public class Start { 

public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    f.setTitle("Minigame"); 
    f.setContentPane(new Panel()); 
    f.setSize(1000, 1000); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 
} 

} 


import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

public class Panel extends JPanel implements ActionListener, KeyListener{ 

private Timer timer; 
private Graphics2D g2d; 
private Planet planet; 
private Player player; 

private double rotation=0; 
private int dx=0; 
private int dy=0; 

public Panel(){ 
    setFocusable(true); 
    requestFocus(); 
    planet = new Planet(100,100,100); 
    player = new Player(200,200,20,50); 
} 

@Override 
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g2d=(Graphics2D)g; 
    g2d.fillOval(planet.getX(), planet.getY(), planet.getRadius(), planet.getRadius()); 
    g2d.setColor(Color.BLUE); 
    g2d.rotate(rotation,planet.centerX(),planet.centerY()); 
    g2d.fillRect(player.getX(), player.getY(), player.getWidth(),player.getHeight()); 
    g2d.dispose(); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    rotation=Math.atan2(player.centerX()-planet.centerX(), player.centerY()-planet.centerY()); 
    player.x+=dx; 
    player.y+=dy; 
    repaint(); 
} 

@Override 
public void keyPressed(KeyEvent e) { 

    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_LEFT) { 
     dx = -5; 
    } 

    if (key == KeyEvent.VK_RIGHT) { 
     dx = 5; 
    } 

    if (key == KeyEvent.VK_UP) { 
     dy = -5; 
    } 

    if (key == KeyEvent.VK_DOWN) { 
     dy = 5; 
    } 

} 

@Override 
public void keyReleased(KeyEvent e) { 

    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_LEFT) { 
     if (dx==-5) 
     dx = 0; 
    } 

    if (key == KeyEvent.VK_RIGHT) { 
     if (dx==5) 
     dx = 0; 
    } 

    if (key == KeyEvent.VK_UP) { 
     if (dy==-5) 
     dy = 0; 
    } 

    if (key == KeyEvent.VK_DOWN) { 
     if (dy==5) 
     dy = 0; 
    } 
} 

@Override 
public void addNotify(){ 
    super.addNotify(); 
    timer=new Timer(10,this); 
    timer.start(); 
    addKeyListener(this); 
} 


@Override 
public void keyTyped(KeyEvent arg0) { 

} 

} 

public class Planet{ 

public int x; 
public int y; 
private int radius; 

public Planet(int x,int y,int radius){ 
    this.x=x; 
    this.y=y; 
    this.radius=radius; 
} 

public int getX(){ 
    return x; 
} 
public int getY(){ 
    return y; 
} 
public int getRadius(){ 
    return radius; 
} 
public int centerX(){ 
    return x+(radius/2); 
} 
public int centerY(){ 
    return y+(radius/2); 
} 
} 

public class Player { 

public int x; 
public int y; 
private int width; 
private int height; 

public Player(int x,int y,int width,int height){ 
    this.x=x; 
    this.y=y; 
    this.width=width; 
    this.height=height; 
} 

public int getX(){ 
    return x; 
} 
public int getY(){ 
    return y; 
} 
public int getHeight(){ 
    return height; 
} 
public int getWidth(){ 
    return width; 
} 
public int centerX(){ 
    return x+(width/2); 
} 
public int centerY(){ 
    return y+(height/2); 
} 
} 

回答

1

這是爲我工作。我改變了角度的標誌以及玩家的繪製方式。

@Override 
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g2d=(Graphics2D)g; 

    // Draw planet 
    g2d.fillOval(planet.getX(), planet.getY(), planet.getRadius(), planet.getRadius()); 

    // Draw player 
    g2d.setColor(Color.BLUE); 
    g2d.rotate(rotation, player.centerX(), player.centerY()); 

    Rectangle rect = new Rectangle(player.centerX()-(player.getWidth()/2), player.centerY()-(player.getHeight()/2), player.getWidth(),player.getHeight()); 

    g2d.draw(rect); 
    g2d.dispose(); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    rotation=Math.atan2(+player.centerX()-planet.centerX(), - player.centerY()+planet.centerY()); 
    player.x+=dx; 
    player.y+=dy; 
    repaint(); 
} 
+0

我可以問,爲什麼這能解決問題? –

+0

你被錯誤地使用rotate()方法 - 它應該圍繞玩家的中心,而不是地球的中心。並且旋轉的計算是減去你想要的角度。 – davestevens

+0

好了,謝謝你1000次,我無法把我的頭圍繞這個問題。 –

0

我沒有檢查旋轉的計算,但我認爲fillOval應該使用兩次半徑畫出的星球:

g2d.fillOval(planet.getX(), planet.getY(), planet.getRadius()*2, planet.getRadius()*2); 
+0

實際上,我認爲你在哪裏寫半徑,你的意思是直徑,因爲你用x +半徑/ 2來計算中心。 – davestevens

+0

是啊,我有,但不應該是我的問題的原因。 謝謝指點出來,雖然 –