Продолжаем создавать карту игры для LibGDX в данной статье мы создадим несколько слоев для карты, а также напишем небольшую игру в Android Studio для движения карты влево и вправо.
Если у Вас есть бизнес и Вы собираетесь создать красивый сайт, намного лучше чем у конкурентов, то , ведь сайт – это своего рода «визитная карточка» любой организации, фирмы или предприятия, то следует позаботиться о том, чтобы он был сделан профессионально, продуманно и качественно.
В Слое “background” мы просто зальём всю карту синим цветом:
1. выбираем слой “background”
2. находим Тайл в виде синего квадратика
3. выбираем инструмент “Заливка”
4. и заливаем синим цветом всю карту:
В Слое graphics мы рисуем красивую фоновую картинку: тучки, горы и др., а также трубы и землю, по которым мы будем передвигаться и для которых в Слое ground зададим контуры.:
1. выбираем слой graphics
2. меняем инструмент на Штамп
3. рисуем, используя Тайлы
Переходим к Слоям Объектов.
В Слое ground мы будем создавать землю, по которой будет ходить наш игрок:
1. выбираем слой ground
2. выбираем фигуру – Прямоугольник
3. выделяем всю землю до обрыва как одно целое
4. после обрыва опять выделяем всю землю до следующего обрыва.
В слое pipes мы также с помощью фигуры Прямоугольник выделяем каждую трубу отдельно как одно целое:
В слое coins (монетки) нужно выделить каждый ящики со знаком вопроса:
Слой bricks (кирпичи) нужно выделять каждый кирпичик отдельно, так как игрок может разбить любой из них:
Можно также создать и другие Слои, например слой “Враги” (на скриншоте ниже это слои Turtles и Goombas) и отметить, где они должны находится на карте:
Всё осталось только сохранить карту (файл tmx) и закинуть её вместе с Tileset (файл png) в папку assets проекта игры.
Для примера, давайте напишем небольшую игру в Android Studio и LibGDX, в которой будем двигать карту с помощью стрелок влево и вправо.
Запускаем LibGDX:
Здесь название пакета оставил по умолчанию: “com.mygdx.game”.
Заходим в Android Studio и импортируем проект, созданный в LibGDX:
Для этого в Android Studio в верхнем меню выбираем File -> New -> Import Project, в открывшемся окошке выбираем Import Project и находим папку, которую указали при создании проекта в LibGDX (в данном примере папка Mario):
Далее закидываем карту, сделанную в программе Tiled (в данном примере, это файл level1.tmx и NES – Super Mario Bros – Tileset.png) в папку assets:
Скачать файл level1.tmx и NES – Super Mario Bros – Tileset.png можно здесь.
Далее как на скриншоте создадим пакеты Screens и Scenes:
И внутри них файлы – Hud и PlayScreen:
А теперь изменим код файлов на следующий:
Код файла MarioBros:
package com.mygdx.game; import com.badlogic.gdx.Game; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.mygdx.game.Screens.PlayScreen; public class MarioBros extends Game { public SpriteBatch batch; public static final int V_WIDTH = 400; public static final int V_HEIGHT = 208; @Override public void create () { batch = new SpriteBatch(); setScreen(new PlayScreen(this)); } @Override public void render () { super.render(); } }
Код файла Hud:
package com.mygdx.game.Scenes; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.utils.viewport.FitViewport; import com.badlogic.gdx.utils.viewport.Viewport; import com.mygdx.game.MarioBros; public class Hud { //Scene2D.ui Stage and its own Viewport for HUD public Stage stage; private Viewport viewport; //Mario score/time Tracking Variables private Integer worldTimer; //private boolean timeUp; // true when the world timer reaches 0 private float timeCount; private static Integer score; //Scene2D widgets private Label countdownLabel; private Label scoreLabel; private Label timeLabel; private Label levelLabel; private Label worldLabel; private Label marioLabel; public Hud(SpriteBatch sb) { //define our tracking variables worldTimer = 300; timeCount = 0; score = 0; //setup the HUD viewport using a new camera seperate from our gamecam //define our stage using that viewport and our games spritebatch viewport = new FitViewport(MarioBros.V_WIDTH, MarioBros.V_HEIGHT, new OrthographicCamera()); stage = new Stage(viewport, sb); //define a table used to organize our hud's labels Table table = new Table(); //Top-Align table table.top(); //make the table fill the entire stage table.setFillParent(true); //define our labels using the String, and a Label style consisting of a font and color countdownLabel = new Label(String.format("%03d", worldTimer), new Label.LabelStyle(new BitmapFont(), Color.WHITE)); scoreLabel =new Label(String.format("%06d", score), new Label.LabelStyle(new BitmapFont(), Color.WHITE)); timeLabel = new Label("TIME", new Label.LabelStyle(new BitmapFont(), Color.WHITE)); levelLabel = new Label("1-1", new Label.LabelStyle(new BitmapFont(), Color.WHITE)); worldLabel = new Label("WORLD", new Label.LabelStyle(new BitmapFont(), Color.WHITE)); marioLabel = new Label("MARIO", new Label.LabelStyle(new BitmapFont(), Color.WHITE)); //add our labels to our table, padding the top, and giving them all equal width with expandX table.add(marioLabel).expandX().padTop(10); table.add(worldLabel).expandX().padTop(10); table.add(timeLabel).expandX().padTop(10); //add a second row to our table table.row(); table.add(scoreLabel).expandX(); table.add(levelLabel).expandX(); table.add(countdownLabel).expandX(); //add our table to the stage stage.addActor(table); } }
Код файла PlayScreen:
package com.mygdx.game.Screens; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.maps.tiled.TiledMap; import com.badlogic.gdx.maps.tiled.TmxMapLoader; import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; import com.badlogic.gdx.utils.viewport.FitViewport; import com.badlogic.gdx.utils.viewport.Viewport; import com.mygdx.game.MarioBros; import com.mygdx.game.Scenes.Hud; public class PlayScreen implements Screen { private MarioBros game; private OrthographicCamera gamecam; private Viewport gamePort; private Hud hud; //Tiled map variables private TmxMapLoader maploader; private TiledMap map; private OrthogonalTiledMapRenderer renderer; public PlayScreen(MarioBros game){ this.game = game; //create cam used to follow mario through cam world gamecam = new OrthographicCamera(); //create a FitViewport to maintain virtual aspect ratio despite screen size gamePort = new FitViewport(MarioBros.V_WIDTH, MarioBros.V_HEIGHT, gamecam); //create our game HUD for scores/timers/level info hud = new Hud(game.batch); //Load our map and setup our map renderer maploader = new TmxMapLoader(); map = maploader.load("level1.tmx"); renderer = new OrthogonalTiledMapRenderer(map, 1); //initially set our gamcam to be centered correctly at the start of of map gamecam.position.set(gamePort.getWorldWidth() / 2, gamePort.getWorldHeight() / 2, 0); } @Override public void show() { } private void handleInput(float dt) { if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) gamecam.position.x += 100 * dt;; if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) gamecam.position.x -= 100 * dt;; if(Gdx.input.isTouched()) gamecam.position.x += 100 * dt; } public void update(float dt) { //handle user input first handleInput(dt); //update our gamecam with correct coordinates after changes gamecam.update(); //tell our renderer to draw only what our camera can see in our game world. renderer.setView(gamecam); } @Override public void render(float delta) { //separate our update logic from render update(delta); //Clear the game screen with Black Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); renderer.render(); game.batch.setProjectionMatrix(hud.stage.getCamera().combined); hud.stage.draw(); } @Override public void resize(int width, int height) { gamePort.update(width, height); } @Override public void pause() { } @Override public void resume() { } @Override public void hide() { } @Override public void dispose() { } }
PS: О том как создать Desktop эмулятор в Android Studio читайте здесь – Android Studio и LibGDX: desktop эмулятор.
На этом все! Красивых вам игр и сайтов!