Продолжаем создавать простую 2D игру, в этой части мы добавим еще 2 экрана к игре: экран меню и экран конец игры, а также создадим кнопочки!
Скачать исходники для статьи можно ниже
Первую часть создания 2D игры читайте здесь – Android Studio и LibGDX: Создаем простую 2D игру (Часть 1)
1. Для создания кнопок и надписи GAME OVER загрузим в папку assets следующие файлы:
Скачать zip – архив папки assets можно по следующей ссылке – скачать assets.
Здесь содержимое папки skin нужно для создания кнопок.
2. Создадим 2 новых файла: MenuScreen и GameOverScreen:
Файл MenuScreen будет отвечать за вывод экрана меню:
Код файла MenuScreen:
package com.mygdx.game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.utils.viewport.FillViewport;
public class MenuScreen extends BaseScreen {
private Stage stage;
private Skin skin;
private Image gameover;
private TextButton retry;
public MenuScreen(final MainGame game) {
super(game);
stage=new Stage(new FillViewport(640, 360));
skin=new Skin(Gdx.files.internal("skin/uiskin.json"));
gameover = new Image();
retry=new TextButton("Play",skin);
retry.addCaptureListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
game.setScreen(game.gameScreen);
}
});
gameover.setPosition(320-gameover.getWidth(), 320- gameover.getHeight());
retry.setSize(200,100);
retry.setPosition(220,50);
stage.addActor(retry);
stage.addActor(gameover);
}
@Override
public void show() {
Gdx.input.setInputProcessor(stage);
}
@Override
public void hide() {
Gdx.input.setInputProcessor(null);
}
@Override
public void dispose() {
super.dispose();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0.3f, 0.4f, 0.7f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act();
stage.draw();
}
}
Здесь кнопка – это Актёр – Actor(retry).
А файл GameOverScreen: отвечает за вывод экрана Конец игры:
Код файла GameOverScreen:
package com.mygdx.game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.utils.viewport.FillViewport;
public class GameOverScreen extends BaseScreen {
private Stage stage;
private Skin skin;
private Image gameover;
private TextButton retry, menu;
public GameOverScreen(final MainGame game) {
super(game);
stage=new Stage(new FillViewport(640, 360));
skin=new Skin(Gdx.files.internal("skin/uiskin.json"));
gameover = new Image(new Texture(Gdx.files.internal("gameover.png")));
retry=new TextButton("Retry",skin);
menu=new TextButton("Menu", skin);
retry.addCaptureListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
game.setScreen(game.gameScreen);
}
});
menu.addCaptureListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
game.setScreen(game.menuScreen);
}
});
gameover.setPosition(520-gameover.getWidth(), 320- gameover.getHeight());
retry.setSize(200,100);
retry.setPosition(350,50);
stage.addActor(retry);
menu.setSize(200,100);
menu.setPosition(100,50);
stage.addActor(menu);
stage.addActor(gameover);
}
@Override
public void show() {
Gdx.input.setInputProcessor(stage);
}
@Override
public void hide() {
Gdx.input.setInputProcessor(null);
}
@Override
public void dispose() {
super.dispose();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0.4f, 0.5f, 0.8f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act();
stage.draw();
}
}
Здесь кнопки – это тоже Актёры.
3. Код остальных файлов: MainGame, MainGameScreen, BaseScreen, ActorJugador, ActorPinchos – немного поменялся, поэтому привожу их код:
Код файл MainGame:
package com.mygdx.game;
import com.badlogic.gdx.Game;
public class MainGame extends Game {
public MainGameScreen gameScreen;
public GameOverScreen gameOverScreen;
public MenuScreen menuScreen;
@Override
public void create () {
menuScreen=new MenuScreen(this);
gameScreen=new MainGameScreen(this);
gameOverScreen=new GameOverScreen(this);
setScreen(menuScreen);
}
}
Код файла MainGameScreen:
package com.mygdx.game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.mygdx.game.actors.ActorJugador;
import com.mygdx.game.actors.ActorPinchos;
public class MainGameScreen extends BaseScreen {
public MainGameScreen (MainGame game) {
super(game);
texturaJugator=new Texture("minijoe.png");
texturaPinchos=new Texture("pinchos.png");
regionPinchos=new TextureRegion(texturaPinchos, 0, 64, 128, 64);
}
private Stage stage;
private ActorJugador jugador;
private ActorPinchos pinchos;
private Texture texturaJugator, texturaPinchos;
private TextureRegion regionPinchos;
@Override
public void show() {
stage = new Stage();
jugador = new ActorJugador(texturaJugator);
pinchos=new ActorPinchos(regionPinchos);
stage.addActor(jugador);
stage.addActor(pinchos);
jugador.setPosition(20,100);
pinchos.setPosition(500,100);
}
@Override
public void hide() {
stage.dispose();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0.4f, 0.5f, 0.8f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.act();
comprobarColisiones();
stage.draw();
}
private void comprobarColisiones(){
if (jugador.isAlive()&&jugador.getX()+jugador.getWidth()>pinchos.getX()){
System.out.println("Colision");
jugador.setAlive(false);
game.setScreen(game.gameOverScreen);
}
}
@Override
public void dispose() {
texturaJugator.dispose();
}
}
Код файла BaseScreen:
package com.mygdx.game;
import com.badlogic.gdx.Screen;
public abstract class BaseScreen implements Screen {
public MainGame game;
public BaseScreen(MainGame game) {
this.game=game;
}
@Override
public void show() {
}
@Override
public void render(float delta) {
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
@Override
public void dispose() {
}
}
Файл ActorJugador:
package com.mygdx.game.actors;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.scenes.scene2d.Actor;
public class ActorJugador extends Actor {
private Texture jugator;
private boolean alive;
public boolean isAlive() {
return alive;
}
public void setAlive(boolean alive) {
this.alive = alive;
}
public ActorJugador(Texture jugator){
this.jugator=jugator;
this.alive=true;
setSize(jugator.getWidth(), jugator.getHeight());
}
public void act (float delta){
super.act(delta);
}
public void draw (Batch batch, float parentAlpha){
batch.draw(jugator, getX(), getY());
}
}
Файл ActorPinchos:
package com.mygdx.game.actors;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Actor;
/**
* Created by Константин on 01.07.17.
*/
public class ActorPinchos extends Actor {
private TextureRegion pinchos;
public ActorPinchos (TextureRegion pinchos) {
this.pinchos=pinchos;
setSize(pinchos.getRegionWidth(), pinchos.getRegionHeight());
}
public void act (float delta){
setX(getX()-250*delta);
}
@Override
public void draw(Batch batch, float parentAlpha) {
batch.draw(pinchos, getX(), getY());
}
}
PS: При создании билда (apk файла) иногда возникает ошибка с доступом к папкам, например к папке skin, чтобы это исправить, достаточно кликнуть правой кнопкой мышки по папке и снять галочку напротив пункта “Только чтение”:

