创建完cocos2d-x的lua项目后。打开项目的Resources目录,找到hello.lua。cocos2d-x的lua项目的測试样例主要就是由这个脚本文件运行的。

require "AudioEngine" --引入声音引擎文件

-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
print("----------------------------------------")
print("LUA ERROR: " .. tostring(msg) .. "\n")--打印错误信息
print(debug.traceback())--输出当前运行的traceback信息
print("----------------------------------------")
end
--主函数
local function main()
-- avoid memory leak
-- 避免内存泄露
--操作垃圾收集器
collectgarbage("setpause", 100)
collectgarbage("setstepmul", 5000)
--定义日志输出函数
local cclog = function(...)
print(string.format(...))
end
--引入hello2脚本
require "hello2"
--调用hello2脚本中的myadd函数
cclog("result is " .. myadd(3, 5)) ---------------
--获取屏幕的可视化大小
local visibleSize = CCDirector:sharedDirector():getVisibleSize()
--获取可视区域的起点坐标
local origin = CCDirector:sharedDirector():getVisibleOrigin() -- add the moving dog
--创建一个可移动的小狗
local function creatDog()
local frameWidth = 105
local frameHeight = 95 -- create dog animate
--加入小狗的贴图到内存中
local textureDog = CCTextureCache:sharedTextureCache():addImage("dog.png")
--创建截取第一个小狗的精灵帧的矩形
local rect = CCRectMake(0, 0, frameWidth, frameHeight)
--创建一个小狗的精灵帧
local frame0 = CCSpriteFrame:createWithTexture(textureDog, rect)
--创建截取第二个小狗的精灵帧的矩形
rect = CCRectMake(frameWidth, 0, frameWidth, frameHeight)
--创建一个第二个小狗的精灵帧
local frame1 = CCSpriteFrame:createWithTexture(textureDog, rect) --以小狗的第一个精灵帧创建一个小狗精灵
local spriteDog = CCSprite:createWithSpriteFrame(frame0)
--自己定义一个bool值的属性,标记为false
spriteDog.isPaused = false
--设置小狗的位置在 x:0, y:屏幕高度*0.75 处
spriteDog:setPosition(origin.x, origin.y + visibleSize.height / 4 * 3)
--创建一个用于存储精灵帧的数组
local animFrames = CCArray:create()
--把上面的两个精灵帧加入到数组中
animFrames:addObject(frame0)
animFrames:addObject(frame1)
--以0.5秒的切换速度方式创建一个动画描写叙述
local animation = CCAnimation:createWithSpriteFrames(animFrames, 0.5)
--依据上面的动画描写叙述创建一个动画
local animate = CCAnimate:create(animation);
--运行该动画
spriteDog:runAction(CCRepeatForever:create(animate)) -- moving dog at every frame
--小狗每帧都在移动
local function tick()
if spriteDog.isPaused then return end--假设暂停,则返回,不移动
local x, y = spriteDog:getPosition()--获取小狗的当前位置
if x > origin.x + visibleSize.width then--假设小狗的移到屏幕外面
x = origin.x--重置小狗的位置
else
x = x + 1--每帧往右移动一个像素
end
--刷新小狗的最新位置
spriteDog:setPositionX(x)
end
--运行定时器
CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(tick, 0, false)
--返回创建的小狗
return spriteDog
end -- create farm
--创建农田
local function createLayerFarm()
--创建一个农场层
local layerFarm = CCLayer:create() -- add in farm background
--创建一个背景精灵
local bg = CCSprite:create("farm.jpg")
--设置背景精灵的位置
bg:setPosition(origin.x + visibleSize.width / 2 + 80, origin.y + visibleSize.height / 2)
--把背景精灵加入到农场层中
layerFarm:addChild(bg) -- add land sprite
--创建农场精灵
for i = 0, 3 do
for j = 0, 1 do
local spriteLand = CCSprite:create("land.png")
spriteLand:setPosition(200 + j * 180 - i % 2 * 90, 10 + i * 95 / 2)
layerFarm:addChild(spriteLand)
end
end -- add crop
--创建农作物
local frameCrop = CCSpriteFrame:create("crop.png", CCRectMake(0, 0, 105, 95))
for i = 0, 3 do
for j = 0, 1 do
local spriteCrop = CCSprite:createWithSpriteFrame(frameCrop);
spriteCrop:setPosition(10 + 200 + j * 180 - i % 2 * 90, 30 + 10 + i * 95 / 2)
layerFarm:addChild(spriteCrop)
end
end -- add moving dog
--创建一个会移动的小狗
local spriteDog = creatDog()
--将小狗加入到农场层中
layerFarm:addChild(spriteDog) -- handing touch events
--初始化触摸点
local touchBeginPoint = nil
--開始点击触摸屏
local function onTouchBegan(x, y)
--输出点击位置
cclog("onTouchBegan: %0.2f, %0.2f", x, y)
--将点击位置赋给触摸点
touchBeginPoint = {x = x, y = y}
--点击时小狗暂停移动
spriteDog.isPaused = true
-- CCTOUCHBEGAN event must return true
return true
end
--滑动触摸屏
local function onTouchMoved(x, y)
--输出滑动位置
cclog("onTouchMoved: %0.2f, %0.2f", x, y)
--假设触摸点不为空
if touchBeginPoint then
--获取农场层的当前位置
local cx, cy = layerFarm:getPosition()
--移动农场层
layerFarm:setPosition(cx + x - touchBeginPoint.x,
cy + y - touchBeginPoint.y)
--将滑动的位置赋给触摸点
touchBeginPoint = {x = x, y = y}
end
end
--离开触摸屏
local function onTouchEnded(x, y)
--输出离开屏幕时的位置
cclog("onTouchEnded: %0.2f, %0.2f", x, y)
--删除触摸点
touchBeginPoint = nil
--小狗又一次移动
spriteDog.isPaused = false
end
--处理触摸状态
local function onTouch(eventType, x, y)
if eventType == "began" then --点击屏幕状态
return onTouchBegan(x, y)
elseif eventType == "moved" then --滑动屏幕状态
return onTouchMoved(x, y)
else --离开屏幕状态
return onTouchEnded(x, y)
end
end
--注冊触摸事件
layerFarm:registerScriptTouchHandler(onTouch)
--开启触摸
layerFarm:setTouchEnabled(true)
--返回农场层
return layerFarm
end -- create menu
--创建菜单
local function createLayerMenu()
--创建一个菜单层
local layerMenu = CCLayer:create()
--定义三个变量
local menuPopup, menuTools, effectID
--运行菜单项的回调函数
local function menuCallbackClosePopup()
-- stop test sound effect
--停止音效的播放
AudioEngine.stopEffect(effectID)
--隐藏菜单
menuPopup:setVisible(false)
end
--运行菜单项的回调函数
local function menuCallbackOpenPopup()
-- loop test sound effect
--获取播放音效的路径
local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename("effect1.wav")
--播放音效
effectID = AudioEngine.playEffect(effectPath)
--显示菜单
menuPopup:setVisible(true)
end -- add a popup menu
--创建一个菜单项
local menuPopupItem = CCMenuItemImage:create("menu2.png", "menu2.png")
--设置菜单项位置
menuPopupItem:setPosition(0, 0)
--设置运行该菜单项所相应的回调函数
menuPopupItem:registerScriptTapHandler(menuCallbackClosePopup)
--创建一个菜单
menuPopup = CCMenu:createWithItem(menuPopupItem)
--设置菜单位置
menuPopup:setPosition(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2)
--隐藏菜单
menuPopup:setVisible(false)
--将该菜单加入到菜单层
layerMenu:addChild(menuPopup) -- add the left-bottom "tools" menu to invoke menuPopup
--创建一个菜单项
local menuToolsItem = CCMenuItemImage:create("menu1.png", "menu1.png")
--设置菜单项位置
menuToolsItem:setPosition(0, 0)
--设置运行该菜单项所相应的回调函数
menuToolsItem:registerScriptTapHandler(menuCallbackOpenPopup)
--创建一个菜单
menuTools = CCMenu:createWithItem(menuToolsItem)
--设置菜单位置
local itemWidth = menuToolsItem:getContentSize().width
local itemHeight = menuToolsItem:getContentSize().height
menuTools:setPosition(origin.x + itemWidth/2, origin.y + itemHeight/2)
--将该菜单加入到菜单层
layerMenu:addChild(menuTools)
--返回菜单层
return layerMenu
end -- play background music, preload effect -- uncomment below for the BlackBerry version
-- local bgMusicPath = CCFileUtils:sharedFileUtils():fullPathForFilename("background.ogg")
--获取背景音乐的文件路径
local bgMusicPath = CCFileUtils:sharedFileUtils():fullPathForFilename("background.mp3")
--播放背景音乐
AudioEngine.playMusic(bgMusicPath, true)
--获取音效的文件路径
local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename("effect1.wav")
--将音效缓存到内存中
AudioEngine.preloadEffect(effectPath) -- run
--创建一个场景
local sceneGame = CCScene:create()
--将农村层加入到该场景中
sceneGame:addChild(createLayerFarm())
--将菜单层加入到该场景中
sceneGame:addChild(createLayerMenu())
--运行该场景
CCDirector:sharedDirector():runWithScene(sceneGame)
end
--保护模式下调用主函数,并制定错误处理函数句柄__G__TRACKBACK__
xpcall(main, __G__TRACKBACK__)

