从来没有学过lua,但是从网上的一些大神来看,lua是一种非常厉害的语言,它非常小,编程很快,而且可以用在服务器端......所以这段时间也是偷偷的学习了点lua,主要是看了Cocos2d-x的lua创建例子,初步了解了下cocos2d-x运行lua的方法...这里我也稍稍的尝试了一下,把原来的例子改成我们熟悉的HelloWord界面。
Cocos2d-x里是怎么调用外部的lua的
这是在Cocos2d-x的AppDelegate.cpp里的一段代码,这个就是关键,它在这里启动了个lua的引擎,然后加载了外部的lua文件
// register lua engine
auto engine = LuaEngine::getInstance();//这个应该是lua的引擎吧
ScriptEngineManager::getInstance()->setScriptEngine(engine);
//The call was commented because it will lead to ZeroBrane Studio can't find correct context when debugging
//engine->executeScriptFile("hello.lua");
engine->executeString("require 'hello.lua'");//然后在这里加载了外部的“hello.lua”这个文件
我们能在资源文件夹里发现hello.lua这个文件,貌似所有的lua都放在这个文件夹下,lua的原代码就不看了,直接修改后的代码
require "Cocos2d"
-- cclog
cclog = function(...)
print(string.format(...))
end
-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
cclog("----------------------------------------")
cclog("LUA ERROR: " .. tostring(msg) .. "\n")
cclog(debug.traceback())
cclog("----------------------------------------")
end
local function main()
-- avoid memory leak
collectgarbage("setpause", 100)
collectgarbage("setstepmul", 5000)
--support debug
local targetPlatform = cc.Application:getInstance():getTargetPlatform()
if (cc.PLATFORM_OS_IPHONE == targetPlatform) or (cc.PLATFORM_OS_IPAD == targetPlatform) or
(cc.PLATFORM_OS_ANDROID == targetPlatform) or (cc.PLATFORM_OS_WINDOWS == targetPlatform) or
(cc.PLATFORM_OS_MAC == targetPlatform) then
local host = 'localhost' -- please change localhost to your PC's IP for on-device debugging
require('mobdebug').start(host)
end
require "hello2"
cclog("result is " .. myadd(1, 1))
---------------
local visibleSize = cc.Director:getInstance():getVisibleSize()
local origin = cc.Director:getInstance():getVisibleOrigin()
-- 这个方法就是我修改的
function createLayer()
--创建一个层
local layer=cc.Layer:create()
--背景精灵
local bg=cc.Sprite:create("HelloWorld.png")
bg:setPosition(origin.x + visibleSize.width / 2 , origin.y + visibleSize.height / 2)
layer:addChild(bg)
--HelloWorld
local label=cc.LabelTTF:create("HelloWorld","Arial",24)
label:setPosition(origin.x+visibleSize.width/2,origin.y+visibleSize.height*0.9)
layer:addChild(label)
function callBack()
cclog("end")
--cc.Director:getInstance()
end
--按钮
local menuItenImage=cc.MenuItemImage:create("CloseNormal.png","CloseSelected.png")
menuItenImage:registerScriptTapHandler(callBack)
--menuItenImage:setPosition(cc.Point:ZERO)
local menu=cc.Menu:create(menuItenImage)
menu:setPosition(origin.x+visibleSize.width-menuItenImage:getContentSize().width/2,origin.y+menuItenImage:getContentSize().height/2)
layer:addChild(menu)
return layer
end
-- run
local sceneGame = cc.Scene:create()
sceneGame:addChild(createLayer())
--sceneGame:addChild(createLayerMenu())
cc.Director:getInstance():runWithScene(sceneGame)
end
xpcall(main, __G__TRACKBACK__)