Let’s start with basic.
You want to do a game and don’t know where to start?
A game is usually compose of the following elements :
- Frame : The window of the game
- Canvas : The rendering surface
- GameLoop : Call the rendering and update methods
- Rendering method : All your drawing here
- Update method : All your game logic here
- Mouse and Key input : Add KeyListener, MouseListener and MouseMotionListener to the canvas
Here is a template that I use for my games. To make your own game, you just have to add your code in the render(Graphics2D g) and update(int deltaTime) methods.
I add a little test so you can run this code directly to see what it does.
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Game implements Runnable{
final int WIDTH = 1000;
final int HEIGHT = 700;
JFrame frame;
Canvas canvas;
BufferStrategy bufferStrategy;
public Game(){
frame = new JFrame("Basic Game");
JPanel panel = (JPanel) frame.getContentPane();
panel.setPreferredSize(new Dimension(WIDTH, HEIGHT));
panel.setLayout(null);
canvas = new Canvas();
canvas.setBounds(0, 0, WIDTH, HEIGHT);
canvas.setIgnoreRepaint(true);
panel.add(canvas);
canvas.addMouseListener(new MouseControl());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
canvas.createBufferStrategy(2);
bufferStrategy = canvas.getBufferStrategy();
canvas.requestFocus();
}
private class MouseControl extends MouseAdapter{
}
long desiredFPS = 60;
long desiredDeltaLoop = (1000*1000*1000)/desiredFPS;
boolean running = true;
public void run(){
long beginLoopTime;
long endLoopTime;
long currentUpdateTime = System.nanoTime();
long lastUpdateTime;
long deltaLoop;
while(running){
beginLoopTime = System.nanoTime();
render();
lastUpdateTime = currentUpdateTime;
currentUpdateTime = System.nanoTime();
update((int) ((currentUpdateTime - lastUpdateTime)/(1000*1000)));
endLoopTime = System.nanoTime();
deltaLoop = endLoopTime - beginLoopTime;
if(deltaLoop > desiredDeltaLoop){
//Do nothing. We are already late.
}else{
try{
Thread.sleep((desiredDeltaLoop - deltaLoop)/(1000*1000));
}catch(InterruptedException e){
//Do nothing
}
}
}
}
private void render() {
Graphics2D g = (Graphics2D) bufferStrategy.getDrawGraphics();
g.clearRect(0, 0, WIDTH, HEIGHT);
render(g);
g.dispose();
bufferStrategy.show();
}
//TESTING
private double x = 0;
/**
* Rewrite this method for your game
*/
protected void update(int deltaTime){
x += deltaTime * 0.2;
while(x > 500){
x -= 500;
}
}
/**
* Rewrite this method for your game
*/
protected void render(Graphics2D g){
g.fillRect((int)x, 0, 200, 200);
}
public static void main(String [] args){
Game ex = new Game();
new Thread(ex).start();
}
}
Here is a game that I made with this code : http://www.gudradain.byethost12.com/geomwar.html
NOTE : If you run the code, you probably realize that the square in the animation glitter a little bit. You can remove that effect by increasing the frame rate of the game (change the variable desiredFPS).
WARNING : If you set a too high FPS (frame per second), you might have problem with the game logic.