Приветствие
Всем привет, я Даня Блинчик
Несмотря на то, что я являюсь новичком в программировании и в игровой разработке. Я решил начать уже сейчас вносить свой вклад в сообщество в котором я хочу находиться — Defold. А не ждать того момента, когда я стану опытным специалистом и уже смогу что-то предпринять для развития этого сообщества
Поставленная задача перед самим собой
Разобрать примеры проектов одного из члена команды Defold — britzl.
Постараться объяснить чужой код самостоятельно.
Зачем я это делаю?
Я полагаю, что таким образом я смогу лучше понять игровую разработку в целом, я смогу лучше освоить игровой движок. Также, мне не нравится тот факт, что в Defold мало обучающегося материала для новичков. Я хочу попробовать исправить это.
Для кого я это делаю?
Я собираюсь писать эти посты преимущественно на русском языке, привлекая новичков из стран СНГ. К тому же, я плохо владею английским языком на данный момент. И если я буду переводить этот текст на английский язык, то, мне кажется, это будет равносильно тому, что какой-нибудь иностранец воспользуется переводом страницы от google (я так думаю), поэтому, пока что я не вижу смысла в том, чтобы писать на английском.
Новичкам
Я предполагаю, что у вас уже установлен Defold, если нет, перейдите по этой ссылке: Добро пожаловать в Defold.
Также, будет плюсом, если вы хотя бы поверхностно знакомы со строительными блоками Defold. Если нет, ознакомиться с основными концепциями Defold можно на официальном сайте — перейдите по этой ссылке.
Первым проектом, который мы разберём с вами будет — Tilemap collisions.
Попробуй этот проект в действии: запустить пример.
Исходная папка с проектом: ссылка на github.
Скачиваем папку с примерами и запускаем проект
Скачиваем архив с примерами проектов из github
Распаковываем скачанный ZIP архив примеров в любую папку во вашему усмотрению.
Переходим в папку examples
.
Ищем проект tilemap_collisions
.
Открываем game.project
.


