#godot #gdscript
#godot #gdscript
Вопрос:
У меня есть простая программа сетевого чата, созданная в Godot, которую я использую для обучения основам шифрования учащихся старших классов. Я хотел бы добавить специально созданный класс шифрования, чтобы учащиеся могли создавать свои собственные шифры. Вот простая реализация, которую я создал для тестирования класса:
class Security:
extends Resource
func _init():
print("Started.")
func encrypt():
print("Encrypting.")
В моем основном скрипте у меня есть этот код для инициализации класса (у меня это вверху, в пространстве переменных, перед любым определением функции):
const Security = preload("res://scripts/security.gd")
var sec = Security.new()
А затем это в одной из моих функций в скрипте:
func send_message():
sec.encrypt()
Ни одно из сообщений печати не отображается в консоли. Когда я запускаю функцию send_message, я получаю следующую ошибку:
Недопустимый вызов. Несуществующая функция ‘encrypt’ в базовом ‘Rederence (security.gd )».
Есть ли что-то, что я делаю неправильно при создании класса, или как я добавляю его в свой скрипт? Или то, что я пытаюсь, на самом деле не выполнимо (например, должен ли я просто добавлять узел, добавлять к нему скрипт и использовать этот узел в моей сцене)?
Спасибо.
Ответ №1:
class
Синтаксис создает внутренний класс. Это class Security
не класс скрипта.
Как следствие, когда вы делаете это:
const Security = preload("res://scripts/security.gd")
Вы не получаете определенный вами класс безопасности. Вместо этого это класс, который содержит определенный вами класс.
Вы можете создать экземпляр своего класса следующим образом:
var sec = Security.Security.new()
Там первым Security
является имя константы, которая ссылается на класс скрипта. И второй Security
— это внутренний класс Security
, который вы определили.
Смотрите Внутренние классы.
Я предлагаю вам определить свой класс с class_name
помощью синтаксиса:
class_name Security extends Resource
func _init():
print("Started.")
func encrypt():
print("Encrypting.")
Обратите также внимание на изменение отступа.
Тогда класс будет глобальным (что также означает, что в этом нет необходимости preload
), так что вы можете просто сделать это:
var sec = Security.new()
Опять же, предварительная загрузка не требуется, класс является глобальным.
В качестве альтернативы, не используйте имя класса, вместо этого используйте функции непосредственно в скрипте. И используйте предварительную загрузку:
scurity.gd:
extends Resource
func _init():
print("Started.")
func encrypt():
print("Encrypting.")
Где-то еще:
const Security = preload("res://scripts/security.gd")
var sec = Security.new()
Комментарии:
1. Спасибо, это точно ответило на мой вопрос.