Использование пользовательского класса в Godot

#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. Спасибо, это точно ответило на мой вопрос.