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]='