Mud 版 (精华区)
发信人: anderson (危峦快剑), 信区: Mud
标 题: LPC中文介绍(2)
发信站: 紫 丁 香 (Wed May 13 19:00:51 1998), 转信
有关房间的部份就写到这里, 接下来是物品
[ 物品的制造]
要制作物品, 首先必须 inherit OBJECT; 理由与做房间时必须
inherit ROOM 一样 OBJECT 是最基本的物品, 如果你要做的东西是武
器 防具 地图等, 你必须 inherit WEAPON, ARMOR, MAP 等等才能获
得这种类别的物品所拥有的特性
物品的重要函数只有 create() 与 init(), 作用与 ROOM 中的同
名函数大致相同
[create() 函数]
要写 create() 函数, 最好的方法是拿现成的同类物品来修改 因
为不同类的物品往往可以 set 不同的属性, 而且特性极多, 有重量
价格 攻击力(武器) 防御能力(防具) 使用寿命(火把)等等 很难记
得完整, 所以我劝你找一个较完整档案来修改
[init() 函数]
与 ROOM 中的 init 函数类似, 但是被呼叫的时机多了许多, 共有
下列的几种情况:
1. 物品摆在房间中, 有一个玩家走进来
2. 一个物品突然出现在某个玩家所在的房间中
3. 一个物品突然出现在某个玩家的物品栏中
物品的 init 函数大多还是用在写 add_action 上面, 这些 action 会
生效的场合归结起来很简单, 就是:
「玩家用 l 或是 i 指令看得到这个物品的时候」
同一个房间中他人或npc身上的东西时不算, 装在袋子的东西不算 这
点要注意一下
(其实既然都是object,那么实际上房间和物品并没有本质的不同,因此在
房间上的 create() init()函数用法和房间相同,正如前面说的,可能
有一点区别的就是物品的init()函数被触发的机会多一些而已。
---lnwm注。)
[npc]
简单的npc很好做, 连 init 都不用写, 只需要写 create(), 唯
一的问题是属性太多了, 要一一理解得花上相当的时间才行
会做复杂动作的npc则需要相当的技巧, 并且了解有哪些变量可以
被拦截下来改写利用 等你有一定的程度时, 再来找个npc参考参考较
好
npc要 inherit NPC 也没有 refresh() 这个函数
[程序必须的概念]
你必须了解, 在 LPC 中最重要的一个概念是对象(object) 当你想
做任何动作时, 都要考虑到这个动作是哪一个 object 所做的, 不然很
容易导致错误 LPC 的语法并不严谨, 有些场合为了省事可以将函数是
由哪个对象所作的省略掉, 例如我们在 create() 函数中最常看到的
set(), 事实上最严谨的写法应为 this_object()->set() write() 则
为 this_player()->write()
(对,我们必须弄清楚,object 的概念是整个lpc的核心。
往深一点说,每个object无非是一个包含了数据结构和内部
外部函数的对象,他的数据结构决定了它的属性,比如房间的
名称,玩家的skills等等,而他的外部函数提供了修改这些
数据结构的方法,比如 set_skill("xkx",1000)
比如 set("title","大侠")
这里set_skill()和set()函数就是object和外部的接口。
数据结构和接口函数就拼出了一个object。
---lnwm注。)
说这麽多只是为了强调一件事: 你能抓出一个物品的 object 变量
就能让他干一切他所能做的事
[this_object() 与 this_player()]
这两个函数是系统所提供的函数, 也是最最好用的两个函数 在你
写作一个对象 (房间 物品...etc.)时, this_object() 表示自己这个
对象
(讲清object的结构后,你必须清楚object的所谓封闭性。
当我们在程序里写 set("name","长剑")时,实际上是
this_object()->set("name","长剑")的简略写法。
这样set("name")的不是其他的东西,每一个object有自己独立的
数据结构,它能与其他object严格区分开来。
即使是同一个长剑程序,当你clone了两把时,在内存中就有两个
完全独立的长剑object,你对其中一把做的任何处理如改名,改
威力完全不影响另一把的数据,这就是object的封闭性。
---lnwm注。)
this_player() 则比较复杂, 它会传回一个属於玩家类型的对象
这个玩家在 init 中就是触发 init 的那个玩家 this_player() 会跟
著函数呼叫一直传递给所有被 init 呼叫的函数, 包括 add_action 中
所定义出来的函数, 在这些函数中, this_player() 就是表示做动作的
那个人
[present() 函数]
常常, 我们只知道一个对象的名字, 却不能用个 object 类型的变
量指向它
object=present(string "id",object env)
函数在此时就可以派上用场, 你给定你要找的对象的名字,
与它的所在地 (某个房间或某个人), 函数就会传回他所找到的对象
简单的想, present 函数其实就是在一个房间里找出某个名字的物
品的函数 它是同类型找物品的函数中最有用的一个, 其余的函数还有
find_player(), find_living() 等等
(这里再强调一次,名字不过是一个object的数据结构中的一个
部分,单单一个名字没有任何意义。
present,find_living,find_player函数就是从名字(id)
找到这个object,有了这个object才好对它做操作。
在mud里你 help present
help find_living
hrlp find_player
能看到这几个函数的详细用法。 ---lnwm注。)
[environment(), first_inventory(), next_inventory(), all_inventory()]
这一组函数跟对象所处在的位置有关 environment(object ob)
传回了对象 ob 所处在的地点, 例如 ob 是个玩家或生物, 那麽这个函
数会传回 ob 所在的房间; 如果 ob 是个物品, 那麽传回的就是携带著
ob 的生物, 或是 ob 所在的房间 (如果没有任何人带著它)
first_inventory(object ob) 所传回的是 ob 中的第一个对象,
如果 ob 是房间, 则传回第一个物品或是生物, 如果 ob 是生物, 则传
回他身上所带的第一个物品
next_inventory(object ob) 通常跟著 first_inventory() 一起
使用 它的功用是传回 ob 的下一个物品, 在同一个 environment 中
all_inventory(object ob) 类似於 first_inventory(), 但是它
所传回的是包含了所有物品的一整个阵列
(上面谈的是环境问题,一个object(除房间外)都要有自己的环境,
所谓环境就是这个object在什么地方放着,是一间房间还是一口箱子
还是一个人身上,环境通常是另一个object。
比如物品A和B放在一个人M身上,那么上面的函数就给出了它们的关系
M=environment(A);
M=environment(B);
A=first_inventory(M);
B=next_inventory(M);
A=all_inventory(M)[0];
B=all_inventory(M)[1];
---lnwm注。)
[更进一步的提示]
LPC 的函数群有三个, efun, lfun, simul_efun 它们提供了绝大
部分的功能。
[关於输出输入讯息的各个函数的提示]
can_read_chinese
printf, sprintf
scanf, sscanf
write, say, shout
tell_object, tell_room
[关於对象操作的函数]
clone, new (变出新object )
destruct, remove (摧毁object )
move, move_player, move_around (移动object ---lnwm注。)
(这些函数不可能一一讲解了,你可以在mud里用help
来看(英文呦),然后再放到程序里自己试试。 ---lnwm 注。)
--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.118.226.67]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.503毫秒