小玉米图文教程No.7 - 教你如何用易语言撸出GM8插件

如果你不满足GM8自带的一些功能,可以使用GM8支持的扩展机制:使用DLL插件,在这篇教程之前,玉米已经发布了N多GM8专用插件,本人原创比较热门的有MaizeMusic音乐插件、GamemakerResources资源包外置插件。其他的一些如FoxWriting汉字书写插件,GMThread多线程插件,GMFMOD,39DLL等,都是在GM8平台上一些很出色的插件。


本篇文章我会教大家如何用易语言来制作插件,没错,就是易语言,一个中文“编程”语言。这里我就不测评这款语言怎么样了,大家百度查查看就知道人们对这款软件的评价是怎么样的。

写在前面:
首先,要确保你有一些GM和易语言方面的基础知识,或者一些编程知识也可以。当然需要你对GM中DLL章节的函数及其了解,知道这些函数是怎么运作的,在GM中应该如何使用。如果你保证前面我说的这些都知道的话,那就可以继续往下看了。

一些忠告:
· 我们在这里使用易语言,不是因为易语言是一个多么好的编程语言,易语言中封装了很多支持库,还有一些模块,这里可以拿出来直接用,可以快速开发自己需要的插件。
· 有能力的同学请使用正版的易语言来制作插件!这里不提供软件的下载地址,需要的同学自行百度,建议下载最新版本。如果使用盗版的易语言做出的插件将不能用于商业目的,出现一切纠纷与本教程编写者无关。
· 易语言程序的报毒率与其他语言相比来说是很高的,在你的游戏中使用易语言制作的插件可能会使一些杀毒软件报毒。
· 请不要过分依赖于易语言,学习编程请学习一些正统的语言,如C语言,Java等。

之前,已经有制作插件的教程了,比如说小狐狸的教程,告诉了大家如何使用VisualStudio,用C++语言为GM8创作一款插件。

狐狸的插件教学:手把手教你如何用vc++写一个gm插件

http://www.gamemaker.cn/forum.php?mod=viewthread&tid=546&fromuid=3

(出处: Gamemaker开发者之家)

考虑到一些玩家并不会C++这种高大上的语言(玉米也不会。。),这种高逼格的东西只能让小狐狸拿出来装逼了,所以这里就面对于一些进阶级玩家来使用易语言作为工具来制作插件。

易语言中封装了很多windows的功能,只需要几个汉字就能完成很多很多的动作,下面就是详细的步骤啦。

首先,打开易语言,新建一个工程(玉米的易语言版本是5.3的),在弹出的新建对话框中,选择Windows空白程序中的Windows动态链接库,然后点击确定。

0.png

之后就蹦出了易语言最有特色的中文代码框了!所有要用到的功能,都要在这写,这里我就举例如何来制作一个弹出Windows信息框和获取百度网页源码的程序吧。新建完工程之后,我们要对一开始易语言给我们生成的代码做一些处理。

1.png如上图所示,这些是创建完工程后易语言自动生成的代码,其中,红色框里面的东西是完全没用的,直接删除即可,最后只留下_启动子程序这一个子程序,还有里面的一行返回的代码。

之后在空白的地方右键,选择新子程序,将子程序名设为“_dll_init”返回值类型设为双精度小数型,双击公开下面的格子在里面打上勾。

2.png

这里要说一些重要的事情了,大家知道,GM里面的数据类型只有两种,要么是实数型(real),要么是一个字符串(string),那么这两种数据类型在易语言中分别就是双精度小数型和文本型。

之后就来写一下这个_dll_init的子程序,在表格里面按一下回车就会出现参数表,在这个参数表里,可以定义一些由GM传递过来的参数,在该子程序下,定义一个文本型的参数,参数名为working_directory。之后,在表格的下面写下代码:

改变目录 (working_directory)
返回 (0)

嘛写完了就是下面这样了,,易语言这个表格啥的也真是蛋疼啊。。。

3.png

这样子就写好了咱们的第一个函数啦,接下来就是在GM中调用。创建一个脚本,名字为eplugin_init,写下如下代码

var wd,path;
wd = working_directory; //将工作目录保存到一个临时变量
path = "eplugin.dll";   //易语言输出的DLL的路径

global.__eplugin_init = external_define(path,"_dll_init",dll_stdcall,ty_real,1,ty_string);  //定义初始化函数

external_call(global.__eplugin_init,wd);    //调用初始化函数

好了,之后就可以在游戏中调用eplugin_init来初始化插件了。

这里需要解释一下为什么写了这么多东西来初始化。可能是由于GM和易语言的兼容性导致的问题,当GM使用external_define函数来定义易语言制作的DLL后,就会莫名其妙的让GM的只读变量working_directory变量被易语言强行篡改,原理不知道,这里的意图就是,在定义完扩展函数之前先将working_directory保存到一个临时变量,等所有的扩展函数定义完后,再使用易语言的“改变目录”函数将working_directory变量改回去。在GM中,working_directory是一个只读变量,不能使用GML对其进行直接修改,但是可以通过易语言的“改变目录”函数来修改这个变量,大家也可以来试一下。

需要记住一个问题就是,以后再写新的插件的时候也别忘了把这个改变目录的函数写进去,在GM中定义完扩展函数后也要记得调用一下这个东西,否则会导致游戏调试时读取工作目录下的文件失败这样的问题。(还有命令行导致工作目录变化啊巴拉巴拉的有关于工作目录改变后一切的问题,反正注意调用这个就是了)

