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




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

Но сразу скажу о некоторых моментах, которые должны быть реализованы в персонаже:

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

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

Шипы


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


Некоторые пояснения: 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: # Если timer_enabled == true -- переключить состояние шипов.
		self.spikes_showed = !self.spikes_showed
		$Timer.start()

Этого хватит чтобы убить игрока по соприкосновению с включенными шипами.

Телепорт


Для того чтобы всё работало как надо достаточно создать следующую структуру:

Думаю будет более наглядно показано, что как выглядит эта сцена в целом

И вот скрипт отдельно, чтобы не создавать трудности при перепечатывании:
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 выпуске основной серии статей я расскажу о том как научить персонажа взаимодействовать с порталами, ключами и дверьми. И подкиньте в комментариях идеи для механик, если вам интересно узнать их реализацию. Спасибо за прочтение и до следующих выпусков.




Комментарии (4):

  1. Sorvs71
    /#22195958

    Спасибо огромное. Обязательно попробую.

    • stalker320
      /#22195964

      Да не за что. Если кто-то будет делать качественные уроки, движок в свою очередь станет более интересен, следовательно, появятся те кто будет тоже публиковать свои уроки по созданию тех или иных механик, что в свою очередь постепенно повысит качество всего общества, использующего движок.

  2. Teashrock
    /#22199334

    *смотрю на скрины*
    Ёлки. Шрифт — говно. Это нечитаемо.

    Первый коммент, и сейчас будет туча минусов, да?

    • stalker320
      /#22199358

      У каждого свои вкусы. Мне не очень понравился стандартный шрифт. Он был мыльным, поэтому поставил то, что показалось интересным. Если большинству не будет нравиться — я буду ставить стандартный шрифт для каждого фото. Мне не сложно. И да, спасибо за то что сказал. Просто никто до тебя не поднимал эту тему и всегда кажется что всё всех устраивает.