создаем карту в LibGDX Android Studio

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

Продолжаем создавать карту игры для LibGDX в данной статье мы создадим несколько слоев для карты, а также напишем небольшую игру в Android Studio для движения карты влево и вправо.

Если у Вас есть бизнес и Вы собираетесь создать красивый сайт, намного лучше чем у конкурентов, то , ведь сайт – это своего рода «визитная карточка» любой организации, фирмы или предприятия, то следует позаботиться о том, чтобы он был сделан профессионально, продуманно и качественно.

В Слое “background” мы просто зальём всю карту синим цветом:

1. выбираем слой “background”
2. находим Тайл в виде синего квадратика
3. выбираем инструмент “Заливка”
4. и заливаем синим цветом всю карту:

libgdxkarta13

В Слое graphics мы рисуем красивую фоновую картинку: тучки, горы и др., а также трубы и землю, по которым мы будем передвигаться и для которых в Слое ground зададим контуры.:

1. выбираем слой graphics
2. меняем инструмент на Штамп
3. рисуем, используя Тайлы

libgdxkarta14

Переходим к Слоям Объектов.

В Слое ground мы будем создавать землю, по которой будет ходить наш игрок:

1. выбираем слой ground
2. выбираем фигуру – Прямоугольник
3. выделяем всю землю до обрыва как одно целое
4. после обрыва опять выделяем всю землю до следующего обрыва.

libgdxkarta15

В слое pipes мы также с помощью фигуры Прямоугольник выделяем каждую трубу отдельно как одно целое:

libgdxkarta16

В слое coins (монетки) нужно выделить каждый ящики со знаком вопроса:

libgdxkarta17

Слой bricks (кирпичи) нужно выделять каждый кирпичик отдельно, так как игрок может разбить любой из них:

libgdxkarta18

Можно также создать и другие Слои, например слой “Враги” (на скриншоте ниже это слои Turtles и Goombas) и отметить, где они должны находится на карте:

libgdxkarta19

Всё осталось только сохранить карту (файл tmx) и закинуть её вместе с Tileset (файл png) в папку assets проекта игры.

Для примера, давайте напишем небольшую игру в Android Studio и LibGDX, в которой будем двигать карту с помощью стрелок влево и вправо.

Запускаем LibGDX:

libgdxkarta21

Здесь название пакета оставил по умолчанию: “com.mygdx.game”.

Заходим в Android Studio и импортируем проект, созданный в LibGDX:

Для этого в Android Studio в верхнем меню выбираем File -> New -> Import Project, в открывшемся окошке выбираем Import Project и находим папку, которую указали при создании проекта в LibGDX (в данном примере папка Mario):

libgdxkarta22

Далее закидываем карту, сделанную в программе Tiled (в данном примере, это файл level1.tmx и NES – Super Mario Bros – Tileset.png) в папку assets:

Скачать файл level1.tmx и NES – Super Mario Bros – Tileset.png можно здесь.

libgdxkarta23

Далее как на скриншоте создадим пакеты Screens и Scenes:

libgdxkarta24

И внутри них файлы – Hud и PlayScreen:

libgdxkarta25

А теперь изменим код файлов на следующий:

Код файла 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 эмулятор.

На этом все! Красивых вам игр и сайтов!