而这个脚本是在AppDelegate.cpp中被运行的。里面初始化了cocos2d-x解析lua的引擎。

bool AppDelegate::applicationDidFinishLaunching()
{
// initialize director
CCDirector *pDirector = CCDirector::sharedDirector();
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView()); // turn on display FPS
pDirector->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this
pDirector->setAnimationInterval(1.0 / 60); // register lua engine
//初始化lua脚本引擎
CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
//将lua脚本引擎加入到脚本引擎管理器中
CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);
//取得lua的全局指针,全部的lua函数都须要使用这个指针来做为參数进行调用。
CCLuaStack *pStack = pEngine->getLuaStack();
//获取lua_State
lua_State *tolua_s = pStack->getLuaState();
//开放扩展函数给lua调用
tolua_extensions_ccb_open(tolua_s);
//假设是ios、android、win32平台则开放WebSocket类给lua调用
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
pStack = pEngine->getLuaStack();
tolua_s = pStack->getLuaState();
tolua_web_socket_open(tolua_s);
#endif #if (CC_TARGET_PLATFORM == CC_PLATFORM_BLACKBERRY)//黑莓平台,不清楚
CCFileUtils::sharedFileUtils()->addSearchPath("script");
#endif
//获取待运行的脚本路径
std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("hello.lua");
//运行脚本
pEngine->executeScriptFile(path.c_str()); return true;
}

