你想利用JAVA开发游戏?却不知道从何开始?
一个游戏通常以下元素组成:
- 框架:游戏窗口
- 帆布:渲染表面
- GameLoop:渲染和更新方法
- 渲染方法:绘图
- 更新的方法:你的游戏这里的逻辑
- 鼠标和键盘输入:KeyListener,鼠标监听器和MouseMotionListener添加到画布
下面是一个模板,你只需要添加你的代码在渲染(Graphics2D的G)和更新(INT deltaTime)方法。
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.
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();
}
}