Пишем игру на Java с использованием встроенных средств, часть первая

30 Май
2012

Введение и подготовка



Привет блогаюзеры, сегодня я постараюсь научить вас основам геймдева на Java.
Подтолкнул меня на изучение Джавы Minecraft, одна из немногих популярных игр, написанных на Java.
И правда, это не лучший для игр язык, но он дарит кроссплатформенность и быстроту написания.

В данном уроке мы не будем использовать никаких доп. средств типа LWJGL, или, например, Slick2D.

Основные IDE
  • Eclipse
  • Netbeans
  • IntelliJ IDEA

Если вы спросите меня — какую IDE выбрать, то я посоветую вам Eclipse EE. Эта моя любимая IDE, причины — куча: Eclipse полностью бесплатен, очень стабилен(за всю время использования он ни разу не вылетел), многофункционален и шустр. И конечно же на забудьте скачать JDK версии 7.

Вот тут вы можете скачать dev-версию Eclipse EE(которой буду пользоваться я во время урока). Если вы захотите, вы можете скачать Eclipse Classic, или Eclipse Java, сути это не меняет.

Под катом самое интересное!

Класс Game


Создадим новый проект, а в нем новый класс Game. Сразу же добавим галочку к public static void main(String[] args) чтобы ускорить процесс.

Наш класс Game должен наследовать класс Canvas для того, чтобы мы могли спокойно отображать какую-либо графику. Также нам потребуется реализовать интерфейс Runnable.
После этого наш класс выглядит примерно так:
public class Game extends Canvas implements Runnable {
	private static final long serialVersionUID = 1L; 
	
	public void run() {
		
	}

	public static void main(String[] args) {
		
	}
}

Окей, объявим переменную running которая будет отображать состояние игры:
private boolean running;

Добавим метод start, а в нем организуем создание нового потока, его запуск, а так же инициализацию переменной running:
public void start() {
	running = true;
	new Thread(this).start();
}

Текущий код класса Game:
public class Game extends Canvas implements Runnable {
	private static final long serialVersionUID = 1L;
	
	private boolean running;
	
	public void start() {
		running = true;
		new Thread(this).start();
	}
	
	public void run() {
		
	}

	public static void main(String[] args) {
		
	}
}

В методе run создадим главный игровой цикл:
public void run() {
	while(running) {
			
	}
}

Если мы хотим высчитывать delta time(разница по времени между кадрами), то изменим код метода run во так:
public void run() {
	long lastTime = System.currentTimeMillis();
	long delta;
		
	while(running) {
		delta = System.currentTimeMillis() - lastTime; //разница по времени между двумя кадрами
		lastTime = System.currentTimeMillis();
	}
}

Теперь нам надо создать BufferStrategy для нашего холста(Canvas), а заодно и метод render создадим:
public void render() {
	BufferStrategy bs = getBufferStrategy();
	if (bs == null) {
		createBufferStrategy(2);
		requestFocus();
		return;
	}
}

Не забудьте добавить вызов этого метода в цикл running. Теперь мы должны получить экземпляр класса Graphics для рендеринга чего-либо на холст. Полный код:
public void render() {
	BufferStrategy bs = getBufferStrategy();
	if (bs == null) {
		createBufferStrategy(2);
		requestFocus();
		return;
	}
		
	Graphics g = bs.getDrawGraphics(); //получаем Graphics из созданной нами BufferStrategy
	g.setColor(Color.black); //выбрать цвет
	g.fillRect(0, 0, getWidth(), getHeight()); //заполнить прямоугольник 
	g.dispose();
	bs.show(); //показать
}

Не спешите компилировать проект, надо создать экземпляр класс Game и добавить его на фрейм.
Для удобства объявим три переменных:
public static int WIDTH = 400;
public static int HEIGHT = 300;
public static String NAME = "TUTORIAL 1";

А теперь создадим JFrame и добавим на него наш холст:
public static void main(String[] args) {
	Game game = new Game();
	game.setPreferredSize(new Dimension(WIDTH, HEIGHT));
	JFrame frame = new JFrame(Game.NAME);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setLayout(new BorderLayout());
	frame.add(game, BorderLayout.CENTER);
	frame.pack();
	frame.setResizable(false);
	frame.setVisible(true);
	game.start();
}


Теперь можете смело запускать, если что-то не так — вот весь код:
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;

public class Game extends Canvas implements Runnable {
	private static final long serialVersionUID = 1L;
	
	private boolean running;
	
	public static int WIDTH = 400;
	public static int HEIGHT = 300;
	public static String NAME = "TUTORIAL 1";
	
	public void start() {
		running = true;
		new Thread(this).start();
	}
	
	public void run() {
		long lastTime = System.currentTimeMillis();
		long delta;
		
		while(running) {
			delta = System.currentTimeMillis() - lastTime;
			lastTime = System.currentTimeMillis();	
			render();
		}
	}
	
	public void render() {
		BufferStrategy bs = getBufferStrategy();
		if (bs == null) {
			createBufferStrategy(2);
			requestFocus();
			return;
		}
		
		Graphics g = bs.getDrawGraphics(); //получаем Graphics из созданной нами BufferStrategy
		g.setColor(Color.black); //выбрать цвет
		g.fillRect(0, 0, getWidth(), getHeight()); //заполнить прямоугольник 
		g.dispose();
		bs.show(); //показать
	}

	public static void main(String[] args) {
		Game game = new Game();
		game.setPreferredSize(new Dimension(WIDTH, HEIGHT));
		JFrame frame = new JFrame(Game.NAME);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(new BorderLayout());
		frame.add(game, BorderLayout.CENTER);
		frame.pack();
		frame.setResizable(false);
		frame.setVisible(true);
		game.start();
	}
}

Это весь код класса Game. В следующем мы будем писать класс Screen, который будем заниматься отображением каких либо-объектов, а так мы рассмотрим ввод с клавиатуры.

Удачи в освоении Java!
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх