[Разработка игр, Godot] Механики ловушек и механизмов в Godot Engine
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Здравствуйте. Эта статья — ответвление от цикла статей по механикам для реализации платформеров, так как здесь я буду рассказывать о создании ловушек и механизмов, которые могут быть использованы не только в платформерах.
Но сразу скажу о некоторых моментах, которые должны быть реализованы в персонаже:
- Перемещение. Без него подойти к механизму или ловушке банально не выйдет
- Взаимодействие. Для активации объекта нужно вызвать определенный метод в объекте, если он существует. В данном цикле будет предположено, что это interact()
- Умение умирать. Персонаж должен умирать, чтобы в ловушках был смысл. Если персонаж не умеет умирать — ловушки его не убьют, как бы глупо это не звучало
Итак я расскажу в этом коротком уроке о том как реализовать шипы, да односторонние порталы.
Шипы
Итак, начнём с шипов. Для того, чтобы их создать вам нужно реализовать следующую структуру файлов:
Некоторые пояснения: Spikes2D — StaticBody2D, Timer нужен для периодического переключения состояния шипов, его сигнал timeout присоедините к скрипту. Сигнал body_entered от Area2D присоединить к скрипту в корне сцены.
А теперь приступим к написанию скрипта для этой сцены.
tool # чтобы сделать изменение состояния динамическим
extends StaticBody2D
# Основные 2 параметра.
export (bool) var spikes_showed: bool = false
export (bool) var timer_enabled: bool = false
# Дублируем первые две переменные для того, чтобы динамически изменять.
var spikes_showed_previous: bool = false
var timer_enabled_previous: bool = false
func _process(_delta: float) -> void:
if self.timer_enabled and $Timer.is_stopped():
$Timer.start() # Если self.timer_enabled == true и $Timer остановлен - запустить таймер
if self.spikes_showed != self.spikes_showed_previous:
if self.spikes_showed:
$AnimatedSprite.play("show") # Нужны 2 анимации.
else:
$AnimatedSprite.play("hide")
self.spikes_showed_previous = self.spikes_showed
func _on_Area2D_body_entered(body: Node) -> void:
if body.name.ends_with("Actor") and self.spikes_showed:
body.dead()
func _on_Timer_timeout() -> void:
if self.timer_enabled:
self.spikes_showed = !self.spikes_showed
$Timer.start()
Этого хватит чтобы убить игрока по соприкосновению с выдвигающимися шипами.
Телепорт
Сегодня(18 октября 2020 года) я потрудился придумать телепорт во второй раз. Но в отличии от первой попытки я не создавал отдельного Position2D в сцене телепорта, а просто добавил NodePath как экспортируемую переменную, чтобы указать объект к позиции которого нужно телепортироваться. Для того чтобы всё работало как надо достаточно создать следующую структуру:
Мне было в лом обрезать фото, да так думаю будет более наглядно показано, что как выглядит
И вот скрипт отдельно, чтобы не создавать трудности при перепечатывании:
extends Area2D # В этот раз мне было лень писать данный скрипт как tool
export (bool) var portal_opened: bool = false # Указывает - открыт ли портал, что можно понять из названия
export (NodePath) var destination_node: NodePath # Узел к которому этот объект будет телепортировать. Должен иметь параметр position чтобы игра не сломалась.
func interact(portal_user: Node):
if portal_user.name.ends_with("Actor"):
if (destination_node != null): # Если выбрали нужный узел в редакторе
portal_user.global_position = get_node(destination_node).global_position # переместить игрока в глобальное положение того узла, на который указывает NodePath
func _on_AnimatedSprite_animation_finished():
if $AnimatedSprite.animation == "portal_open":
$AnimatedSprite.play("default") # Если анимация открытия портала закончилась - включить анимацию default. Но можно без этой функции просто нарисовать спрайт и заставить его быть включенным всегда в цикле.
Главной особенностью портала является также то, что если два портала направить друг на друга — они будут телепортировать игрока друг к другу, что не создаст цикл благодаря тому, что персонажу для использования портала нужно с ним взаимодействовать.
Заключение
Для начала этого под цикла статей думаю данной выпуска хватит. В 4 выпуске основной серии статей я расскажу о том как научить персонажа взаимодействовать с порталами, ключами и дверьми. И подкиньте в комментариях идеи механик, если вам интересно узнать их реализацию. Спасибо за прочтение и до следующих выпусков.
===========
Источник:
habr.com
===========
Похожие новости:
- [Unity, C#, Разработка игр] Как мы переосмыслили работу со сценами в Unity
- [Занимательные задачки, Python, Учебный процесс в IT, Логические игры] DataArt запустил бесплатную платформу Kiddo — онлайн-задачник для школьников, изучающих Питон
- [Godot, Разработка игр] Механики для реализации платформера на Godot engine. 3 часть
- [Промышленное программирование, Космонавтика, Научно-популярное, IT-компании] Определённо не Windows 95: какие операционные системы поддерживают работу в космосе, ч. 2 (перевод)
- [C++, CGI (графика), Программирование, Работа с 3D-графикой, Разработка игр] Vulkan-tutorial. Урок 1.1 — Вступление (перевод)
- [Программирование, Java, Конференции, Микросервисы] 29 октября приглашаем на онлайн-митап Hot Java
- [Программирование, Разработка под Android] Избегайте внедрения внешних библиотек в свой проект
- [Ненормальное программирование, C, C++, Совершенный код, Программирование] Металингвистический совратитель Си. Опус I: Предварительные ласки
- [Учебный процесс в IT, Карьера в IT-индустрии, Краудсорсинг, Интервью] Структурирование информации, критическое мышление и трудоустройство в лучшие ИТ-компании мира
- [Конференции, Промышленное программирование] Приглашаем на промышленный виртуальный форум Advantech
Теги для поиска: #_razrabotka_igr (Разработка игр), #_godot, #_gdscript, #_programmirovanie (программирование), #_razrabotka_igr (
Разработка игр
), #_godot
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 00:25
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Здравствуйте. Эта статья — ответвление от цикла статей по механикам для реализации платформеров, так как здесь я буду рассказывать о создании ловушек и механизмов, которые могут быть использованы не только в платформерах. Но сразу скажу о некоторых моментах, которые должны быть реализованы в персонаже:
Итак я расскажу в этом коротком уроке о том как реализовать шипы, да односторонние порталы. Шипы Итак, начнём с шипов. Для того, чтобы их создать вам нужно реализовать следующую структуру файлов: Некоторые пояснения: Spikes2D — StaticBody2D, Timer нужен для периодического переключения состояния шипов, его сигнал timeout присоедините к скрипту. Сигнал body_entered от Area2D присоединить к скрипту в корне сцены. А теперь приступим к написанию скрипта для этой сцены. tool # чтобы сделать изменение состояния динамическим
extends StaticBody2D # Основные 2 параметра. export (bool) var spikes_showed: bool = false export (bool) var timer_enabled: bool = false # Дублируем первые две переменные для того, чтобы динамически изменять. var spikes_showed_previous: bool = false var timer_enabled_previous: bool = false func _process(_delta: float) -> void: if self.timer_enabled and $Timer.is_stopped(): $Timer.start() # Если self.timer_enabled == true и $Timer остановлен - запустить таймер if self.spikes_showed != self.spikes_showed_previous: if self.spikes_showed: $AnimatedSprite.play("show") # Нужны 2 анимации. else: $AnimatedSprite.play("hide") self.spikes_showed_previous = self.spikes_showed func _on_Area2D_body_entered(body: Node) -> void: if body.name.ends_with("Actor") and self.spikes_showed: body.dead() func _on_Timer_timeout() -> void: if self.timer_enabled: self.spikes_showed = !self.spikes_showed $Timer.start() Этого хватит чтобы убить игрока по соприкосновению с выдвигающимися шипами. Телепорт Сегодня(18 октября 2020 года) я потрудился придумать телепорт во второй раз. Но в отличии от первой попытки я не создавал отдельного Position2D в сцене телепорта, а просто добавил NodePath как экспортируемую переменную, чтобы указать объект к позиции которого нужно телепортироваться. Для того чтобы всё работало как надо достаточно создать следующую структуру: Мне было в лом обрезать фото, да так думаю будет более наглядно показано, что как выглядит И вот скрипт отдельно, чтобы не создавать трудности при перепечатывании: extends Area2D # В этот раз мне было лень писать данный скрипт как tool
export (bool) var portal_opened: bool = false # Указывает - открыт ли портал, что можно понять из названия export (NodePath) var destination_node: NodePath # Узел к которому этот объект будет телепортировать. Должен иметь параметр position чтобы игра не сломалась. func interact(portal_user: Node): if portal_user.name.ends_with("Actor"): if (destination_node != null): # Если выбрали нужный узел в редакторе portal_user.global_position = get_node(destination_node).global_position # переместить игрока в глобальное положение того узла, на который указывает NodePath func _on_AnimatedSprite_animation_finished(): if $AnimatedSprite.animation == "portal_open": $AnimatedSprite.play("default") # Если анимация открытия портала закончилась - включить анимацию default. Но можно без этой функции просто нарисовать спрайт и заставить его быть включенным всегда в цикле. Главной особенностью портала является также то, что если два портала направить друг на друга — они будут телепортировать игрока друг к другу, что не создаст цикл благодаря тому, что персонажу для использования портала нужно с ним взаимодействовать. Заключение Для начала этого под цикла статей думаю данной выпуска хватит. В 4 выпуске основной серии статей я расскажу о том как научить персонажа взаимодействовать с порталами, ключами и дверьми. И подкиньте в комментариях идеи механик, если вам интересно узнать их реализацию. Спасибо за прочтение и до следующих выпусков. =========== Источник: habr.com =========== Похожие новости:
Разработка игр ), #_godot |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 00:25
Часовой пояс: UTC + 5