LibGDX на Android

Решил всё-таки учебник по Libgdx написать. Это не будет курс, который кусочно расскажет об этой библиотеке. Постараюсь полностью описать все возможные аспекты по порядку так, чтобы в итоге, основываясь на этих статьях, человек смог написать свою игру (:

Исходники

Для удобства работы, решил залить все исходники на github. Все старые туториалы уже залил, новые там же буду публиковать. Так что следим уроки по libgdx на github.

Сообщество

Страница проекта Libgdx. Так же можно посмотреться список игр разработанных на libgdx.

Полезные исходники, примеры

Отловить кнопку Back

При написании игры очень важно сохранять состояние игры при смене фокуса. При нажатии на кнопку Back было бы неплохо ставить игру на паузу или выводить какое-нибудь информационное сообщение (сохранить/загрузить/выйти). В целом всё довольно просто. Скорей всего у вас есть какой-то класс, который задан как обработчик событий (Screen+InputProcessor или Stage).

Gdx.input.setInputProcessor(this);

Если брать классы Screen+InputProcessor и Stage (вернее, если ваш класс наследует какой-нибудь из них), то вы переопределяли методы по обработке нажатий:

@Override
public boolean keyDown(int keycode) {
  if(keycode == Keys.BACK) {
    //что-то делаем при нажатии на кнопку back
    //Log.e("key", "back");
    return true;
  }
}

@Override
public boolean keyUp(int keycode) {
  if(keycode == Keys.BACK) {
    //что-то делаем, когда отпускаем кнопку back
    //Log.e("key", "back");
    return true;
  }
}

При нажатии на копку Back, наши манипуляции отработают, но игра всё равно завершится. Чтобы этого избежать, надо установить флаг после того, как задали обработчик. То есть, для того же класса наследуемого от Screen+InputProcessor будет в show() что-то вроде:

@Override
public void show() {
  ...
  Gdx.input.setInputProcessor(this);
  Gdx.input.setCatchBackKey(true);
}

LibGDX на Android: 46 комментариев

  1. Уведомление: Учебник по libGDX | Suvitruf's Blog

    1. Suvitruf Автор записи

      А что именно интересует? )

      Тему для статьи придумайте, напишу. Пока Box2D обкатываю. По нему может статьи будут скоро.

      1. Жеко

        Да, желательно по Box2D побольше :)
        А также:
        — прикручивание разных анимаций к персонажу (прыжок, бег, падение, повреждение…), как организовать и связать с Box2D;
        — Работа с Tiled, слоями, созданием создание тайловой карты и шейпов (есть тут 2 статьи, но не понятно именно с шейпами и мало информации как оно работает http://dpk.net/2011/05/01/libgdx-box2d-tiled-maps-full-working-example-part-1/).

        > Постараюсь полностью описать все возможные аспекты по порядку так, чтобы в итоге, основываясь на этих статьях, человек смог написать свою игру
        Для этого нужно писать статьи в ходе написания игры :) Например марио какого-то или соника…

        P.S. Спасибо за уроки, интерестно покопаться в исходниках. :)

        1. Suvitruf Автор записи

          Для этого нужно писать статьи в ходе написания игры :) Например марио какого-то или соника…

          А тут большая часть статей как раз так и вышло. Пока писал Bomberman’а и Lode Runner’а, параллельно эти статьи и появлялись)

          1. Жеко

            Ну так круто :) Интересует реализация ботов, структура класов и логика их. А так же как уровни делали, через Tiled Map Editor?

            1. Suvitruf Автор записи

              1) По ИИ скорей всего отдельную статейку сделаю.
              2) Уровни по разному. В бомбермене в коде. В Lode Runner в текстовых файлах. Вот первый левел как пример
              «0000800000000000001000000000
              4444444344444440001000000000
              0000000322222222221000087000
              0000000300004430004444444344
              0000070300004430000000000300
              4434444400004444444434444444
              0030000000000070000030000000
              4444444443444444444430000000
              0000000003000000000030000000
              0000000803222222222230008000
              0000344444400000000044444443
              0000300000009000080000000003
              4444444444444444444444444444
              »

              =D
              Тут просто, ибо мир клеточный.

  2. Евгений

    Подскажите как мне, задав инзначально эталонное разрешение 720х1280 — уменьшать все, при запуске на более маленьком разрешении? ТО есть у меня есть 720 на 1280, все рассчеты я веду на нем, все границы заданы там, а отображается все это на маленьком экране, как-будто камера уменьшила зум.

    1. Suvitruf Автор записи

      Да в целом никак. Проблема в том, что размер экрана устройств под Андройдам слишком варьируются. То есть, обычным уменьшением на один и тот же коэффициент по обеим осям не получится.

      Каждый по своему решает эту проблему. На PC с этим проще, ибо можно разрешение экрана самому поменять, чтобы игровые текстуры не были растянуты.

      1. Евгений

        А как сделать так, чтобы хотя бы сохранять пропорции. Пускай сбоку будет пустое пространство, но самое главное, чтобы все текстуры уменьшались в размерах и вписывались.

          1. Евгений

            А я уже решил и очень простым методом, бился над этим как новичек 2 дня) Оказывается в libGDX есть автоматическое масштабирование и оно осуществляется в классе Stage. Задаем самое популярное разрешение и уже пляшем от него. Если интересно, то могу поделиться как решил проблему)

              1. Евгений

                нет, текстуры не будут растянуты, будет происходить вписывание, а лишнее будет равномерно распределяться по сторонам. — это если размеры не пропорциональны. если же пропорциональны, то все будет вписываться. А если эталонное разрешение больше имеющегося, то все текстуры уменьшаются и наоборот.

            1. Suvitruf Автор записи

              То есть, по краям — пустое пространство оставалось?

              p.s. дайти линк на мануал, гляну ради интереса)

              1. Евгений

                а какой мануал нужен? я просто сидел и пробовал. мануала нет. Если интересно, то могу просто написать решение.

        1. Suvitruf Автор записи

          Я просто подобное делал ручками =/

          То есть, вписывал всё в экран. По высоте всегда влезает полностью, а по ширине по краям справа и слева заполнял чем-то.
          Или пустым пространством или какими-нить фоновыми текстурами.

          p.s. да, напишите решение, если не сложно, а то мне архитектура на основе scene2d не особо нравится (;

      2. Евгений

        Вся проблема моя упиралась в синхронизацию двух камер. Оказывается у класса SpriteBatch своя камера, а ей абсолютно пофиг что там я задавал. =)))
        ………………………………………………
        И так, задаем размеры, от которых будем вести все рассчеты и остальное:
        static final int VIRTUAL_WIDTH = 480;
        static final int VIRTUAL_HEIGHT = 800;
        static Stage stage;
        private SpriteBatch sb;
        ………………………………………………
        В create () пишем
        stage = new Stage(0, 0, true);
        и тут я заметил вот что и решил получить спрайтбач из стейджа)
        sb = stage.getSpriteBatch();

        То есть по теории теперь камера стала одна, синхронизированная)
        ………………………………………………
        Далее в render () рисуем:
        stage.getCamera().update();
        stage.getCamera().apply(Gdx.gl10);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        stage.act(Gdx.graphics.getDeltaTime());
        stage.draw();

        sb.begin();
        // тут рисуем текстурки
        sb.end();

        ………………………………………………
        А в resize (int width, int height) прописываем Viewport
        stage.setViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, true);
        // и выравниваем камеру по центру
        stage.getCamera().translate(-stage.getGutterWidth(), -stage.getGutterHeight(), 0);

        Вот =)

          1. Евгений

            Да не за что, на мой взгляд было бы очень хорошо обмениваться полезной инфой. Если есть скайп, то можно было бы облегчать друг другу работу, обмениваясь опытом. Правда я пока еще совсем зеленый и толку от меня мало. Но упертый))))

  3. Inferno

    Не мог бы ты сделать статью про позиционирование спрайта в Box2D. К примеру у меня есть тело и я хочу создать к нему спрайт. Я пробовал но не знаю сколько пикселей в 1m.

    Спасибо заранее.s

  4. LeeT

    Можете написать статейку о парсинге в libgdx? Просто делаю свою игрушку с различными уровнями типа angry birds, остановился пока на загрузке уровней из файла…

    1. Suvitruf Автор записи

      Ну это зависит от такого, какого вида у вас файлы. Я для Lode Runner уровни в текстовых файлах хранил, при загрузке уровня просто читал файл. Есть специальные редакторы для создания уровней, а потом использовать сгенерированные редактором уровни в Java. Что именно вам надо?)

      1. LeeT

        Можете показать как это все у вас реализована в вашей игре Lode Runner? Очень хотелось бы посмотреть.

  5. Nataly

    Большущее Вам спасибо за столь полезные статьи. Давно уже ручонки чешутся что-нибудь игрушечное сотворить, но было непонятно, с чего начать. И тут столь подробно и доступно все изложено. :)

  6. Rhythmbox

    Скажи, пожалуйста, есть ли возможность создать на этом движке аэрохоккей? Вид сверху, контролить шайбу и тд. Прокатит ли использовать физику этого движка? Или он написан только для платформеров?

      1. Rhythmbox

        Чем можно конкретно воспользоваться? Дашь пару советов, пожалуйста?

        1. Suvitruf Автор записи

          Для подобной игры проще свою физику написать, как мне кажется )
          Ну можно и в Box2D, сделав силу притяжения 0, а шайбу двигать импульсами.

  7. Роман

    Добрый день. У меня, наверное, странный вопрос к вам. Хочу делать игры, в одиночку (чтобы быть самому себе хозяином), но очень не хочу тратить время на обучение программированию. Даже не то что «не хочу», мне не лень учить язык программирования, мне просто довольно сложно выделить для этого время. Я дизайнер-график, визуальную составляющую игры могу создавать на лету, и хочется сразу видеть результат работы, без отладки кода, без изучения толстых мануалов. LibGDX мне интересна своей мультиплатформенностью, потому как не исключаю, что в будущем, набив руку, проекты можно будет и монетизировать; пугает именно необходимость кодинга. Насколько мне, взрослому человеку, изучавшему программирование еще в школе (причем примитивные языки начального уровня — BASIC, Pascal) целесообразно знакомиться с данной средой разработки? Нужно будет досконально изучить Java, и это отталкивает по причине, которую уже назвал. По-вашему, каковы мои перспективы с данной библиотекой? Стоит засучить рукава и начать учиться кодировать на Java, или если без программирования никак, тогда уж сразу браться за C++, или поискать для себя инструмент попроще, в котором можно собирать игры путём drag’n’drop, не погружаясь в код? FlashPunk, Flixel, Monkey и даже SDL отпадают как раз по причине моего неумения программировать. Остаются инструменты для «чайников» с минимальными требованиями к кодингу: Stencyl, Construct 2, Game Maker? Что посоветуете?

    1. Suvitruf Автор записи

      По-вашему, каковы мои перспективы с данной библиотекой? Стоит засучить рукава и начать учиться кодировать на Java, или если без программирования никак, тогда уж сразу браться за C++

      C++ посложнее Java будет.

      или поискать для себя инструмент попроще, в котором можно собирать игры путём drag’n’drop, не погружаясь в код?

      В таких конструкторах тоже сложно что-то путное сделать, если вообще не программировать. Попробуйте Construct 2 или Game Maker, может вам хватит их.

      p.s. если вы дизайнер, то может тогда им о останетесь? Найдёте команду, будет заниматься дизайном, а программировать будут другие компаньоны.

      1. Роман

        если вы дизайнер, то может тогда им о останетесь? Найдёте команду, будет заниматься дизайном, а программировать будут другие компаньоны

        Спасибо, уже пройденный этап. Предпоследний проект, в котором я принимал участие, развалился из-за того, что ведущий кодер решил уйти на заработки. С другой стороны сам я, будучи предпринимателем, не всегда могу выкроить время на хобби, что осложняет мою работу в качестве дизайнера в сторонних командах. Желание работать на себя вызревало годами.

        Ладно, в любом случае благодарю за ответ. Буду учить Java, может еще пригодится в жизни.

  8. Максим

    Еще не прочитал статьи, но надеюсь, что подробно написал. Спасибо!

  9. xmoonlight

    Хотелось бы узнать: как сделать переключение в 3D-режим как в игре Sokoban Garden 3D? (они тоже разрабатывали с использованием этой библиотеки)
    PS: статьи — супер! СПАСИБО!

  10. Макс

    Очень классные статьи , огромное вам спасибо . Хотелось бы еще узнать
    как двигать камеру и персонажа если игровой мир гораздо больше размеров
    экрана ? Как организовать сохранение игрового процесса ? И как вводить
    текст , ну допустим как во всех рпг выскакивает табличка введите свое
    имя ? Был бы очень вам признателен за ответы на эти вопроссы.

  11. Александр

    Не подскажет ли кто-нибудь добрый исходники для самого простого Tower Defence, собранного в этой библиотеке?

  12. Уведомление: База знаний по libGDX. | JAVA ~0)

  13. Andrey Krasnoperov

    Здравствуйте! Правильно ли я понял, то что рекламу от AdMob можно встроить только в android версию. Есть ли возможность встроить рекламу в android, html и desktop версию одного проекта.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *