JavaDevMatt.pl – Mateusz Kupilas

Programista na emigracji… aktualnie po emigracji. ;) Na blogu poruszam też tematy biznesowe.

LibGDX – Konfiguracja i pierwszy screen

Konfiguracja LibGDX: https://github.com/libgdx/libgdx/wiki/Setting-up-your-Development-Environment-(Eclipse,-Intellij-IDEA,-NetBeans)
Instalator: https://github.com/libgdx/libgdx/wiki/Project-Setup-Gradle
O ViewPortach: https://github.com/libgdx/libgdx/wiki/Viewports
SourceTree do pobrania: https://www.sourcetreeapp.com/

Pamiętajcie, że film ma na celu pokazanie całej otoczki – od planowania, przez commitowanie, naprawienie błędów etc. Nie przepisujcie kodu z filmiku. Macie stan kodu z tego filmiku dostępny na Githubie.

Kod źródłowy do pobrania: https://github.com/JavaDevMatt/tutorialclicker/tree/tut2

 

Co robiliśmy w tym materiale?

Wygenerowaliśmy pusty projekt i zaczęliśmy pisać kod

W filmiku pokazałem jak korzystać z instalatora, który generuje pusty projekt w LibGDX.

Link do instalatora: https://github.com/libgdx/libgdx/wiki/Project-Setup-

Szczegóły konfiguracji środowiska: https://github.com/libgdx/libgdx/wiki/Setting-up-your-Development-Environment-(Eclipse,-Intellij-IDEA,-NetBeans)

Napisaliśmy klasę TutorialClickerGame

Klasa ma stałe, które będziemy wykorzystywać w naszym projekcie. W metodzie create() odpalamy nasz SplashScreen. Flaga „paused” będzie na w przyszłości potrzebna, by sprawdzić czy gra jest aktywna, czy jest np. gdzieś w tle.

package pl.javadevmatt.tutorialclicker;

import pl.javadevmatt.tutorialclicker.screens.SplashScreen;

import com.badlogic.gdx.Game;

public class TutorialClickerGame extends Game {
	
	public final static String GAME_NAME = "Tutorial Clicker";
	
	public final static int WIDTH = 480;
	public final static int HEIGHT = 700;
	
	private boolean paused;
	
	
	@Override
	public void create () {
		this.setScreen(new SplashScreen(this));
	}

	/**
	 * ---------------------
	 * getters and setters
	 * 
	 */

	public boolean isPaused() {
		return paused;
	}

	public void setPaused(boolean paused) {
		this.paused = paused;
	}
}

Skonfigurowaliśmy nasz DesktopLauncher

Prosta konfiguracja okna desktopowego. Rozmiary, tytuł i ustawienie flagi resizable na false.

package pl.javadevmatt.tutorialclicker.desktop;

import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import pl.javadevmatt.tutorialclicker.TutorialClickerGame;

public class DesktopLauncher {
	public static void main (String[] arg) {
		LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
		
		config.title = TutorialClickerGame.GAME_NAME;
		config.width = TutorialClickerGame.WIDTH;
		config.height = TutorialClickerGame.HEIGHT;
		config.resizable = false;
		
		new LwjglApplication(new TutorialClickerGame(), config);
	}
}

Napisaliśmy abstrakcyjny ekran

Klasa, po której będą dziedziczyć wszystkie ekrany w grze. Zawiera scenę „Stage”, kamerę i SpriteBatch na którym będziemy rysować. Zawiera metody, które inicjalizują poszczególne pola. Metoda render czyści ekran, zajmuje się kamerą i spritebatch.

package pl.javadevmatt.tutorialclicker.screens;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.viewport.StretchViewport;

import pl.javadevmatt.tutorialclicker.TutorialClickerGame;

public abstract class AbstractScreen implements Screen{
	
	protected TutorialClickerGame game;
	
	protected Stage stage;
	private OrthographicCamera camera;
	protected SpriteBatch spriteBatch;
	
	public AbstractScreen(TutorialClickerGame game){
		this.game = game;
		createCamera();
		stage = new Stage(new StretchViewport(TutorialClickerGame.WIDTH, TutorialClickerGame.HEIGHT, camera));
		spriteBatch = new SpriteBatch();
		Gdx.input.setInputProcessor(stage);
	}

	private void createCamera() {
		camera = new OrthographicCamera();
		camera.setToOrtho(false, TutorialClickerGame.WIDTH, TutorialClickerGame.HEIGHT);
		camera.update();
	}
	
	@Override
	public void render(float delta) {
		clearScreen();
		camera.update();
		spriteBatch.setProjectionMatrix(camera.combined);
	}
	
	@Override
	public void show() {}

	private void clearScreen() {
		Gdx.gl.glClearColor(0, 0, 0, 0);
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
	}
	
	@Override
	public void resume() {
		game.setPaused(false);
	}
	
	@Override
	public void pause() {
		game.setPaused(true);
	}
	
	@Override
	public void hide() {}
	
	@Override
	public void dispose() {
		game.dispose();
	}
	
	@Override
	public void resize(int width, int height) {
	}

}

Napisaliśmy klasę SplashScreen

Klasa, która wyświetla obrazek naszego SplashScreena.

package pl.javadevmatt.tutorialclicker.screens;

import pl.javadevmatt.tutorialclicker.TutorialClickerGame;

import com.badlogic.gdx.graphics.Texture;

public class SplashScreen extends AbstractScreen{
	
	private Texture splashImg;

	public SplashScreen(TutorialClickerGame game) {
		super(game);
		init();
	}

	private void init() {
		// TODO implement better assets loading when game grows
		splashImg = new Texture("badlogic.jpg");
	}
	
	@Override
	public void render(float delta) {
		super.render(delta);
		
		spriteBatch.begin();
		spriteBatch.draw(splashImg, 0, 0);
		spriteBatch.end();
	}

	

}

 

banerjd