首页 > 其他分享 >LPC和C对比(2) 函数

LPC和C对比(2) 函数

时间:2024-01-24 17:24:03浏览次数:18  
标签:函数 对象 void object ob player inventory LPC 对比

目录

函数默认值

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 文件。在游戏开发中,我们需要限制对象的移动,不能进入不是环境的对象。

标签:函数,对象,void,object,ob,player,inventory,LPC,对比
From: https://www.cnblogs.com/liviayu/p/17985116

相关文章

  • 常用的两种UTF8中文截取函数
    /**截取UTF8编码字符串从首字节开始指定宽度(非长度),适用于字符串长度有限的如新闻标题的等宽度截取中英文混排情况较理想.全中文与全英文截取后对比显示宽度差异最大,且截取宽度远大越明显.@paramstring$str UTF-8encoding@paramint[option]$width截取宽度@paramstring[......
  • 【C++入门到精通】C++入门 —— 深浅拷贝函数
     目录拷贝函数浅拷贝拷贝构造函数深拷贝拷贝构造函数总结 前言Linux专栏链接)大家可以关注一下,后面我会一点一点的更新的。大家坐稳扶好,要开车了!!!拷贝函数拷贝构造详细介绍)        是C++中的一个特殊成员函数,用于创建对象的副本。它的作用是通过使用已有对象的属性值来初始......
  • 【C++入门到精通】C++入门 —— 深浅拷贝函数
     目录拷贝函数浅拷贝拷贝构造函数深拷贝拷贝构造函数总结 前言Linux专栏链接)大家可以关注一下,后面我会一点一点的更新的。大家坐稳扶好,要开车了!!!拷贝函数拷贝构造详细介绍)        是C++中的一个特殊成员函数,用于创建对象的副本。它的作用是通过使用已有对象的属性值来初始......
  • Python(2) -numpy 的常规函数
    1、tile参考:https://blog.csdn.net/weixin_41998772/article/details/113563806用法tile(A,reps)tile是平铺的意思。即将数组A是为瓷砖,在一个二维平面reps平铺开来0、给定一个数组fromnumpyimport*c=array([[1,2],[3,4]])print(c)Output:[[12][34]]1、横向平......
  • 函数
    一、函数的使用在Shell中,你可以创建和使用函数来封装一系列命令,以便稍后可以多次调用它们。函数可以帮助你使脚本更加模块化和可维护。以下是在Bashshell中创建和使用函数的基本语法:functionfunction_name{  #函数体,包含一系列要执行的命令  #可以使用参数$1,$......
  • 子函数对指定文件指的读取指定的行(ReadLine.bat)
    经常要对文件的指定行进行读取,特写了一个读取文件指定行的小程序段(ReadLine.Bat),方面以后调用。使用也比较简单:"CallReadLine<文件名><跳过的行数><读取行数>"就可以了。比如在一个批处理里加上一句"CallReadLinea.txt57",那么将跳过a.txt文件的前5行,显示下面的7行字......
  • C#析构函数解析:资源管理的精要和使用技巧
     在C#中,析构函数(Destructor)是一个特殊的方法,用于清理对象占用的资源。它是由垃圾回收器在对象被销毁时自动调用的。析构函数的原理是在对象即将被回收时执行一些清理操作,例如释放非托管资源或执行一些对象销毁前的必要操作。析构函数的基本原理:调用时机: 当对象被垃圾回收......
  • 函数递归经典题目——汉诺塔,青蛙跳台阶
    函数递归(recursion)函数递归(recursion)程序调用自身的编程技巧。只需要少量程序就可以描述除解题过程所需要的多次重复运算,大大减少了代码量递归---把大事化小必要条件*2 1存在限制条件,当满足这个限制条件时,递归便不再继续 2每次递归调用之后越来越接近这个限制条件递归......
  • java8 函数式(Functional)接口
    什么是函数式(Functional)接口 只包含一个抽象方法的接口,称为函数式接口。 你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。 我们可以在一个接口上使用@FunctionalInterfa......
  • 大语言模型的架构及其训练(目标函数和优化算法)
    先占坑24号早上起来补大模型的架构 大模型的训练模型训练=目标函数+优化算法可用任何模型将token序列映射到上下文嵌入中一、目标函数1.Decoder-only模型①映射到上下文嵌入②用嵌入矩阵获得每个token得分③指数化、归一化得预测分布用负对数最大似然作为目标函数2.Encoder-o......