WFE for LibGDX

от
GameDev   wfe, libgdx, java

Вспомогательная библиотека к LibGDX 1.6.0.
Используется Java 8.


  Добрый день. Сегодня рассмотрим WFE for LibGDX ближе. Скачать главный модуль можно с форума.

Создание приложения
  Будем делать игру с использованием модуля карты. Цель игры - собрать все ящики с рыбой на карте.


  Создадим новый проект и подключим WFE_LibGDX.jar и libGDX(мой сборник библиотек на spaces)

В главном классе:
  1. public static void main(String[] args) {
  2.     new MainGameManager("TestMap", 600, 600, new TestMap()).start();
  3. }

Так как нет класса TestMap, значит, создадим его, унаследуем от ScreenGame(WFE) и реализуем абстрактные методы.
  1. public class TestMap extends ScreenGame{
  2.     @Override
  3.     public void init(){
  4.     }
  5.  
  6.     @Override
  7.     public void draw(Batch batch){
  8.     }

Запустим проект и увидим только окно 600 на 600. Закрываем окно.

Будем добавлять карту. Скачать файл карты можно с форума или сделать свою в редакторе. Использую этот тайлсет.
Пишем волшебные строчки и получаем:
  1. public class TestMap extends ScreenGame{
  2.  
  3.     TiledMap map;
  4.  
  5.     @Override
  6.     public void init(){
  7.         LoadTiledMap load = new LoadTiledMap("./map.bin");
  8.         map = load.load();
  9.     }
  10.  
  11.     @Override
  12.     public void draw(Batch batch){
  13.         map.draw(camera);
  14.     }
Тайлсет нужно положить рядом картой.

Запустим... Карта отображается.

Добавим объект:
  1. TiledObject ob;
  2. ...
  3.  
  4.         ob = new TiledObject();
  5.         ob.setSprite(new Sprite(new Texture(Gdx.files.local("./tiled.png"))));//Не буду заморачиваться с графикой объекта
  6.         ob.setSize(20, 20);
  7.         ob.initPhysics(map, map.getLayer("wall"));//Инициализируем физику объекта. Передаём ему карту и уровень с которым нужно проверять столкновение
  8.         ob.setPosition(10, 10);
  9.         map.getLayer("ground").addObject(ob);//Добавим объект на карту

Запустим и увидим 20 на 20 пикселей объект.

Теперь сделаем, так чтобы он подбирал ящики с рыбой.

Ну и сделаем так, чтобы камера следовала за игроком.
  1. @Override
  2. public void draw(Batch batch){
  3.     map.draw(camera);
  4.     camera.position.x = ob.getX();
  5.     camera.position.y = ob.getY();
  6.     map.processinExitBorder(camera);//Метод делает так, чтобы границы карты не были видны.
  7.  
  8.     int speed = 4;
  9.     if(Gdx.input.isKeyPressed(Keys.W)){
  10.         ob.moveY(speed);
  11.     }
  12.     if(Gdx.input.isKeyPressed(Keys.S)){
  13.         ob.moveY(-speed);
  14.     }
  15.     if(Gdx.input.isKeyPressed(Keys.D)){
  16.         ob.moveX(speed);
  17.     }
  18.     if(Gdx.input.isKeyPressed(Keys.A)){
  19.         ob.moveX(-speed);
  20.     }
  21. }

Мы знаем что id тайла рыбы равно 57, значит используем это.
  1. ob.collisionWall = new TiledObject.CollisionWall() {
  2.     @Override
  3.     public void collision(int xId, int yId, int dir){
  4.         TiledLayer l = map.getLayer("wall");
  5.         if(l.getCell(xId, yId).id == 57){
  6.             l.setCell(null, xId, yId);
  7.         }
  8.     }
  9. };
Метод интерфейса CollisionWall вызывается, когда происходит столкновение со стеной.

Запустим... Ящики собираются. Всё работает.

Добавим счетчик
  1. public class TestMap extends ScreenGame{
  2.  
  3.     TiledMap map;
  4.     TiledObject ob;
  5.  
  6.     Display display;
  7.  
  8.     int num = 0;
  9.     int maxNum = 1;
  10.     int id = 57;
  11.     boolean isCollisionInf = false;
  12.  
  13.     @Override
  14.     public void init(){
  15.         LoadTiledMap load = new LoadTiledMap("./map.bin");
  16.         map = load.load();
  17.  
  18.         ob = new TiledObject();
  19.         ob.setSprite(new Sprite(new Texture(Gdx.files.local("./ground.png"))));
  20.         ob.setSize(20, 20);
  21.         ob.initPhysics(map, map.getLayer("wall"));
  22.         ob.setPosition(10, 10);
  23.         ob.collisionWall = new TiledObject.CollisionWall() {
  24.             @Override
  25.             public void collision(int xId, int yId, int dir){
  26.                 TiledLayer l = map.getLayer("wall");
  27.                 if(l.getCell(xId, yId).id == id){
  28.                     num++;
  29.                     l.setCell(null, xId, yId);
  30.                 }            }
  31.         };
  32.         map.getLayer("ground").addObject(ob);
  33.         maxNum = map.getLayer("wall").getNymId(id);
  34.     }
  35.  
  36.  
  37.     @Override
  38.     public void draw(Batch batch){
  39.         map.draw(camera);
  40.         camera.position.x = ob.getX();
  41.         camera.position.y = ob.getY();
  42.         map.processinExitBorder(camera);
  43.  
  44.         int speed = 4;
  45.         if(Gdx.input.isKeyPressed(Keys.W)){
  46.             ob.moveY(speed);
  47.         }
  48.         if(Gdx.input.isKeyPressed(Keys.S)){
  49.             ob.moveY(-speed);
  50.         }
  51.         if(Gdx.input.isKeyPressed(Keys.D)){
  52.             ob.moveX(speed);
  53.         }
  54.         if(Gdx.input.isKeyPressed(Keys.A)){
  55.             ob.moveX(-speed);
  56.         }
  57.     }
Строчка maxNum = map.getLayer("wall").getNymId(id); вернёт нам количество тайлов с равным id.
Нашлась опечатка. На время написание статьи getNymId, но дальше будет как getNumId.

Сделаем так чтобы нас оповестили о том, что мы всё собрали.
  1. ob.collisionWall = new TiledObject.CollisionWall() {
  2.     @Override
  3.     public void collision(int xId, int yId, int dir){
  4.         TiledLayer l = map.getLayer("wall");
  5.         if(l.getCell(xId, yId).id == id){
  6.             num++;
  7.             l.setCell(null, xId, yId);
  8.             if(num == maxNum){
  9.                 TestMap.this.showInfo("Все собрано. Молодец!", 5000, display.camera);
  10.             }
  11.         }
  12.     }
  13. };

Метод showInfo отображает строку.
Скриншот

Ну и добавим мы отображение своё.
Код всего класса

Ну и, наконец, допишем наш игровой класс
Код

Метод render() будет вызываться после draw(Batch), если вам нужно что-то сделать перед рисованием, то используйте update().

Исходник:
Форум
+5   7   2
967