Продолжаем создавать карту игры для 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):
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение
Далее закидываем карту, сделанную в программе 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 эмулятор.
На этом все! Красивых вам игр и сайтов!

