📜  Godot引用函数

📅  最后修改于: 2021-01-02 10:08:00             🧑  作者: Mango

引用功能

它们不能存储在变量中,不能作为参数传递给另一个服务,也不能从其他函数返回。这是出于性能原因。

要在运行时通过函数名称引用函数(例如,将其存储在变量中,或将其作为参数传递给另一个函数),必须使用调用funcref帮助器:

# Call a function by its name in one step.
my_node.call("my_function", args)

# Store a function reference.
var my_func = funcref(my_node, "my_function")
# Call stored function reference.
my_func.call_func(args)

请记住,默认函数(如_init )和大多数通知(如_enter_tree_exit_tree_process_physics_process等)都将在所有基类中自动调用。因此,以某种方式重载它们时,仅需要显式调用该函数。

静态功能

函数始终声明为静态。如果函数是静态的,则可以访问实例成员变量或self 。这用于制作辅助函数库。

static func sum2(a, b):
    return a + b

陈述和控制流程

它们是标准的,可以是赋值,函数调用,控制流结构等(请参见下文) 作为声明,分隔符完全是可选的。

If / else / elif

通过使用if / else / elif语法创建简单条件。允许在条件周围加上括号,但不是必需的。给定基于选项卡的缩进的性质,可以使用elif代替else / if来保持一定程度的缩进。

if [expression]:
    statement(s)
elif [expression]:
    statement(s)
else:
    statement(s)

短语句可以与条件写在同一行:

If 1 + 1==2: return 2+2
else:
    var x=3+3
    return x

有时我们可能想基于布尔表达式分配一个不同的首字母。在这种情况下,三元if表达式会派上用场:

var x=[value] if[expression] else [value]
y+=3 if y<10 else -1

通过使用while语法创建循环。循环可以使用break中断,或使用continue继续

而[表情]:

声明

对于

为了遍历数组或表之类的范围,使用了for循环。当遍历数组时,数组元素h存储在循环变量中。迭代字典时,具有b的索引存储在循环变量中。

for x in [5, 7, 11]:
    statement # Loop iterates three times with 'x' as 5, then seven and finally 11.

var dict = {"a": 0, "b": 1, "c": 2}
for i in dict:
    print(dict[i])

for i in range(3):
    statement # Similar to the array [0, 1, 2] but does not allocate an array.

for i in range(1,3):
    statement # Similar to [1, 2] but cannot allocate an array.

for i in range(2,8,2):
    statement # Similar to [2, 4, 6] but not allocate an array.

for c in "Hello":
    print(c) # Iterate by all characters in an eString, print every letter on the new line.

比赛

match语句用于分支程序的执行。它等效于许多其他语言中的switch语句,但提供了一些附加功能。

句法:

match [expression]:
    [pattern](s):
        [block]
    [pattern](s):
        [block]
    [pattern](s):
        [block]

切换语句:

  • 火柴替换开关
  • 删除案例
  • 删除所有中断。如果我们不想在默认情况下中断,则可以使用Continue进行尝试。
  • 默认值更改为单个下划线。

控制流:

模式从上到下匹配。如果模式匹配,则执行在match语句下继续。

如果我们希望通过,可以使用continue停止当前块中的执行,并检查其下的执行。

有六种模式类型:

  • 常量模式:常量原语是数字和字符串
match x:
1: 
   print("We are number one!)
2: 
   print("Two are better than one!")
"test":
   print("Oh snap! It's a string!")
  • 变量模式它匹配变量/枚举的内容
match typeof(x):
   TYPE_FLOAT:
          print("float")
   TYPE_STRING:
          print("text")
   TYPE_ARRAY:
         print("array")
  • 通配符模式此模式匹配所有内容。它写为单个下划线。它与其他语言的switch语句中的默认值等效。
match x:
   1:
        print("It's one!")
   2:
       print("It's one time two!")
   _:
       print ("It's not 1 or 2. I don't care tbh.") 
  • 绑定模式绑定模式引入了一个新变量。像通配符模式一样,它匹配所有内容-并为值赋一个名称。在数组和字典中很有用。
  match x:
          1:
        print("It's one!")
          2:
          print("It's one times two!")
          var new_var:
          print("It is not 1 or 2, it is ", new_var)
  • 数组模式数组模式中的每个元素本身都是一个模式,因此我们可以将它们嵌套。测试数组的长度;它的大小必须与图案相同;否则,无法匹配。开放式数组:通过制作最后一个子模式,使数组大于模式。每个子模式都用逗号分隔。
     match x:
    []:
        print("Empty array")
    [1, 3, "test", null]:
        print("Very specific array")
    [var start, _, "test"]:
        print("First element is ", start, ", and the last is \"test\"")
    [42, ..]:
        print("Open ended array")
  • 字典模式它的作用与数组模式相同。每个键都有一个恒定的模式。测试字典的大小;首先,它具有与图案相同的尺寸;否则,模式不匹配。开放式词典:通过创建先前的子模式,词典可以比模式更重要…每个子模式必须用逗号分隔。如果不指定值,则仅检查键的存在。值模式与键模式之间的分隔符为:
       match x:
           {}:
        print("Empty dict")
        {"name": "Dennis"}:
        print("The name is Dennis")
        {"name": "Dennis", "age": var age}:
        print("Dennis is ", age, " years old.")
        {"name", "age"}:
        print("Has a name and an age, but it is not Dennis :(")
        {"key": "godotisawesome", ..}:
        print("I checked for one entry and ignored the rest")

多种模式:

我们还可以指定多个模式,以逗号分隔。这些模式不允许在其中包含任何绑定。

match x:
    1, 2, 3:
        print("It's 1 - 3")
    "Sword", "Splash potion", "Fist":
        print("Yep, you've taken damage")