linux 下c插件开发,Linux C编程:打造一个插件系统

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

运行环境:linux

使用语言:c 或者c++

插件,很多人用过,比如游戏插件,编辑器插件这些,

最著名的就数魔兽大脚插件啦,还有vim插件啦,eclipse插件啦,等等

插件有很多种形式,最常见的就是so文件,在windows上就是各种的dll啦

下面就让我们来了解一下插件式编程吧〜〜

举个例子,你开发了一个游戏,一开始只有三个关卡,分享给了你的小伙伴玩

大家玩得很爽,但很快,游戏通关了,还想玩,这时候怎么办呢?

常规做法就是再加两关,然后编译之后,再发给大家,那么问题就来了

每次想加新关卡,都需要重新编译一次,再下载一次,这个流量嘛,1+1.1+1.2+1.3,每次加个0.1,都够你受的^_^

这个时候嘛,就要引入插件系统了

咱先来写个小程序1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35#include "game.h" //关于游戏的定义

void ()

{

}

void play()

{

printf("我打,我打,我打打打n");

}

void loadMission()

{

}

int main()

{

initGame();//初始化游戏

int missionNum=loadMission();//读取关卡数

while(1)

{

int missionNo=getchar();//选择关卡

missionNo=missionNo-'0';

if(missionNo>missionNum)

{

printf("没有此关卡!n");

}

play();

}

}

以上就是一个可扩展的游戏架构,够简单吧〜

下面咱就开始设计这个游戏系统的插件吧

在这里,游戏关卡就是我们的插件,一个插件就是一个关卡

先讲讲一个插件的构造吧

首先是这个关卡的描述,比如名称,难度等

其次就是这个关卡游戏过程了

最后,就是玩关卡的人

按照以上描述,咱定几个结构体吧1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37//game.h

#include

//游戏玩家描述

typedef struct _player

{

int life;//玩家生命

}Player;

//游戏关卡描述

typedef struct _mission

{

int level;//关卡难度

char missionName[30];//关卡名称

void (*process)(Player *);//游戏过程

}Mission;

好了,下面就是一个插件的具体内容

```c

//game.c

#include "game.h"

const char name[]="第一关,插件入门";

const int level=1;

void firstMission(Player *p)

{

printf("oh my god ,somebody hurt me!n");

p->life--;

printf("now my life is %dn",p->life);

sleep(1);

}

void gameInfo(Mission *m)

{

m->level=level;

int len=strlen(name);

memcpy(m->missionName,name,len+1);//注意游戏名称不要太长

m->process=firstMission;

}

Ok,以上就是一个关卡的所有东西了,虽然看着简单,不过还是建议动手敲敲^_^

那我们先把这个插件制作出来吧,免得一会忘记了,在终端下执行以下命令:1gcc game.c -fPIC -shared -o firstMission.so -ldl

linux和mac都一样

关卡设计好了,接下来就是怎么样读取我们做好的关卡了

现在实现咱们就loadMission()函数1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72Mission mission[50];

int loadMission()

{

FILE * fp;

fp = fopen("missionList.txt", "r");//读取关卡列表文件

if (NULL== fp)

{

return 0;

}

int ret=0;

char namelist[50][50];//最多50个插件,每个插件的名字长度最多50

memset(namelist,0,sizeof(namelist));

int count=0;

while(fgets((char *)&namelist[count], 50, fp))

{

ret=strlen(namelist[count]);//计算实际字符串长度

if(namelist[count][ret-1]=='n')

namelist[count][ret-1]='

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值