今天玩了一把脚本,玩完的感觉是真的好稀饭脚本啊。
1、编译lua注意的总结
lua的项目默认是用在linux上用bjam编译,这点很爽。如果要在windows上编译,有两种方式:
a)用vs的命令行进入lua根目录,执行“etc\luavs.bat”即可,执行成功后会在src目录下生成以下三个文件:
lua.exe
lua.lib
lua.dll
b)手动建立项目文件
自己新建一个静态库或动态库,将根目录下的src文件夹下所有文件拉进来,删除lua.c\luac.c这2个目录即可。注意需要设置编译选项中的字符集为“使用多字节字符集”,不然lua库运行时初始化会崩溃。
今天先用的第二个方式编译,一切正常,但是运行的时候发现初始化lua库的时候程序崩溃,跟踪发现问题出在lua_lib这个函数中,不是很得要领。后来尝试用第一种方式,才没有崩溃。比较发现需要设置编译选项中的字符集为“使用多字节字符集”。
luavs.bat内容如下:
cd src
cl /O2 /W3 /c /DLUA_BUILD_AS_DLL l*.c
del lua.obj luac.obj
link /DLL /out:lua51.dll l*.obj
cl /O2 /W3 /c /DLUA_BUILD_AS_DLL lua.c
link /out:lua.exe lua.obj lua51.lib
cd ..
当然手动编译为dll的时候需要设置编译选项“LUA_BUILD_AS_DLL ”
2.编译luabind
编译luabind的时候,没耐心看官方说明文档,直接拉到vs中编译。当然还是看了下源文件的bjam的相关文件,没有发现有什么特殊的地方需要注意。所以直接编译,直接通过。
总结下,碰到这些开源项目没有vs工程文件,编译说明不像ogre那么全,第一感觉就是怕麻烦。其实那些开源社区的贡献者是非常聪明的人,并不会给我添多少麻烦,如果我非常周折还是有编译问题,说明我走弯路了,得静下来考虑。
3.luabind、luaplus、tolua++。。。
没有找到比较文档,中文有说luabind需要boost所以如何如何的,被我无视掉。所以优劣再说了。luabind是官方一个wiki中介绍的。luplus是武侠使用的,tolua是cegui使用的。
4.脚本赏析
这是脚步:
-- Lua script for test program.
print( 'Hello from LUA!' )
app = getApplication()
app:setBackgroundColour( ColourValue( 0, 0, .25 ) )
camera = app:getCamera()
camera:setPosition( Vector3(0,100,500) )
camera:lookAt( Vector3(0,0,0) )
camera:setNearClipDistance( 5 )
e = app:createEntity( 'Ninja', 'ninja.mesh' )
e:setDisplaySkeleton( true )
rootNode = app:getRootNode()
child = rootNode:createChildSceneNode( 'NinjaNode' )
child:attachObject( e )
child:yaw( 180 )
child:setPosition( Vector3.ZERO )
e = app:createEntity( 'floor', 'floor' )
e:setMaterialName( 'Examples/GrassFloor' , 'Autodetect' )
child = rootNode:createChildSceneNode( 'FloorNode' )
child:attachObject( e )
这是绑定ogre函数的代码:
void bindVector3( lua_State* L )
{
module(L)
[
class_<Vector3>( "Vector3" )
.def(tostring(self))
.def_readwrite( "x", &Vector3::x )
.def_readwrite( "y", &Vector3::y )
.def_readwrite( "z", &Vector3::z )
.def(constructor<>())
.def(constructor<Vector3&>())
.def(constructor<Real, Real, Real>())
.def("absDotProduct", &Vector3::absDotProduct)
.def("crossProduct", &Vector3::crossProduct )
.def("directionEquals", &Vector3::directionEquals )
.def("distance", &Vector3::distance )
.def("dotProduct", &Vector3::dotProduct )
.def("getRotationTo", &Vector3::getRotationTo )
.def("isZeroLength", &Vector3::isZeroLength )
.def("length", &Vector3::length )
.def("makeCeil", &Vector3::makeCeil )
.def("makeFloor", &Vector3::makeFloor )
.def("midPoint", &Vector3::midPoint )
.def("normalise", &Vector3::normalise )
.def("nornaliseCopy", &Vector3::normalisedCopy )
.def("perpendicular", &Vector3::perpendicular )
.def("positionCloses", &Vector3::positionCloses )
.def("positionEquals", &Vector3::positionEquals )
//.def("ptr", &Vector3::ptr )
.def("randomDeviant", &Vector3::randomDeviant )
.def("reflect", &Vector3::reflect )
.def("squaredDistance", &Vector3::squaredDistance )
.def("squaredLength", &Vector3::squaredLength )
// Operators
.def( self + other<Vector3>() )
.def( self - other<Vector3>() )
.def( self * other<Vector3>() )
.def( self * Real() )
];
LUA_CONST_START( Vector3 )
LUA_CONST( Vector3, ZERO);
LUA_CONST( Vector3, UNIT_X );
LUA_CONST( Vector3, UNIT_X);
LUA_CONST( Vector3, UNIT_Y);
LUA_CONST( Vector3, UNIT_Z);
LUA_CONST( Vector3, NEGATIVE_UNIT_X);
LUA_CONST( Vector3, NEGATIVE_UNIT_Y);
LUA_CONST( Vector3, NEGATIVE_UNIT_Z);
LUA_CONST( Vector3, UNIT_SCALE);
LUA_CONST_END;
}
编译运行后的结果: