Android Studio и LibGDX: Создаем простую 2D игру (Часть 2)

Продолжаем создавать простую 2D игру, в этой части мы добавим еще 2 экрана к игре: экран меню и экран конец игры, а также создадим кнопочки!

Скачать исходники для статьи можно ниже

Первую часть создания 2D игры читайте здесь — Android Studio и LibGDX: Создаем простую 2D игру (Часть 1)

1. Для создания кнопок и надписи GAME OVER загрузим в папку assets следующие файлы:

2dlibgdx15

Скачать zip — архив папки assets можно по следующей ссылке — скачать assets.

Здесь содержимое папки skin нужно для создания кнопок.

2. Создадим 2 новых файла: MenuScreen и GameOverScreen:

Файл MenuScreen будет отвечать за вывод экрана меню:

2dlibgdx17

Код файла 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: отвечает за вывод экрана Конец игры:

2dlibgdx18

Код файла 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, чтобы это исправить, достаточно кликнуть правой кнопкой мышки по папке и снять галочку напротив пункта «Только чтение»:

2dlibgdx19

Введите свой email адрес для того, чтобы подписаться на мой блог:


knopkisoc

Добавить комментарий