LPC入门教程

LPC程序的概念:


MUDOS是运行MUDLIB(就是服务器端的游戏代码)的程序,是游戏的驱动,即然叫OS(Operating System)自然可以理解成操作系统,
不过这是运行在Windows、Linux、FreeBSD等操作系统上的的操作系统,也许称为虚拟机更为合适,
一个MUDOS就是一个虚拟机,游戏LIB在这个虚拟机上运行。LPMUD的OS官方网站是:


1.1 基本概念
Lpc的程序看起来和一般的C区别不断大,语法基本一样,但是 
Lpc和一般的语言有着根本的不同,Lpc程序是编写一个一个的"Object"。 


1.2 C++与LPC的区别:
LPMUD使用的LPC语言,它的语法和C 基本一样。它独特之处在于有简单的面向对象(OOP)特性,
C++是面向对象的编程语言,但请不要把LPC和C++相比,LPC只是简单的面向对象以胜任游戏需要,
LPC中的对象是一种数据类型,而不是一个类的实例。


1.3 MUD, Object, Driver的概念
MUD:不同Object在一个Driver上的各种不同的表现
2.Driver: 几乎不参与创建你所接触到的世界,它所有的工作只是让那些LPC的Object活动起来.Driver把和这几个Object相关的文件读入内存,
然后解释运行,读入内存, 并不是按照顺序执行。
3.Object:   Lpc的Object是一些变量(它的值能变化)和函数(函数通常是用来 操纵那些变量的一段程序)的组合




2.1 Driver和Mudlib的关系


2.2 Object被装入内存
Driver会去调用Object的create()函数




第三章 函数
3.1 LPC的函数
write_vals() 和 add()两个函数的例子,仅供参考:
/* 首先, 是函式宣告. 它们通常出现在物件码的开头. */ 
void write_vals(); 
int add(int x, int y); 
/* 接着是定义 write_vals() 函式. 我们假设这函式将会在物件以外被呼叫. */ 
void write_vals() 
{ int x; 
/* 现在我们指定 x 为呼叫 add() 的输出值. */ 
x = add(2, 2); 
write(x+"\n"); } 
/* 最後, 定义 add() */ 
int add(int x, int y) 
{ return (x + y); } 

3.2 外部函数(efuns): 外部定义的函数,外部函数由mud dirver所定义,外部函数详细资料可以在mud中的
/doc/efun目录找到,可以通过man找到相关函数资料。


3.3.定义自己的函数:


第四章 基础的继承:


4.1 继承的示例程序:
inherit ROOM;
void create()
{
set("short", "日月园");
set("long", "这是工作室的\n");
set("exits", (["down":"d/xyj/kezhan", "north":"u/power/doorroom",]));
setup();

}


4.2 LPC中OOP设计的原则




4.3 继承的作用




第五章 变量处理


5.1 对象的值和方法


5.2 Local和Global变量


5.3 处理变量的数值以及运算


5.4 数据类型:


5.4.1 基本数据类型:LPC主要的数据类型有int, string, mapping, object, mixed。
Object(***): 是OOP的概念,在LPC中Object能够封装数据和函数,但是不能够直接操作object的数据,所以对object的操作只有赋值和执行object函数
例如: object ob;
ob->test(1,2);
其中若该object中未定义该函数名的函数返回0,也不会报错。

Mapping和数组(***): 
eg. mapping a = ([ "ab" : 1 ,
"cd": 2 ,
])
标准格式:
mapping 变量名 = ([
key1 : value1 ,
key2 : value2 ,
..........
..........
]);
其中key可以是除了int之外任何值,不能是char,包括任何数组甚至mapping都可以作为key。key值不允许重复,如果重复则覆盖。
value则可以是任意所有值。

用以下两种方式可以修改mapping的值:
map[key] = value;
map += ([key:value]);
在Mapping中删除一个key,相应的value也没了,方法是:map_delete(map,key);
lpc里面的系统函数(efun)的命名,一般按照参数顺序来取名(map_delete的参数就是map在前,被delete的key在后)

数组: LPC中的数组在类型后面加*就可以了,一般来说数组大小不用预先定义,但是若有需要可以使用allocate(size)来固定大小。如a = allocate(10);
有固定size的数组可以通过下标访问元素操作
数组常用操作:最常见的是"+", "-"操作, member_array(元素值,数组,起始下标)返回元素下标, 另外具有的:filter_array和filter_mapping实现对数组里各个元素的操作。
+就是通常的“连接”操作,
-是集合的“差”操作,如果没有这两个概念请看下面例子:
a == ({ 1,2,2,3, })
则a + ({2,3,4}) == ({ 1,2,2,3,2,3,4})
a - ({ 2,1}) == ({3})
请注意 - 的时候会把所有相同的元素都消掉的.


 Mixed:它的类型系统还提供了一个特殊类型mixed,类似于go语言的万能接口,可以存放任意类型的变量,同时可以在后期查到该变量的真正类型







**注意***
LPC没有“指针“概念,在变量名前面加*的定义表示数组。如int *a 表示a的数组,定义数组时不需要指定大小。





第六章 流程控制

与C类似,省略


第七章 网络编程


7.1 Socket模式:


一共有五种不同的通信模式或者叫做套接字(socket)模式:
MUD、STREAM、DATAGRAM、STREAM_BINARY,和 DATAGRAM_BINARY。这五种模式
的定义可以在 mudlib include 的 中找到。


MUD模式:
-----------
MUD模式,从一个MUD传送到另外一个MUD,无法发送对象类型。


Stream模式:
-----------
无法直接发送和接收所有LPC数据类型,无法确保发送的字符串能够全部到达。


Datagram模式:
------------------
无连接通信,不需要建立连接就可以跟一个MUD传输数据。




7.2 创建一个Socket


#include

void create()
{
int s;
s = socket_create(MUD, "close_callback");
if(s < 0)
{
write("socket_create:"+ socket_error(s) + "\n");
return;
}
write("Created socket descriptor"+s+ "\n");
socket_close(s);

void close_callback(int s)
{
write("socket"+s+"has closed\n");
}

}





你可能感兴趣的:(游戏开发)