Запускаем пример на клавишу f5
на клавиатуре (по умолчанию на Windows).
Что мы можем увидеть в запущенном примере?
Я вижу:
- Какой-то альбомный рисунок, какую-то сцену в горизонтальной альбомной ориентации.
- Когда мы нажимаем левую клавиши мыши на экране этого рисунка, у нас создаётся объект.
- Когда созданный объект создан, он начинает падать вниз.
- Когда созданный объект падает на землю, он отскакивает от земли.
- Когда созданный объект соприкасается с некоторыми объектами он отталкивается.
- Когда созданный объект соприкасается с некоторым объектом, он исчезает с экрана.
- На сцене мы видим текст: “Click to spawn”.
Если я что-то упустил из виду, дайте знать
Разберём структуру проекта:
-
В папке
builtins
хранятся встроенные при создании проекта файлы, которые Defold использует по умолчанию в своей работе. Лезть в эту папку нужно только по необходимости. У нас нет необходимости в этом, поэтому мы не будем затрагивать содержимое этой папки. -
В папке
input
по умолчанию хранится файл, в котором можно привязать ввод данных. Например, с клавиатуры/геймпада/мыши к твоей игре. В этом проекте, с помощью настроек этого файла мы можем по нажатию левой кнопки мыши создать игровой объект. Потому что в этом файле указано: “При получении данных с ЛКМ(левой кнопки мыши) активировать действие — touch”. Далее, это действие будет обработано в скрипте.
-
В файле
game.project
у нас находятся настройки проекта. В нём мы можем задать название проекту, максимальное количество частиц, фабрик, тайлов и т.д. -
Папка
tilemap_collisions
является нашим основным местом работы в этом проекте. В ней хранятся папкаassets
с папкамиfonts
(содержит в себе шрифт) иimages
(содержит
в себе изображения). -
Файл
enemy.go
. Расширениеgo
указывает нам на то, что этот файл является прототипом игрового объекта(game object). Этот файл является чертежом, по которому мы будем иметь возможность создавать игровые объекты(представь, что этот файл — чертеж дома, по которому строители будут строить дом, множество однотипных домов). Когда мы нажимаем на ЛКМ, создаётся объект по образу и подобию указанном в этом файле.
-
Файл
game.collection
является структурой, по которой строится игра в этом проекте.
-
Файл
enemy.atlas
необходим для того, чтобы содержать в себе изображения, которые потом могут быть использованы в проекте. Например, в нашем случае, в атлас добавлено одно изображение, которое будет являться создаваемым игровым объектом. Ещё раз. Файл с расширениемatlas
нужен нам для того, чтобы мы могли использовать из этого файла изображения в нашей игре.
-
Файл
level.tilesource
содержит в себе изображение, которое будет разбивать это изображение на маленькие плитки, из которых мы потом сможем создать новое изображение(например, карту). Расширениеtilesource
говорит нам, что этот файл является"источником"
тайлов.
-
В файле
level.tilemap
содержится уровень, созданный из плиток, добавленных в файлlevel.tilesource
.
-
Файл
spawner.script
является скриптом, в нём находится код, который отвечает за процесс создания игрового объекта, его уничтожения.
Разбор ключевых моментов всего проекта:
Игрок нажимает на ЛКМ(левую кнопку мыши). Создаётся игровой объект. Игровой объект падает. При соприкосновении с тайловами объектами он отталкивается, меняя свою траекторию движения. При столкновении с шипами созданный игровой объект уничтожается.
enemy.go
enemy.go
хранит в себе компонент collisionobject
с 5 сферами, которые будут отвечать за столкновения с другими объектами столкновения. Без них, игровой объект не будет отталкиваться.Также,
enemy.go
хранит в себе спрайт, который берёт изображение из enemy.atlas
.
level.tilesource
Созданы две группы столкновений:
danger
и ground
. Одна группа будет уничтожать, вторая группа будет отталкивать игровой объект соответственно. Кликая на плитки, мы можем включить их в выбранную группу столкновений.
level.tilemap
В тайловой карте мы создаём карту для нашей игры, уровня из источника тайлов. Также, мы создаём там два слоя, один для декораций, другой для поверхности.
spawner.script
При инициализации скрипта отправляется сообщение текущему игровому объекту о том, что необходимо получить возможность считывать данные указанные в настройках game.input_binding
. Попробуйте удалить строку:
msg.post(".", "acquire_input_focus")
Запустите проект (f5). Нажмите на ЛКМ. Что происходит?
function init(self)
msg.post(".", "acquire_input_focus")
end
Если была нажата клавиша, в нашем случае клавиша ЛКМ, то создай игровой объект через фабрику указанный по координатам указателя мыши.
function on_input(self, action_id, action)
if action.pressed then
factory.create("#enemyfactory", vmath.vector3(action.x, action.y, 1))
end
end
Если игровой объект получит сообщение о том, что между объектом столкновения enemy.go
произошло столкновение с группой столкновений danger
, то enemy.go
будет удалён из игры.
function on_message(self, message_id, message, sender)
if message_id == hash("collision_response") and message.own_group == hash("danger") then
go.delete(message.other_id)
end
end
game.collections
В структуре этой коллекции находятся 2 игровых объекта:
- instruction, который содержит в себе компонент label, поясняющий нам на что нам нужно нажимать.
- level, содержащий в себе тайловую карту уровня. Фабрику, с помощью которого мы можем из кода в файле
spawner.scripts
создавать игровой объект enemy.go. Компонент spawner.scripts, с помощью которого как раз и подключаем логику для нашего игрового уровня. Объект столкновения для нашего уровня.
Полезные ссылки для чтения
The building blocks of Defold
Addressing in Defold
Message passing in Defold
Defold application lifecycle manual
Defold tile source manual
Factory component manual
Defold tile map manual
Ресурс Atlas
Компонент Tile Map
Надеюсь, кому-нибудь этот материал будет полезен.
Также, я буду рад получить обратную связь, чтобы в последующих постах я смог улучшить качество изложения/объяснений.
Всем спасибо за внимание