Godot Engine

Godot Engine

Nicht genug Bewertungen
Switch-Case в Godot (Match)
Von Ametero
Расскажу как использовать Switch-Case оператор в скриптах для ваших игр
   
Preis verleihen
Favorisieren
Favorisiert
Entfernen
1. Так кто этот ваш Switch-Case
Конструкция "switch"
Конструкция switch заменяет собой сразу несколько if.

Она представляет собой более наглядный способ сравнить выражение сразу с несколькими вариантами.


Информация взята с JS Learn[learn.javascript.ru]

Пример конструкции "switch" на JavaScript
2. Зачем мне использовать этот ваш switch-case
Зачастую его используют из за удобства и более высокой скорости обработки по сравнению использования if-else

Рекомендую использовать Switch-Case, а не If-Else
Если вы знаете такую игру как Yandere Simulator, так вот, проще говоря его код ♥♥♥♥♥♥ как не производителен, из-за использования связки if-else ВСЕГДА, YandereDev ТОЛЬКО один раз использовал Switch-Case

Почему его код не производителен

  1. Движок игры будет ВСЕГДА проверять условия if-else, а Switch-Case по вызову
    P.S. Дальше некоторые комментарии будут не по коду
  2. Самая реалистичная модель, используемая всегда и везде (Вы увидите её 1-3 раза) - Зубная ♥♥♥♥ щётка
  3. ИИ соперницы выполнен на таком же говно коде (If-Else)
  4. Игра склёпана из Unity Assets Store (Это ещё простимо)

Пример говно-кода (C#) и нормального кода (C#)

Пример говно-кода (Смотреть комментарий ниже)
int a = 2, b = 10;
if (a == b) { // Если a будет равным b, тогда будет выполнен код
// Здесь код что будет выполнен
// Если все одна строка кода, то фигурные скобки {}
// можно не ставить
} else if (a <= b) { // Если а будет меньшим или равным b
// Если предыдущее условие не будет выполнено,
// а здесь условие окажется верным,
// то будет выполнен этот код
} else {
// Этот код сработает, если другие условия не будут выполнены
}
Повторить примерно 6-10 раз и будет говно код


------------------------------------------------------------------

Пример нормального кода
int x = 23;
switch (x) { // Проверяем переменную x
case 1: // Если переменная будет равна 1, то здесь сработает код
// Может быть множество строк, а не только одна
printf("Переменная равна 1\n");
break; // Указываем конец для кода для этой проверки
case 56: // Если переменная будет равна 56, то здесь сработает код
// Может быть множество строк, а не только одна
printf("Переменная равна 56\n");
break; // Указываем конец для кода для этой проверки
// По аналогии таких проверок может быть множество
// Также можно добавить проверку, которая сработает в случае
// если все остальные проверки не сработают
default:
printf("Что-то другое\n");
break; // Можно и не ставить, так как это последние условие}


Код взят с статьи https://itproger.com/course/c-programming/4


3. Как использовать Switch-Case в Godot
Как не удивительно , Switch-Case есть в GDscriptах, но он облегчён и по другому называется, а быть точнее match

Как обычно создаём любую сцену и проект, поскольку будем выводить в Консоль

ВРЕМЯ ПИСАТЬ КОД!

  1. Создаём сцену и скрипт
  2. Прикрепляем скрипт к сцене
  3. Подготовления закончены!

Сам код :

Пояснение за код

extends Node - Наследуем Ноду
var ypta = 55 - Объявляем переменную ypta с значением 55 (Можно менять, далее объясню кое-что человеческим языком)
func _on_ready(): - База базированная, выполняет остальной код в функции если запущенно
match ypta: - Обозначаем переменную для проверки (В этом случае Switch-Case будет проверять переменную ypta)
false: - (Если значение переменной равно fasle, то выполнить этот код)
print("Чао какао ♥♥♥♥!")
true: - (Если значение переменной равно true, то выполнить этот код)
print("Ну ладно, ты не гопник")
"net": - (Если значение переменной равно net, то выполнить этот код)
print("Сеть и ♥♥♥♥♥, мне эта информация")
228: - (Если значение переменной равно 228, то выполнить этот код)
print("Звучит как статья")
_: - (Если значение переменной равно не какому из этих, то выполнить этот код)
print("Ответь false или true уе и бан")


Объяснение на человеческом языке

Switch-Case берёт переменную ypta и сверяет с условиями :
  1. Если переменная равна false, в консоле будет сообщение "Чао какао ♥♥♥♥!"
  2. Если переменная равна true, в консоле будет сообщение "Ну ладно, ты не гопник"
  3. Если переменная равна net, в консоле будет сообщение "Сеть и ♥♥♥♥♥, мне эта информация"
  4. Если переменная равна 228, в консоле будет сообщение "Звучит как статья"
  5. Если переменная не совпадает не с каким из условий, в консоле будет сообщение "Ответь false или true уе и бан"

То есть _: - это как default в нормальном switch-case

Вот пару совет если вы знаете Switch-Case

  • Заменяйте switch на match.
  • Удаляйте case.
  • Удаляйте ЛЮБЫЕ break.
  • Заменяйте default на нижние подчёркивания.
4. Конец
Ну что сказать, конец как конец. Напишите по поводу чего ещё написать гайд
7 Kommentare
TheDmitry 21. Nov. 2024 um 8:29 
match - более строгий к типизации.
match - не обязательно быстрее. (В годоте это синтаксический сахар над if...else, здесь нет хэш-таблиц для switch-а, как у той же JVM, да и там есть проблема, если switch case будет преобразован в switchlookup конструкцию в байткоде)
Наличие в языке патерн матчинга - не повод его везде использовать.

(Под копотом - берется некое значение, над которым выполняется патерн матчинг, затем происходит итерация по всем возможным значениям, происходит строгое сравнение. Если такого не найдено - переходим в default бренч)
BuEnOs_Días 21. Aug. 2024 um 10:41 
Есть много ситуаций когда ифы и кейсы можно избежать, простой пример:
$Node2D.scale.x = sign(velocity.x)
Вместо:
if velocity.x > 0:
$Node2D.scale.x = 1.0
else:
$Node2D.scale.x = -1.0
BuEnOs_Días 21. Aug. 2024 um 10:41 
Есть такая игра VVVVVV от Terry Cavanagh, практически вся логика в ней написана свич кейсом, и это главная причина почему на эту игру трудно делать модификации. Потому что никто, кроме создателя не может разобраться в этом макаронном монстре. Не стоит так запутывать новичков, использование if-else и match-case сугубо зависит от ситуации. А вот станет ли написанное говнокодом зависит от разработчика, говнокод и с помощью switch-case конструкции написать можно
Haralgin 14. Juli 2024 um 3:31 
это поможет мне избежать сраных null instance!
0l0id 27. Juni 2024 um 7:26 
Харош
zxcviktordeboshir 26. Mai 2024 um 8:32 
красавчик чел крутой ваще без базару :steamthumbsup::GDNormal:
denoglu 14. Jan. 2024 um 19:55 
спасибо за инфу, раньше всегда использовал if esle, так как не знал других способов, но теперь зная это, и зная что это оптимизировано, буду стараться использовать твой вариант