对于程序员而言,游戏开发是一件非常有趣的事情,特别是对大多数的计算机专业相关的学生而言,或多或少都会有一点的游戏情结,所以笔者在后续的文章中将向没有接触过游戏开发的同学讲解一些简单的游戏开发常识。
做游戏开发首先需要了解的一个概念是游戏引擎,详情参见这里,顾名思义,引擎一款游戏的核心,是对游戏中最核心逻辑和功能的抽象和封装,例如对于网游而言,场景和人物的绘制,网络通信等最为基础,计算量庞大且不易改变的功能会放在引擎中来做,引擎一般采用C/C++来进行编写,以此来提高游戏的运行效率。除了场景绘制,网络通信之外,游戏还包括游戏逻辑,比如可以点击一个NPC并与之对话,或者打开物品栏来使用其中的道具,而这种逻辑的实现一般采用脚本语言,如最常见的Python,Lua以及页游中常用的AS等来实现,本人是某西游类题材的端游客户端程序员,其引擎使用C++语言完成,逻辑使用Lua脚本,故而在以后的文章中都会使用这两种语言来进行描述。
首先来认识简单认识一个Lua这个语言,Lua一个非常非常小巧的嵌入式语言,由于非常小巧,所以很多其它脚本语言中提供的功能它都没有,既然这样为什么还要使用Lua呢,其原因还是因为Lua非常简单小巧,与C/C++进行交互非常方便,BTW,大名鼎鼎的魔兽世界的客户端逻辑就是使用Lua的,而Lua也是因WOC而成名的,没接触过Lua的同学可以参考这里。
为了更加让读者对C++和Lua的交互有一个直观的了解,下面使用一段代码来进行简单的讲解一下:
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
extern "C"
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}
// C++ 调用Lua脚本定义的函数
void cpp_call_lua_api()
{
lua_State *L = lua_open();;
// 打开Lua中一些常用的库
luaL_openlibs(L);
//加载lua文件
luaL_dofile(L, "test.lua");
//脚本:
//function Add(a, b)
// return a + b
//end
// 取得定义的Add函数,将其置于栈顶
lua_getglobal(L,"Add");
lua_pushinteger(L,6);//函数参数1
lua_pushinteger(L,5);//函数参数2
lua_pcall(L,2,1,0);//调用lua_add函数,同时会对lua_add及两个参加进行出栈操作,并压入返回值
int result = lua_tointeger(L,-1);//从栈中取回返回值
printf("result = %d",result);
lua_pop(L,1);//清栈,由于当前只有一个返回值
//关闭lua环境
lua_close(L);
}
int calc_max_min (lua_State * L)
{
int a = lua_tointeger(L, 1);//取得函数参数
int b = lua_tointeger(L, 2);
printf("a:%d, b:%d\n", a, b);
int min = a < b ? a : b;
int max = a < b ? b : a;
lua_pushinteger(L,max);//入栈返回值
lua_pushinteger(L,min);//入栈返回值
return 2;//2表示压入栈数据个数
}
// Lua 脚本调用C++定义的函数
void lua_call_cpp_api()
{
lua_State *L = lua_open();;
// 打开Lua中一些常用的库
luaL_openlibs(L);
// 注册MaxMin函数,供脚本来进行调用,MaxMin指向C++定义的calc_max_min函数
lua_register(L, "MaxMin", calc_max_min);
//加载lua文件
luaL_dofile(L, "max_min.lua");
//脚本:
//local max, min = MaxMin(133, 50)
//print("max =", max)
//print("min =", min)
//关闭lua环境
lua_close(L);
}
int _tmain(int argc, _TCHAR* argv[])
{
lua_call_cpp_api();
return 0;
}
当然如果没有接触过Lua,可能会对上面的内容有一点不理解,Lua与C++的交互其实都是基于栈的交互,lua_State *L = lua_open();这句话的语义是创建一个Lua和C++交互的栈,所有的交互都要通过L来执行。
最后我要说的是最好的老师是实践,希望本文能起到抛砖引玉的效果,让大家了解C++和Lua交互是非常简单的事情。
原文:http://blog.csdn.net/realxie/article/details/23106513