Продолжаем создавать простую 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, чтобы это исправить, достаточно кликнуть правой кнопкой мышки по папке и снять галочку напротив пункта “Только чтение”: