跳到主要内容

示例10:类和面向对象

类是一种数据结构,可以把不同类型的数据和一系列函数组合在一起,形成一个整体;而对象则是类的实例,也可以把它看做不同事物的抽象。当解决一个问题的时候,采用面向对象方法会把事物抽象成对象的概念,让每个对象去执行自己的方法,从而解决该问题。

一个类可以包含成员变量和成员函数。成员变量指的是类中拥有的变量,且每个对象都有自己的成员变量值,这些值在同一个类的其他对象中是分开的。成员函数是一个类的成员,其作用范围由类来决定。与普通函数不同,成员函数可以通过this变量访问该类的成员变量。

例如:把学生当做一个类,其内部可以用成员变量储存学生的姓名、年龄、分数等信息,并添加一个成员函数输出学生信息。

如何创建类和对象

在触发编辑器中,可以点击“类定义”按钮或点击任意文件夹右边的+号,在下拉菜单中选择新建类。输入类名后,可以在左侧成员栏处看到刚才新建出来的类定义。

一个空的类定义包括类本身和类的构造器。类的构造器又称为构造函数,每个对象被创建的时候会先执行一次构造函数,并初始化内部的成员变量。它的名称与类的名称完全相同,也存在参数和动作,但没有返回类型。如果用户没有提供构造函数,系统会提供默认的无参构造函数。

向一个类中添加成员变量或成员函数,需要在类定义的右侧点击+号,选择『添加成员变量』或『添加成员函数』。

这里以添加成员变量为例,添加后,可以在左侧成员栏处找到刚添加好的变量。点击该变量,可以配置该成员变量的类型、初始值、显示名和其他属性,其中类型是必选项,其他属性可以不用配置。

使用对象前,需要获得或创建一个对象。在触发器和函数中,可以使用new语句创建对象,并赋值给一个局部变量或全局变量。

对象可以采用 . 运算符获取到对象内的成员变量,也可以执行该类的成员函数。在触发器中,可以通过『基于变量』选择变量对象,通过对象旁边的三角箭头符号获取其成员变量和成员函数。

在成员函数或构造函数内获取成员变量需要使用this变量的面向对象操作,如下图所示:

如何使用面向对象的方法编写游戏逻辑

在星火编辑器中,许多类型的变量其实都是一个实际的对象,比如玩家、单位、点、表现等。它们内部保存着相关的数据,也提供了可供外部调用的函数。

下面通过一个物品相关的案例详细展示面向对象和类的用法:在主控单位处创建一个物品并存储到一个对象中,然后输出该对象的信息。

  1. 创建一个类来表示一把剑的信息,在这个类里面定义成员变量以及成员函数。

    • 『物品实例』(物品)
    • 『是否是单手剑』(布尔值)
    • 『强化值』(数值)
    • 『输出剑信息』(函数)

  2. 为了创建对象时能够方便地给该对象设置初始值,所以要对这个类添加一个带参数的构造函数。该构造函数的参数中包含要传入对象并初始化的信息,在动作里设置对象的初始值。

  3. 编写『输出剑信息』的成员函数,使得调用该函数后,能够输出当前对象的成员变量信息。

  4. 在触发器中,首先获取玩家的主控单位,用面向对象的方法获取主控单位的坐标,将物品生成在该坐标处并保存在变量中。

  5. 新建一个剑对象,将创建好的物品单位和附加数据传入该对象的构造函数,并存入局部变量;使用面向对象的方法,调用该对象的成员函数。

运行输出结果如下:

物品:{item|$$default_units_ts.item.装备后改变角色武器的大剑.root <- 未被拾取}
强化值:10
是否是单手剑:true

面向对象与面向过程

当我们说“使用面向对象方法调用”时,默认指的就是调用对象的面向对象方法;而之前在触发器里使用的“动作”和“函数”则被称为面向过程。当解决一个问题的时候,采用面向过程方法会把事情拆分成一个个函数和数据,按照一定的顺序执行完这些方法,问题得到解决。

绝大多数面向对象的函数都有其面向过程语句,可以通过“基于函数”来查找;但也有一些语句只能通过面向对象的方式获取。

以获取单位的坐标为例,既可以使用面向过程的『单位的坐标』语句,也可以使用面向对象的『单位.坐标()』语句。在执行结果上,这两个语句是等价的。