Linux C编程:打造一个插件系统
创始人
2024-12-08 23:04:06
0

title: ‘Linux C编程:打造一个插件系统’
date: 2017-03-07 21:16:36
tags: linux C
layout: post
comments: true

运行环境:linux
使用语言:c 或者c++

插件,很多人用过,比如游戏插件,编辑器插件这些,
最著名的就数魔兽大脚插件啦,还有vim插件啦,eclipse插件啦,等等
插件有很多种形式,最常见的就是so文件,在windows上就是各种的dll啦

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

举个例子,你开发了一个游戏,一开始只有三个关卡,分享给了你的小伙伴玩
大家玩得很爽,但很快,游戏通关了,还想玩,这时候怎么办呢?
常规做法就是再加两关,然后编译之后,再发给大家,那么问题就来了
每次想加新关卡,都需要重新编译一次,再下载一次,这个流量嘛,1+1.1+1.2+1.3,每次加个0.1,都够你受的_
这个时候嘛,就要引入插件系统了

咱先来写个小程序

//main.c #include  #include "game.h" //关于游戏的定义  void initGame() { 	 } 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(); 		 	} 	 } 

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

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

在这里,游戏关卡就是我们的插件,一个插件就是一个关卡
先讲讲一个插件的构造吧
首先是这个关卡的描述,比如名称,难度等
其次就是这个关卡游戏过程了
最后,就是玩关卡的人

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

//game.h #include  #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 %d\n",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,以上就是一个关卡的所有东西了,虽然看着简单,不过还是建议动手敲敲_

那我们先把这个插件制作出来吧,免得一会忘记了,在终端下执行以下命令:

gcc  game.c -fPIC -shared -o firstMission.so -ldl 

linux和mac都一样

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

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

Mission 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]='\0';//fgets会读多一个换行,所以需要替换掉         count++;     }	      fclose(fp);      ret=0;//用于累加错误次数     for(int i=0;i

好了,上面的代码,不难吧?咱编译一下,就可以跑了
linux下

gcc -o game main.c -Wl,rpath=.  

mac下

gcc -o game main.c -Wl,rpath . -dynamic 

再准备一个游戏菜单文件,执行

echo firstMission.so >missionlist.txt 

好了,再执行

./game  

一切顺利的话,你应该能看到自己的关卡列表了〜
接下来干嘛呢?我们现在仅仅是提取出了关卡的名字,还没开始玩游戏呢
以下是改动后的main.c文件

#include  #include  #include  #include  #include  #include  #include  #include "game.h" //关于游戏的定义  Mission mission[50]; void initGame() {     memset(mission,0,sizeof(mission)); }  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]='\0';//fgets会读多一个换行,所以需要替换掉         count++;     }         fclose(fp);      ret=0;     for(int i=0;imissionNum || missionNo<1)         {             printf("没有此关卡!\n");             continue;         }         //读取来的关卡肯定是有难度等级的,没有就是无效关卡         if(mission[missionNo-1].level!=0)         {             while(p.life>0)                 mission[missionNo-1].process(&p);         }         printf("Game Over!\n\n\n");              }      }  

这就是一个完整的游戏啦,感兴趣的同学可以继续扩展哟〜〜后面就是不断得出扩展啦

你问我怎么扩展?
好吧,自己把game.c里面的内容改改,然后编译出来,换个名字,然后在missionlist.txt里面加一行,就ok了

还不懂?那你只能给我打赏了_

相关内容

热门资讯

必看攻略!老友互娱外 挂,微信... 必看攻略!老友互娱外 挂,微信小程序雀神真的可以开挂吗,玩家教你(有挂技巧);老友互娱外 挂辅助器中...
指导大家!杭乐麻将有挂吗,欢乐... 指导大家!杭乐麻将有挂吗,欢乐茶坊一直真的有挂,总结教程(有挂工具)1、玩家可以在杭乐麻将有挂吗软件...
推荐一款!!椰岛常胜游戏辅助器... 推荐一款!!椰岛常胜游戏辅助器(透视)透视辅助机制(2020已更新)(百度贴吧)推荐一款!!椰岛常胜...
黑科技辅助挂!杭乐麻将有挂吗,... 黑科技辅助挂!杭乐麻将有挂吗,中至南昌麻将丰城踢牌有挂吗,雀神麻将输赢规律杭乐麻将有挂吗是一种具有地...
信息共享!腾讯广东麻将有窍门吗... 信息共享!腾讯广东麻将有窍门吗,多乐够级好像真的有挂,2025新版(有挂辅助)1、完成腾讯广东麻将有...
推荐一款!多乐游戏小程序辅助工... 推荐一款!多乐游戏小程序辅助工具,雀神微信小程序辅助,必备教程(有挂脚本);1、多乐游戏小程序辅助工...
黑科技辅助挂!同城跑胡子合集有... 黑科技辅助挂!同城跑胡子合集有挂吗,菠萝德州规律,广东雀神麻雀怎么提升胜率1、让任何用户在无需同城跑...
玩家爆料!乐游多少钱(透视)外... 玩家爆料!乐游多少钱(透视)外挂透明挂辅助脚本(2022已更新)(哔哩哔哩);1、这是跨平台的乐游多...
分享一款!!兴动麻将输赢规律,... 分享一款!!兴动麻将输赢规律,66徐州麻将总是真的有挂,爆料教程(有挂技巧)1、让任何用户在无需兴动...
记者揭秘!!欢乐龙城棋牌怎么提... 记者揭秘!!欢乐龙城棋牌怎么提高好牌率,雀神辅助器苹果版靠谱吗,wpk教程(有挂规律)1、欢乐龙城棋...