LibGDX на Android

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

Исходники

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

Сообщество

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

Для связи и для поиска материалов:

Forum: http://badlogicgames.com/forum

IRC: irc.freenode.net, #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);
}
  • Pingback: Учебник по libGDX | Suvitruf's Blog()

  • akuba

    а продолжения будут?

    • http://suvitruf.ru Suvitruf

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

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

      • Жеко

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

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

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

  • Евгений

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

    • http://suvitruf.ru Suvitruf

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

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

      • Евгений

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

        • http://suvitruf.ru Suvitruf

          Могу статейку написать на эту тему.

          • Евгений

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

            • http://suvitruf.ru Suvitruf

              Так тогда текстуры растянуты будут, нэ?

              • Евгений

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

            • http://suvitruf.ru Suvitruf

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

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

              • Евгений

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

      • Евгений

        да, по краям пустое пространство, равномерно)

        • http://suvitruf.ru Suvitruf

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

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

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

      • Евгений

        Вся проблема моя упиралась в синхронизацию двух камер. Оказывается у класса 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);

        Вот =)

        • http://suvitruf.ru Suvitruf

          Спасибо, посмотрю на днях)

          • Евгений

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

  • Inferno

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

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

    • http://suvitruf.ru Suvitruf

      Как будет время)

      • Inferno

        Ясно спасибо)

  • LeeT

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

    • http://suvitruf.ru Suvitruf

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

      • LeeT

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

        • http://suvitruf.ru Suvitruf

          В след. статье покажу тогда)

  • Nataly

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

    • http://suvitruf.ru Suvitruf

      Рад, что кому-то статьи пригодились)

  • Rhythmbox

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

    • http://suvitruf.ru Suvitruf

      В принципе, покатит.

      • Rhythmbox

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

        • http://suvitruf.ru Suvitruf

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

  • Роман

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

    • http://suvitruf.ru Suvitruf

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

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

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

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

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

      • Роман

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

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

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

  • Максим

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

  • xmoonlight

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

  • Юрий

    Спасибо за труд.

  • Макс

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

  • Александр

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

  • Pingback: База знаний по libGDX. | JAVA ~0)()

  • http://suvitruf.ru/ Андрей

    Я с libgdx работал, когда оно ещё не под Gradle собиралось. Не могу в этом плане помочь поэтому =

  • Andrey Krasnoperov

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