import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.KeyStroke;
public class GameDemo extends JFrame {
private Player player;
public GameDemo() {
player = new Player(200, 200);
GamePanel panel = new GamePanel();
add(panel);
new Thread(new GameLoop(panel)).start();
}
private boolean move, right, left;
class GamePanel extends JComponent {
public GamePanel() {
InputMap map = this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
map.put(KeyStroke.getKeyStroke("W"), "go");
map.put(KeyStroke.getKeyStroke("released W"), "stop");
getActionMap().put("go", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
move = true;
}
});
getActionMap().put("stop", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
move = false;
}
});
map.put(KeyStroke.getKeyStroke("D"), "right");
map.put(KeyStroke.getKeyStroke("released D"), "stopRight");
getActionMap().put("right", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
right = true;
left = false;
}
});
getActionMap().put("stopRight", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
right = false;
}
});
map.put(KeyStroke.getKeyStroke("A"), "left");
map.put(KeyStroke.getKeyStroke("released A"), "stopLeft");
getActionMap().put("left", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
left = true;
right = false;
}
});
getActionMap().put("stopLeft", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
left = false;
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.translate(player.getX(), player.getY());
g2.fillOval(-10, -10, 20, 20);
g2.rotate(Math.toRadians(player.dir));
g2.translate(5, 0);
g2.fillRect(-5, -5, 15, 10);
g2.dispose();
}
}
class GameLoop implements Runnable {
private JComponent comp;
public GameLoop(JComponent comp) {
this.comp = comp;
}
public void run() {
while(true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (right)
player.turnRight();
else if(left)
player.turnLeft();
if (move)
player.move(10);
comp.repaint();
}
}
}
class Player {
private Point pos;
private int dir;
public Player(int x, int y) {
pos = new Point(x, y);
dir = 0;
}
public void move(int steps) {
pos.x += Math.cos(Math.toRadians(dir)) *steps;
pos.y += Math.sin(Math.toRadians(dir)) *steps;
}
public void turnRight() {
dir = (dir+10)%360;
}
public void turnLeft() {
dir = (dir-10)%360;
}
public int getX() {
return pos.x;
}
public int getY() {
return pos.y;
}
public int getDir() {
return dir;
}
}
public static void main(String[] s) {
JFrame frame = new GameDemo();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(0, 0, 400, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}