目录
函数默认值
2023.12之后添加的新用法(还在更新啊)
void test(string str : (: "你好,中国" :), int i : (: 100 :), object ob : (: this_object() :))
{
printf("str = %s; i = %d; ob = %O\n", str, i, ob);
}
int main(object me, string arg)
{
// 请在此实现你的代码
test();
test("test");
test(arg, 520, me);
return 1;
}
可变参数
void test(mixed *x...)
{
printf("x = %O\n", x);
}
库函数
efun
在LPC语言中有各种可以直接使用的库函数,专业术语为 外部函数(external function),
通常简称为 efun,在 fluffos 中一共有近300个 efun,这些函数都可以直接使用,
而且不需要和C语言一样要引入头文件,如:printf、allocate、this_object
efun列表
模拟库函数sefun
可以类比为自己写的efun,类似于头文件+cpp实现的方法
局部函数lfun
local func 除了 efun 和 sefun,我们正常开发中会大量的自定义函数,这些函数被称为 局部函数(local function),
简称 lfun。因为LPC是面向对象编程,所有 lfun 都是写在蓝图对象中,而且和对象直接相关,
不像 efun 和 sefun 可以随意调用。在现在面向对象编程中,对这些函数的称呼是 方法,我个人也习惯这种称呼,
在本教程中对自定义函数全部统一称呼为 方法,代表和对象相关的自定义函数。
系统方法apply
请注意:有的 apply 方法必须实现,否则游戏不能正常运行,如:connect方法、logon方法。而有的 apply 方法可以不实现,这样相关的行为就不会被处理。
简单示例
// 示例:5.1.1
// apply 方法,对象加载时自动执行
void create()
{
// 发送信息给当前玩家
write("create 5.1.1!\n");
}
// apply 方法,设置心跳后自动执行
void heart_beat()
{
// 记录日志,请在driver界面或 debug.log 文件中查看
debug_message(file_name(this_object()) + ": " + time());
}
int main(object me, string arg)
{
if (query_heart_beat())
{
write("停止心跳!\n");
set_heart_beat(0);
}
else
{
write("开始心跳!\n");
set_heart_beat(1);
}
return 1;
}
在本示例中,包括 efun、lfun 和 apply,
debug_message、file_name、this_object、time、query_heart_beat、set_heart_beat、write是 efun,
create、heart_beat是 apply,
main是 lfun
环境(environment)和内容物(inventory)
在 LPC 的世界里,大多数对象均有一个环境,而该环境的内容物即包含在环境中的对象。
举一个简单的例子,玩家 player A、player B 目前站在一个房间 room A ,
而此房间放置了一个物品 item A ,那么 player A、player B 及 item A 均为 room A 的内容物,
相对的 room A 为 player A、player B 及 item A 的环境。实际状况如图所示
任何对象均能被当作其它对象的环境, 我们可以将任何对象视为一个容器,如 player A 将 item A 捡起,实际情形如下:
此时,我们可以执行外部函数 environment(player A 或 player B) 来得到环境对象 room A,
可以执行 environment(item A) 得到 player A,而透过执行 all_inventory(room A),可以得到 player A 及 player B 的对象数组,
要注意的是,这样无法取得 item A,除非执行了 all_inventory(player A) 或 deep_inventory(room A)
也就是说all_inventory()无法递归的去调用,deep_inventory()可以
相关函数
this_object()
object this_object( void );//返回当前对象的指针。
environment()
返回包含对象 `ob` 的对象(环境),如果没有指定参数 `ob`,默认是 this_object()。如果对象 `ob` 不在任何环境里,返回 0。
object environment( void );
object environment( object ob );
all_inventory()
//返回在指定对象 `ob` 中的所有对象组成的数组。如果没有指定参数 `ob`,默认是 this_object()。
object *all_inventory( void );
object *all_inventory( object ob );
deep_inventory()
//返回对象 `ob` 中的所有对象及对象中的所有对象(层层递进查找,直到传回所有对象为止)的数组。如果没有指定参数 `ob`,默认是 this_object()。
object *deep_inventory( void );
object *deep_inventory( object ob );
first_inventory()
//返回对象 `ob` 内容物品中的第一个物品,参数 `ob` 既可以是对象类型也可以是字符串类型(对象的文件名),如果没有指定参数 `ob`,默认是 this_object()。
object first_inventory( void );
object first_inventory( mixed ob );
next_inventory()
//返回和对象 `ob` 环境相同的后一个对象。如果没有指定参数 `ob`,默认是 this_object()。
//先进入环境的对象顺序靠后,所以 next_inventory() 取得的是比指定对象先进入环境的对象,如果指定对象是第一个进入环境,哪怕环境中有其它对象进入返回值也是 0。
object next_inventory( void );
object next_inventory( object ob );
move_object()
void move_object( mixed dest );
//移动当前对象到环境 `dest`,移动后会触发当前对象和目标环境及其中对象的 init() 方法。
任何 .c 文件在游戏中都是一个对象,而任何对象都可以做为环境,不管这个对象的功能是什么,
哪怕一个文件的作用只是一个指令,甚至是一个没有任何代码的空的 .c 文件。在游戏开发中,我们需要限制对象的移动,不能进入不是环境的对象。