Русский
Русский
English
Статистика
Реклама

Механики ловушек и механизмов в Godot Engine

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

Но сразу скажу о некоторых моментах, которые должны быть реализованы в персонаже:
  1. Перемещение. Без него подойти к механизму или ловушке банально не выйдет
  2. Взаимодействие. Для активации объекта нужно вызвать определенный метод в объекте, если он существует. В данном цикле будет предположено, что это interact()
  3. Умение умирать. Персонаж должен умирать, чтобы в ловушках был смысл. Если персонаж не умеет умирать ловушки его не убьют, как бы глупо это не звучало

Итак я расскажу в этом коротком уроке о том как реализовать шипы, да односторонние порталы.

Шипы


Итак, начнём с шипов. Для того, чтобы их создать вам нужно реализовать следующую структуру файлов:

Некоторые пояснения: Spikes2D StaticBody2D, Timer нужен для периодического переключения состояния шипов, его сигнал timeout присоедините к скрипту. Сигнал body_entered от Area2D присоединить к скрипту в корне сцены.
А теперь приступим к написанию скрипта для этой сцены.
tool # чтобы сделать изменение состояния динамическимextends StaticBody2D# Основные 2 параметра.export (bool) var spikes_showed: bool = falseexport (bool) var timer_enabled: bool = false # Дублируем первые две переменные для того, чтобы динамически изменять.var spikes_showed_previous: bool = falsevar timer_enabled_previous: bool = falsefunc _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_showedfunc _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 # В этот раз мне было лень писать данный скрипт как toolexport (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 # переместить игрока в глобальное положение того узла, на который указывает NodePathfunc _on_AnimatedSprite_animation_finished():if $AnimatedSprite.animation == "portal_open":$AnimatedSprite.play("default")  # Если анимация открытия портала закончилась - включить анимацию default. Но можно без этой функции просто нарисовать спрайт и заставить его быть включенным всегда в цикле.

Главной особенностью портала является также то, что если два портала направить друг на друга они будут телепортировать игрока друг к другу, что не создаст цикл благодаря тому, что персонажу для использования портала нужно с ним взаимодействовать.

Заключение


Для начала этого под цикла статей думаю данной выпуска хватит. В 4 выпуске основной серии статей я расскажу о том как научить персонажа взаимодействовать с порталами, ключами и дверьми. И подкиньте в комментариях идеи механик, если вам интересно узнать их реализацию. Спасибо за прочтение и до следующих выпусков.
Источник: habr.com
К списку статей
Опубликовано: 18.10.2020 20:21:07
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Godot

Разработка игр

Gdscript

Программирование

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru