围绕圆圈旋转而不影响运动

时间:2015-10-06 10:44:43

标签: java swing rotation

我正在尝试创建一个矩形,它可以在屏幕上自由移动,同时也可以旋转,使其面向圆形或某个点。 我当前的状态使对象以一种非常奇怪的方式移动,似乎无法解决它。

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);
}
}

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

我还没有检查旋转的计算,但我认为fillOval应该使用两倍的半径来绘制行星:

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