关于脚本
对于游戏脚本有两种解释,一般的解释是“外挂”,也就是自动刷怪等等的那种挂。一种是让脚本和游戏主体沟通,将逻辑单独拎出来的编程技术。我们这里说的不是外挂,说的是如何使用Lua语言做脚本,并且辅助我们自己的游戏主体的编程手段。
预备知识
这个例子使用C++和SDL2制作游戏的主体,Lua作为游戏的脚本。另外需要知道Lua和C/C++互相通信的方法,见这篇博客
注意事项
这个例子是在MacOS系统下编写的。由于用到了动态链接库的创建,如果你是Windows系统的话,需要修改动态链接库部分的代码和编译过程。
例子的目标
我们的例子很简单,场上有两个方块,红色的是敌人,绿色的是玩家,玩家要保持移动不让敌人追上即可。如果追上了就会弹出游戏结束的对话框,并且关闭游戏:
让我们开始吧!
首先让我们把主体的代码框架搭出来,下面的main.cpp可以创建一个800x800大小的窗体:
|
|
这里的几个flag是我们后面要添加代码的地方。
接下来我们要编写关于人物的类:
|
|
接下来是实现这些类:
|
|
其实调用脚本的方法很简单,就是先找到对应函数,将参数压入栈之后调用这个函数,然后再获得函数的返回值即可(如果有的话)。最后不要忘记将栈清空(如果函数没有返回值的话就不用清空,因为lua_pcall
会将函数的参数和函数一起弹出栈,如果有返回值的话就要清空,因为lua栈最大只能容纳20个元素(不同机器不一样,但是都不是很大),如果返回值一直驻留在栈里面,会导致后期参数无法入栈)。
接下来我们需要为Lua脚本编写相应的接口,让脚本文件可以调用一些绘图函数:
|
|
这样的话接口就定义好了。
我们需要将接口编译成动态链接库供脚本使用:
g++ extlib.cpp -fPIC -shared -o extlib.so ${LUA_CONFIG} ${SDL_CONFIG} -std=c++11
然后我们就可以编写脚本了:
|
|
这里玩家的脚本,里面只有一个绘制函数。我们调用了extlib.drawRect函数来实现绘制。
|
|
这样整个脚本和人物都做好了。接下来我们将这些东西整合到main函数中:
|
|
这样,整个例子就写完了。
总结
其实使用lua作为脚本语言很简单,只需要定义好给Lua的接口,然后在文件里调用脚本中相关的函数即可。