当中CCLuaEngine是继承自CCScriptEngineProtocl,这个协议定义了lua引擎的功能,当中CCScriptEngineManager用来管理当期的脚本文件(眼下没发现这个管理类有什么用)。

void CCScriptEngineManager::setScriptEngine(CCScriptEngineProtocol *pScriptEngine)
{
removeScriptEngine();//移除上一个的脚本引擎
m_pScriptEngine = pScriptEngine;//将当前的脚本引擎赋给m_pScriptEngine
} void CCScriptEngineManager::removeScriptEngine(void)
{
if (m_pScriptEngine)//假设脚本引擎的实例存在,则delete掉
{
delete m_pScriptEngine;
m_pScriptEngine = NULL;
}
}

解析cocos2d-lua项目中的Hello World的更多相关文章

  1. 分析cocos2d-x的lua项目中的工具方法

    在创建完cocos2d-x的lua项目后.打开项目的Resources中的extern.lua文件.里面有两个用于面向对象的方法.一个是用于克隆,一个是用于继承. 代码分析例如以下 --克隆一个对象 ...

  2. 从cocos2d-x-2.x到cocos2d-x-3.x: lua项目配置

    cocos2dx-x3.0的正式版出来也有一段时间了,现在最新的版本是到了3.2alpha,和2.x系列相比,能够找到的相关资料除了官网上的wiki,其他的也不见得多,遇到的一些和2.x的差异和问题在 ...

  3. maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener

    环境:Groovy/Grails Tool Suite 3.1.0.RELEASE(BASED ON ECLIPSE JUNO 3.8.1).JDK1.6.Maven3.05.Tomcat6 错误描述 ...

  4. maven web 项目中启动报错 Java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet

    主要原因是maven项目里面的jar包吗,没有导入到项目中 maven web 项目中启动报错 Java.lang.ClassNotFoundException: org.springframewor ...

  5. android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件

    简介 XStream 是一个开源项目,一套简单实用的类库,用于序列化对象与 XML 对象之间的相互转换. 将 XML 文件内容解析为一个对象或将一个对象序列化为 XML 文件. 1.下载工具 xstr ...

  6. 转 web项目中的web.xml元素解析

    转 web项目中的web.xml元素解析 发表于1年前(2014-11-26 15:45)   阅读(497) | 评论(0) 16人收藏此文章, 我要收藏 赞0 上海源创会5月15日与你相约[玫瑰里 ...

  7. 如何在cocos2d项目中enable ARC

    如何在cocos2d项目中enable ARC 基本思想就是不支持ARC的代码用和支持ARC的分开,通过xcode中设置编译选项,让支持和不支持ARC的代码共存. cocos2d是ios app开发中 ...

  8. 快速将wax配置到项目中进行lua开发

    通过Finder浏览到你保存该项目的文件夹.创建三个新的文件夹:wax.scripts和Classes. 第一:首先,下载源代码的压缩包.Wax放在GitHub上(https://github.com ...

  9. 项目中lua(基础)

    关于项目中lua任务(某些没弄懂,但lua上耗费时间有点长了不看了) 这段时间看了lua语法和项目中lua应用 .在lua中注册c库,在lua5.2中好像都是注册c库,相当于在lua中定义一个tabl ...

随机推荐

  1. Framework7首页隐藏navbar

    f7首页隐藏navbar其他页面显示navbar 帮别人解决问题,自己也记录一下, 首页.navbar加.navbar-hidden, 首页.page加.no-navbar, 如果首页有.navbar ...

  2. 树莓派zero_w 串口的使用(解决usb可用rxtx不可用的问题)

    2018-06-0212:10:14 查了很多资料,搞了一上午,终于解决了,之前看教程做了树莓派与arduino的通信,GPIO的RXTX测试失败,无奈只能用USB,效果还可以,可是今天我想用RXTX ...

  3. sql的for update

    欢迎大家吐槽 oracle行级共享锁 通常是通过select … from for update语句添加的,同时该方法也是我们用来手工锁定某些记录的主要方法.比如,当我们在查询某些记录的过程中,不希望 ...

  4. JavaScipt30(第七个案例)(主要知识点:数组some,every,findIndex方法)

    承接上文,这是第7个案例,这个案例没什么说的,主要有三个注意点: 附上项目链接: https://github.com/wesbos/JavaScript30 // 1. slice(begin, e ...

  5. vue基础---事件处理

    (1)事件监听 v-on 指令监听 DOM 事件,并在触发时运行JS代码 <div class="event_area"> {{message}} <button ...

  6. datagrid总条数

    1.getData var data=$("#dg").datagrid("getData");alert('总数据量:' + data.total)//注意你 ...

  7. JAVA基础——文件File简单实用

    1.1java.io.File File用于表示文件系统中的一个文件或目录 通过File可以: 1:访问该文件或目录的属性信息(名字,大小,修改时间等) file.getName();获取文件名fil ...

  8. Luogu P4014 「 网络流 24 题 」分配问题

    解题思路 还是建立超级源点和超级汇点,又因为题目给出规定一个人只能修一个工件,所以建图的时候还要讲容量都设为$1$. 人的编号是$1\rightarrow n$,工件的编号是$n+1\rightarr ...

  9. Jenkins 的插件AnsiColor 多颜色

  10. java 数组排序并去重

    https://www.cnblogs.com/daleyzou/p/9522533.htmlimport java.lang.reflect.Array;import java.util.Array ...