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毫秒