初始化忙活了半天,接下来就是写我们的第一个自定义函数:信息框啦!

Windows信息框

易语言中有一个函数就叫做信息框,可以用来弹出windows信息框。那么这里只要直接使用这个函数来弹出框就好了,同样,在空白的区域点击鼠标右键,然后新子程序,并把公开打上勾。以后每创建一个新的扩展函数都要这么折腾一次,所以我就不多说了。这回把这个子程序名命名为MessageBox,返回值为双精度小数型,并在下面定义两个文本型参数Title和Message。注意这里的子程序名一定要都用英文的!不要因为是易语言你就随便在这用中文的,编译的时候不会报错,不过这会导致你没法在GM中调用!(GM对中文支持不是那么好嘛~)

之后在子程序体内写代码完成信息框的功能,直接写下如下代码。

返回 (信息框 (Message, 0, Title, ))

诶呀我去真是简单啊。一行代码搞定,,写完了就是下面这个样子了

4.png

这个功能的意思就是,弹出一个windows信息框,可以在GM中传入信息框的标题文本和提示文本。保存易语言工程,并进行静态编译。将输出的DLL文件与GMK文件放在一起,这里假定我们输出的DLL文件名为eplugin.dll吧。。。

之后回到GM中,把新写好的信息框函数定义一下,打开eplugin_init脚本,在定义完初始化的那行代码下方添加上定义该函数的代码:

5.png如上图所示,红色框内的代码就是新加的代码。注意一定要加对位置,要放在调用初始化函数的上边。这里可以为大家解释一下external_define里的参数都是什么意思:

argument0: DLL的文件路径

argument1: 要调用的DLL子程序名称,你的子程序名写的什么这里就要写什么。

argument2: DLL的调用方式,直接填写dll_stdcall吧,当然填写dll_cdecl也可能不会有错。

argument3: 返回值的类型,看你易语言里面返回值类型是怎么定义的,如果是双精度小数型就填ty_real,是文本型就填ty_string。

argument4: 参数的数量:这个MessageBox函数我定义了两个参数,所以就填2了。

之后的参数,要填写扩展函数参数的数据类型,依次填写,这个信息框的函数是两个文本型的参数,所以就填两个ty_string就好。

需要注意一下。在定义扩展函数的参数的时候,一定要注意参数数量,GM规定如果扩展函数的参数为4个以内(包括4个)可以使用real型和string型。如果超过4个,则所有的参数必须都为real型!

之后我们来试试这个扩展函数能不能用吧。创建一个新的脚本,取名为eplugin_message_box,然后写下如下代码:

return external_call(global.__eplugin_MessageBox,argument0,argument1);

这个的意思就是,把调用eplugin_message_box的两个参数传递到易语言做的DLL里面,实现扩展函数调用。

新建一个对象,并把对象扔进房间里面,添加创建事件调用eplugin_init()初始化插件。

添加按下回车键事件,并写下如下代码:

eplugin_message_box("大家好,我是标题","嗯,透露一个秘密吧,其实梦****是个大撒比!");

差不多就是下面这样

6.png

好了!运行一下然后敲回车试试吧!别忘了用易语言把你编译的DLL跟gmk文件放在一起哈。

7.png

嗯!可以看的出来,效果拔群!而且支持中文也是非常的好!因为GM8和易语言都是属于ANSI程序,所以就不会出现什么烦人的乱码问题啦!(当然只限于在中文版的win系统上。。其他语言的就会乱码了。)

之后,只要在游戏里的任意地方调用eplugin_message_box函数,就会弹出信息框啦~

获取百度首页的网页源码

同样的使用易语言编写这个东西也是相当轻松了,想当年劳资用特么39DLL还有HTTPDLL,折腾了老半天写了好几行代码才实现这么个屁功能,而这掉渣天的易语言居然写一行代码就做到了!!!不说了,直接截个图上子程序好了,会易语言的都知道怎么写吧。

8.png

嗯,然后GM里测试一下。别忘了每次写完易代码都要新编译出来一个DLL啊。

在eplugin_init脚本里完成对netread函数的定义:

global.__eplugin_netread = external_define(path,"netread",dll_stdcall,ty_string,1,ty_string); //定义读网页源码函数

然后新建一个脚本取名为eplugin_netread,写下如下代码:

return external_call(global.__eplugin_netread,argument0)

在刚才的那个物体里面新建个按下空格,对该方法进行调用,并把返回的网页源码显示出来。

9.png

嗯好了测试一下吧。

10.png

看到没有啊!!!草泥马啊!!劳资用39dll写了几十行的代码!易语言这个逼就写了一行就做到了啊!!!!

最后再说几句,顺便放下源码

这里还是要BB几句,只是用于进阶级玩家快速创建插件才使用易语言,千万不要对这个东西产生依赖。易语言的支持库有很多很多封装好的功能,稍微学习一下就能轻松的调用了。

11.png

另外,使用易语言如果要是想看函数的参数说明的话,把输入标放在函数明上,然后按F1,就可以在下面看到说明了。。看样子F1还是万能的啊。。大家用GM的时候也要多用F1哦~

源代码下载:本地下载 (包括.gmk和.e)


分享:

支付宝

微信