Cocos2d-x-Lua示例项目HelloLua,经验分享

文章详细描述了如何在Cocos2d-x框架中利用Lua编程语言创建动画、处理触控事件,包括加载纹理、帧序列动画、移动对象和响应用户触摸操作。
摘要由CSDN通过智能技术生成

local textureDog = cc.Director:getInstance():getTextureCache():addImage(“dog.png”)

– 设置第一帧帧区域

local rect = cc.rect(0, 0, frameWidth, frameHeight)

– 创建第一帧精灵Frame

local frame0 = cc.SpriteFrame:createWithTexture(textureDog, rect)

– 设置第二帧帧区域

rect = cc.rect(frameWidth, 0, frameWidth, frameHeight)

– c创建第二帧精灵Frame

local frame1 = cc.SpriteFrame:createWithTexture(textureDog, rect)

– 基于使用第一帧Frame创建Sprite对象

local spriteDog = cc.Sprite:createWithSpriteFrame(frame0)

spriteDog.isPaused = false

spriteDog:setPosition(origin.x, origin.y + visibleSize.height / 4 * 3)

–[[

local animFrames = CCArray:create()

animFrames:addObject(frame0)

animFrames:addObject(frame1)

]]–

– 根据帧序列数组创建一个动画animation。帧间隔时间delay等于0.5秒

local animation = cc.Animation:createWithSpriteFrames({frame0,frame1}, 0.5)

– 根据动画animation创建动作实例

local animate = cc.Animate:create(animation);

– 松鼠精灵执行该动作

spriteDog:runAction(cc.RepeatForever: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

– 生成一个scheule,每帧执行tick函数

schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(tick, 0, false)

return spriteDog

end

– create farm 创建地面的农场

local function createLayerFarm()

– 创建一个新的Lyaer用作农场管理

local layerFarm = cc.Layer:create()

– add in farm background 添加农场管理

local bg = cc.Sprite: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 = cc.Sprite:create(“land.png”)、

– 设定每一块砖块位置

spriteLand:setPosition(200 + j * 180 - i % 2 * 90, 10 + i * 95 / 2)

layerFarm:addChild(spriteLand)

end

end

– add crop 添加庄稼,注意crop.png是多张图的合成贴图,所以只取了里面的部分贴图

local frameCrop = cc.SpriteFrame:create(“crop.png”, cc.rect(0, 0, 105, 95))

for i = 0, 3 do

for j = 0, 1 do

local spriteCrop = cc.Sprite:createWithSpriteFrame(frameCrop);

spriteCrop:setPosition(10 + 200 + j * 180 - i % 2 * 90, 30 + 10 + i * 95 / 2)

layerFarm:addChild(spriteCrop)

end

end

– add moving dog 调用上面的createDog()方面,创建一个移动的松鼠

local spriteDog = creatDog()

layerFarm:addChild(spriteDog)

– handing touch events 手指触摸事件处理

local touchBeginPoint = nil

– 手指点击开始

local function onTouchBegan(touch, event)

local location = touch:getLocation()

cclog(“onTouchBegan: %0.2f, %0.2f”, location.x, location.y)

touchBeginPoint = {x = location.x, y = location.y} – 保存点击位置

spriteDog.isPaused = true – 将松鼠暂停移动

– CCTOUCHBEGAN event must return true

return true

end

– 手指按住移动

local function onTouchMoved(touch, event)

local location = touch:getLocation()

cclog(“onTouchMoved: %0.2f, %0.2f”, location.x, location.y)

if touchBeginPoint then

– 将整个农村层拖动,因为之前已经将农场里面所有对象加入layerFarm

local cx, cy = layerFarm:getPosition()

layerFarm:setPosition(cx + location.x - touchBeginPoint.x,

cy + location.y - touchBeginPoint.y)

touchBeginPoint = {x = location.x, y = location.y}

end

end

– 手指离开

local function onTouchEnded(touch, event)

local location = touch:getLocation()

cclog(“onTouchEnded: %0.2f, %0.2f”, location.x, location.y)

touchBeginPoint = nil – 点击位置数据清空

spriteDog.isPaused = false – 恢复松鼠移动

end

– 创建触摸事件监听器

local listener = cc.EventListenerTouchOneByOne:create()

– 注册touch事件

listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )

listener:registerScriptHandler(onTouchMoved,cc.Handler.EVENT_TOUCH_MOVED )

listener:registerScriptHandler(onTouchEnded,cc.Handler.EVENT_TOUCH_ENDED )

local eventDispatcher = layerFarm:getEventDispatcher()

– 添加场景图优先级事件监听

eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layerFarm)

local function onNodeEvent(event)

if “exit” == event then

cc.Director:getInstance():getScheduler():unscheduleScriptEntry(schedulerID)

end

end

layerFarm:registerScriptHandler(onNodeEvent)

