zoukankan      html  css  js  c++  java
  • C++转让Lua

    转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/39756423


    我使用的cocos2d-x版本号是2.3.3。先在一个C++project中配置好lua的环境。


    首先导入lua项目

    1.libluaproject是cocos2d-x-2.2.3scriptingluaproj.win32liblua.vcxproj这个文件。导入VS2010project中

    2.包括文件夹:在project的属性-配置属性-C/C++-常规-附加包括文件夹中增加$(ProjectDir)......scriptinglua olua,$(ProjectDir)......scriptinglualua。

    $(ProjectDir)......scriptinglualua

    3.在属性-配置属性-链接器-输入-附加依赖项增加liblua.lib和lua51.lib

    好了,lua环境就配置好了

    在HelloWorld.cpp中增加头文件引用#include "CCLuaEngine.h",#include "script_supportCCScriptSupport.h"

    以下開始写lua了,lua代码例如以下

    pageName="equip"
    a={student="zhangsan",age=23}
    function main()
    print("leoooooooooooooo")
    end
    
    
    function printSomething(name,age)
    print("-----------------name is "..name)
    print("-----------------age is "..age)
    end
    
    function returnSomething(name,age)
    return name,age
    end

    这个写的lua代码,以下看C++部分,首先在AppDelegate.cpp中增加

    	CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
    
    	CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);
    来设置lua的引擎

    然后在HelloWorld.cpp的点击事件中将lua代码载入

    	CCLuaEngine *pEngine = CCLuaEngine::defaultEngine();
    	pEngine->executeString("require "lua/hello.lua"");

    以下主要说3个知识点

    1.调用lua的函数

    	//调用无參数无返回值的函数
    	lua_State* L=pEngine->getLuaStack()->getLuaState();
    	//获得栈顶,而且保存值
    	int top=lua_gettop(L);
    	lua_getglobal(L,"main");
    	//看看在不在那里
    	if(!lua_isfunction(L,-1))
    	{
    		CCLog("------------return");
    	}
    	//第一个參数是栈的状态的指针,第二个參数是參数个数,第三个參数是返回值的个数,第四个參数是出现错误的回调函数的地址
    	lua_pcall(L,0,0,0);
    	//还原栈
    	lua_settop(L,top);
    
    	
    
    	//调用有參数,无返回值的函数
    	top=lua_gettop(L);
    	lua_getglobal(L,"printSomething");
    	//看看在不在那里
    	if(!lua_isfunction(L,-1))
    	{
    		CCLog("------------return");
    	}
    	//一一相应啊
    	lua_pushstring(L,"zhycheng");
    	lua_pushnumber(L,24);
    	lua_pcall(L,2,0,0);
    	lua_settop(L,top);
    
    	//调用有參数。有两个返回值的函数
    	top=lua_gettop(L);
    	lua_getglobal(L,"returnSomething");
    	if(!lua_isfunction(L,-1))
    	{
    		CCLog("------------return");
    	}
    	lua_pushstring(L,"new");
    	lua_pushnumber(L,22);
    	lua_pcall(L,2,2,0);
    	if(!lua_isnumber(L,-1)||!lua_isstring(L,-2))
    	{
    		CCLog("return error");
    	}
    	//name在以下
    	int age =(int)lua_tonumber(L,-1);
    	const char* name=lua_tostring(L,-2);
    	CCLog("age is %d",age);
    	CCLog("name %s",name);
    	lua_settop(L,top);

    2.获得lua的一个全局变量的值

    	//读取lua的全局变量
    	top=lua_gettop(L);
    	lua_getglobal(L,"pageName");
    	if(!lua_isstring(L,-1))
    	{
    		CCLog("return error");
    	}
    	const char* equipname=lua_tostring(L,-1);
    	CCLog("name is %s",equipname);
    	lua_settop(L,top);

    3.訪问全局table的某一个值

    	//获取lua表中的某个key的value
    	top=lua_gettop(L);
    	lua_getglobal(L,"a");
    	if(!lua_istable(L,-1))
    	{
    		CCLog("error----------------");
    	}
    	lua_pushstring(L,"student");
    	//lua_gettable是一个函数。它首先让键值出站,获取对应表元素的值。然后把这个值入栈
    	//此时student在-2的位子。然这个key出栈。让他的值入栈
    	lua_gettable(L,-2);
    	if(!lua_isstring(L,-1))
    	{
    		CCLog("error --------------");
    	}
    	const char* studentName = lua_tostring(L, -1);
    	CCLog("studentName is %s",studentName);
    	lua_settop(L,top);
    	//再获取的时候一定要注意栈的问题
    	//获取年龄
    	top=lua_gettop(L);
    	lua_getglobal(L,"a");
    	if(!lua_istable(L,-1))
    	{
    		CCLog("error----------------");
    	}
    	lua_pushstring(L,"age");
    	lua_gettable(L,-2);
    	if(!lua_isnumber(L,-1))
    	{
    		CCLog("error-----------------");
    	}
    	int aage=lua_tonumber(L,-1);
    	CCLog("aage is %d",aage);
    	lua_settop(L,top);

    好了,就说这么多,对于栈的操作,能够从-1開始,也能够从1開始。从-1開始的话。就是从栈顶往下,从1開始就是从栈底向上。

    下载资源:http://download.csdn.net/detail/zhy_cheng/7999945

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Windows、Linux、ARM、Android、iOS全平台支持的RTMP推流组件EasyRTMPAndroid如何修改分辨率和码率
    高稳定性、低延时的网络全终端播放器H5播放器网页直播/点播播放器EasyPlayer.js播放flv格式视频显示跨域问题解决方案
    RTSP播放器网页web无插件直播流媒体音视频播放器EasyPlayerRTSP实现支持H265编码格式过程介绍
    简单、高效、易用的全平台(Windows/Linux/ARM/Android/iOS)web实现RTMP推送组件EasyRTMPAndroid如何开启悬浮窗
    模板学习实践一 accumulationtraits
    模板学习实践二 pointer
    黑客屏保 代码来自网络搜索 做了部分改动
    设计模式之模板模式 template
    CMAKE 教程前两章节学习
    cmake 及make 实践记录
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4669635.html
Copyright © 2011-2022 走看看