Решил всё-таки учебник по 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 | Suvitruf's Blog
а продолжения будут?
А что именно интересует? )
Тему для статьи придумайте, напишу. Пока Box2D обкатываю. По нему может статьи будут скоро.
Да, желательно по Box2D побольше :)
А также:
— прикручивание разных анимаций к персонажу (прыжок, бег, падение, повреждение…), как организовать и связать с Box2D;
— Работа с Tiled, слоями, созданием создание тайловой карты и шейпов (есть тут 2 статьи, но не понятно именно с шейпами и мало информации как оно работает http://dpk.net/2011/05/01/libgdx-box2d-tiled-maps-full-working-example-part-1/).
> Постараюсь полностью описать все возможные аспекты по порядку так, чтобы в итоге, основываясь на этих статьях, человек смог написать свою игру
Для этого нужно писать статьи в ходе написания игры :) Например марио какого-то или соника…
P.S. Спасибо за уроки, интерестно покопаться в исходниках. :)
А тут большая часть статей как раз так и вышло. Пока писал Bomberman’а и Lode Runner’а, параллельно эти статьи и появлялись)
Ну так круто :) Интересует реализация ботов, структура класов и логика их. А так же как уровни делали, через Tiled Map Editor?
1) По ИИ скорей всего отдельную статейку сделаю.
2) Уровни по разному. В бомбермене в коде. В Lode Runner в текстовых файлах. Вот первый левел как пример
«0000800000000000001000000000
4444444344444440001000000000
0000000322222222221000087000
0000000300004430004444444344
0000070300004430000000000300
4434444400004444444434444444
0030000000000070000030000000
4444444443444444444430000000
0000000003000000000030000000
0000000803222222222230008000
0000344444400000000044444443
0000300000009000080000000003
4444444444444444444444444444
»
=D
Тут просто, ибо мир клеточный.
Ясно :) Ну мне интересней .
Тут можно в тайловом редакторе уровни быстро делать. Если с колизией разобраться, можно не только квадратные уровни делать (. Когда разберусь, попробую тоже статью написать.
Подскажите как мне, задав инзначально эталонное разрешение 720х1280 — уменьшать все, при запуске на более маленьком разрешении? ТО есть у меня есть 720 на 1280, все рассчеты я веду на нем, все границы заданы там, а отображается все это на маленьком экране, как-будто камера уменьшила зум.
Да в целом никак. Проблема в том, что размер экрана устройств под Андройдам слишком варьируются. То есть, обычным уменьшением на один и тот же коэффициент по обеим осям не получится.
Каждый по своему решает эту проблему. На PC с этим проще, ибо можно разрешение экрана самому поменять, чтобы игровые текстуры не были растянуты.
А как сделать так, чтобы хотя бы сохранять пропорции. Пускай сбоку будет пустое пространство, но самое главное, чтобы все текстуры уменьшались в размерах и вписывались.
Могу статейку написать на эту тему.
А я уже решил и очень простым методом, бился над этим как новичек 2 дня) Оказывается в libGDX есть автоматическое масштабирование и оно осуществляется в классе Stage. Задаем самое популярное разрешение и уже пляшем от него. Если интересно, то могу поделиться как решил проблему)
Так тогда текстуры растянуты будут, нэ?
нет, текстуры не будут растянуты, будет происходить вписывание, а лишнее будет равномерно распределяться по сторонам. — это если размеры не пропорциональны. если же пропорциональны, то все будет вписываться. А если эталонное разрешение больше имеющегося, то все текстуры уменьшаются и наоборот.
То есть, по краям — пустое пространство оставалось?
p.s. дайти линк на мануал, гляну ради интереса)
а какой мануал нужен? я просто сидел и пробовал. мануала нет. Если интересно, то могу просто написать решение.
да, по краям пустое пространство, равномерно)
Я просто подобное делал ручками =/
То есть, вписывал всё в экран. По высоте всегда влезает полностью, а по ширине по краям справа и слева заполнял чем-то.
Или пустым пространством или какими-нить фоновыми текстурами.
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);
Вот =)
Спасибо, посмотрю на днях)
Да не за что, на мой взгляд было бы очень хорошо обмениваться полезной инфой. Если есть скайп, то можно было бы облегчать друг другу работу, обмениваясь опытом. Правда я пока еще совсем зеленый и толку от меня мало. Но упертый))))
Не мог бы ты сделать статью про позиционирование спрайта в Box2D. К примеру у меня есть тело и я хочу создать к нему спрайт. Я пробовал но не знаю сколько пикселей в 1m.
Спасибо заранее.s
Как будет время)
Ясно спасибо)
Можете написать статейку о парсинге в libgdx? Просто делаю свою игрушку с различными уровнями типа angry birds, остановился пока на загрузке уровней из файла…
Ну это зависит от такого, какого вида у вас файлы. Я для Lode Runner уровни в текстовых файлах хранил, при загрузке уровня просто читал файл. Есть специальные редакторы для создания уровней, а потом использовать сгенерированные редактором уровни в Java. Что именно вам надо?)
Можете показать как это все у вас реализована в вашей игре Lode Runner? Очень хотелось бы посмотреть.
В след. статье покажу тогда)
Большущее Вам спасибо за столь полезные статьи. Давно уже ручонки чешутся что-нибудь игрушечное сотворить, но было непонятно, с чего начать. И тут столь подробно и доступно все изложено. :)
Рад, что кому-то статьи пригодились)
Скажи, пожалуйста, есть ли возможность создать на этом движке аэрохоккей? Вид сверху, контролить шайбу и тд. Прокатит ли использовать физику этого движка? Или он написан только для платформеров?
В принципе, покатит.
Чем можно конкретно воспользоваться? Дашь пару советов, пожалуйста?
Для подобной игры проще свою физику написать, как мне кажется )
Ну можно и в Box2D, сделав силу притяжения 0, а шайбу двигать импульсами.
Добрый день. У меня, наверное, странный вопрос к вам. Хочу делать игры, в одиночку (чтобы быть самому себе хозяином), но очень не хочу тратить время на обучение программированию. Даже не то что «не хочу», мне не лень учить язык программирования, мне просто довольно сложно выделить для этого время. Я дизайнер-график, визуальную составляющую игры могу создавать на лету, и хочется сразу видеть результат работы, без отладки кода, без изучения толстых мануалов. LibGDX мне интересна своей мультиплатформенностью, потому как не исключаю, что в будущем, набив руку, проекты можно будет и монетизировать; пугает именно необходимость кодинга. Насколько мне, взрослому человеку, изучавшему программирование еще в школе (причем примитивные языки начального уровня — BASIC, Pascal) целесообразно знакомиться с данной средой разработки? Нужно будет досконально изучить Java, и это отталкивает по причине, которую уже назвал. По-вашему, каковы мои перспективы с данной библиотекой? Стоит засучить рукава и начать учиться кодировать на Java, или если без программирования никак, тогда уж сразу браться за C++, или поискать для себя инструмент попроще, в котором можно собирать игры путём drag’n’drop, не погружаясь в код? FlashPunk, Flixel, Monkey и даже SDL отпадают как раз по причине моего неумения программировать. Остаются инструменты для «чайников» с минимальными требованиями к кодингу: Stencyl, Construct 2, Game Maker? Что посоветуете?
C++ посложнее Java будет.
В таких конструкторах тоже сложно что-то путное сделать, если вообще не программировать. Попробуйте Construct 2 или Game Maker, может вам хватит их.
p.s. если вы дизайнер, то может тогда им о останетесь? Найдёте команду, будет заниматься дизайном, а программировать будут другие компаньоны.
если вы дизайнер, то может тогда им о останетесь? Найдёте команду, будет заниматься дизайном, а программировать будут другие компаньоны
Спасибо, уже пройденный этап. Предпоследний проект, в котором я принимал участие, развалился из-за того, что ведущий кодер решил уйти на заработки. С другой стороны сам я, будучи предпринимателем, не всегда могу выкроить время на хобби, что осложняет мою работу в качестве дизайнера в сторонних командах. Желание работать на себя вызревало годами.
Ладно, в любом случае благодарю за ответ. Буду учить Java, может еще пригодится в жизни.
Еще не прочитал статьи, но надеюсь, что подробно написал. Спасибо!
Хотелось бы узнать: как сделать переключение в 3D-режим как в игре Sokoban Garden 3D? (они тоже разрабатывали с использованием этой библиотеки)
PS: статьи — супер! СПАСИБО!
Спасибо за труд.
Очень классные статьи , огромное вам спасибо . Хотелось бы еще узнать
как двигать камеру и персонажа если игровой мир гораздо больше размеров
экрана ? Как организовать сохранение игрового процесса ? И как вводить
текст , ну допустим как во всех рпг выскакивает табличка введите свое
имя ? Был бы очень вам признателен за ответы на эти вопроссы.
Не подскажет ли кто-нибудь добрый исходники для самого простого Tower Defence, собранного в этой библиотеке?
Уведомление: База знаний по libGDX. | JAVA ~0)
Я с libgdx работал, когда оно ещё не под Gradle собиралось. Не могу в этом плане помочь поэтому =
Здравствуйте! Правильно ли я понял, то что рекламу от AdMob можно встроить только в android версию. Есть ли возможность встроить рекламу в android, html и desktop версию одного проекта.