return layerFarm

end

– create menu 创建界面菜单

local function createLayerMenu()

– 创建一个新的Layer管理所有菜单

local layerMenu = cc.Layer:create()

local menuPopup, menuTools, effectID

– 点击菜单回调函数

local function menuCallbackClosePopup()

– stop test sound effect 关闭音效

cc.SimpleAudioEngine:getInstance():stopEffect(effectID)

menuPopup:setVisible(false) – 隐藏菜单

end

– 点击菜单回调函数

local function menuCallbackOpenPopup()

– loop test sound effect 打开营销

local effectPath = cc.FileUtils:getInstance():fullPathForFilename(“effect1.wav”)

effectID = cc.SimpleAudioEngine:getInstance():playEffect(effectPath)

menuPopup:setVisible(true)

end

– add a popup menu 创建弹出的菜单面板

local menuPopupItem = cc.MenuItemImage:create(“menu2.png”, “menu2.png”)

menuPopupItem:setPosition(0, 0)

menuPopupItem:registerScriptTapHandler(menuCallbackClosePopup)

menuPopup = cc.Menu:create(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 = cc.MenuItemImage:create(“menu1.png”, “menu1.png”)

menuToolsItem:setPosition(0, 0)

– 注册点击回调地址

menuToolsItem:registerScriptTapHandler(menuCallbackOpenPopup)

menuTools = cc.Menu:create(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 = nil

if (cc.PLATFORM_OS_IPHONE == targetPlatform) or (cc.PLATFORM_OS_IPAD == targetPlatform) then

bgMusicPath = cc.FileUtils:getInstance():fullPathForFilename(“res/background.caf”)

else

bgMusicPath = cc.FileUtils:getInstance():fullPathForFilename(“res/background.mp3”)

end

cc.SimpleAudioEngine:getInstance():playMusic(bgMusicPath, true)

local effectPath = cc.FileUtils:getInstance():fullPathForFilename(“effect1.wav”)

– 预加载音效

cc.SimpleAudioEngine:getInstance():preloadEffect(effectPath)

– run

local sceneGame = cc.Scene:create() – 创建场景

sceneGame:addChild(createLayerFarm()) – 将农场层加入场景

sceneGame:addChild(createLayerMenu()) – 将菜单界面层加入场景

– 判断是否有运行的场景

if cc.Director:getInstance():getRunningScene() then

cc.Director:getInstance():replaceScene(sceneGame) – 替换场景

else

cc.Director:getInstance():runWithScene(sceneGame)

end

end

–[[

xpcall( 调用函数, 错误捕获函数 );

lua提供了xpcall来捕获异常

xpcall接受两个参数:调用函数、错误处理函数。

当错误发生时,Lua会在栈释放以前调用错误处理函数,因此可以使用debug库收集错误相关信息。

两个常用的debug处理函数:debug.debug和debug.traceback

前者给出Lua的提示符,你可以自己动手察看错误发生时的情况;

后者通过traceback创建更多的错误信息,也是控制台解释器用来构建错误信息的函数。

–]]

local status, msg = xpcall(main, G__TRACKBACK)

if not status then

error(msg)

end

这是Cocos2d-x 3.1.1所使用的代码,代码中的注释已经很详细了,笔者在这里就不多说,希望大家能认真阅读,跟笔者一起尽快入门Lua在Cocos2dx中的使用。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

写在最后

由于本文罗列的知识点是根据我自身总结出来的,并且由于本人水平有限,无法全部提及,欢迎大神们能补充~

将来我会对上面的知识点一个一个深入学习,也希望有童鞋跟我一起学习,一起进阶。

提升架构认知不是一蹴而就的,它离不开刻意学习和思考。

**这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家,**梳理了多年的架构经验,筹备近1个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

领取方式:点击这里获取免费架构视频资料

最近还在整理并复习一些Android基础知识点,有问题希望大家够指出,谢谢。

希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!

转发+点赞+关注,第一时间获取最新知识点

-1710833100772)]

写在最后

由于本文罗列的知识点是根据我自身总结出来的,并且由于本人水平有限,无法全部提及,欢迎大神们能补充~

将来我会对上面的知识点一个一个深入学习,也希望有童鞋跟我一起学习,一起进阶。

提升架构认知不是一蹴而就的,它离不开刻意学习和思考。

**这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家,**梳理了多年的架构经验,筹备近1个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

[外链图片转存中…(img-XNZSq33i-1710833100773)]

[外链图片转存中…(img-U4PvYSjM-1710833100773)]

领取方式:点击这里获取免费架构视频资料

最近还在整理并复习一些Android基础知识点,有问题希望大家够指出,谢谢。

希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!

转发+点赞+关注,第一时间获取最新知识点

Android架构师之路很漫长,一起共勉吧!

  • 28
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值