新建cocos2dx-lua项目 和 HelloLua分析

参考网址“:http://www.it165.net/pro/html/201407/17309.html

  • 一年之前学的cocos2dx,那时候还是用C++编写的,但学完之后就找的一个新的方向——Unity3D开发的岗位,对我而言是一个新的方向,那时候经过了几个月的每天熬夜奋战,从”0“基础到最后项目开发,那时候是在的是个小公司,总体而言还算比较轻松,可能效率利用的比较低,现在刚出来了,来到一家大公司,感觉到很多不一样的变化,方向又改变了,还是回到之前的cocos2dx开发,但用的不是C++,而是lua脚本语言来开发,对我而言又是一个新的方向,既来之则安之,在接触了那么多方向之后,是该选择一个确定的研究方向深入下去。来这该公司一周了,感受到一种之前所没有的紧迫感,每天要给自己下定任务,并且按时按量的去完成,同事都很厉害,都是在这行业工作了多少年的,很有工作经验,希望以后像他们多多请教,公司好多女程序,都很厉害,我的直属上司杨总就是当时面试我的,我以为当时面试的时候他旁边的那位是秘书的,挺漂亮的一个女”上司“,我一直以为是秘书,看起来很年轻,后来从同事那儿了解到她是我们所有人的上司,是公司的技术总监,好吧,我惊讶了,原来她是公司元老级别的程序了。第一天入职,办理好入职手续,下午的时候老大递给了我一般Lua编程的教程,不是太厚,但也不薄,三百多页吧。后来花了两天左右的时间将它看完,由于之前学的语言都是编译型语言,用上强大的Visutial studio+VA提示功能非常强大,导致现在要用文本编辑器来写lua语言有点痛苦,很容易手误,但还是要慢慢习惯,任何事物都有两面性,没有所谓绝对的完美。

    花两天时间看完lua语法,然后花了一天看了下cocos2dx lua的Demo,接下来就可以进行项目开发了,不然每天开例会总是处于学习阶段总感觉不好,公司不会养两种人,懒人和闲人,所以还是多花点业余时间来弥补自己的缺陷,跟上大部队的开发。

    创建Cocos2dx-Lua项目

    我这里使用的是Visual Studio 2012+cocos2dx 2.2.4,前提安装上Python

    打开控制台,通过命令来创建新的项目

    \

    然后打开cocos2dx的projects目录发现生成了刚刚创建的lua项目\

    如果是Windows平台就打开proj.win32->luastudy1.sln,编译一下即可运行势力demo。

     

    效果图

    \

     

    cocos2dx lua项目,lua脚本放在Resources目录下,也就是说lua脚本也像图片,声音资源这些一样被当成是资源利用了,所以如果程序要逻辑跟新或者说有什么bug,可以直接修改lua文件然后重新上传即可,不需要再次编译发布,这也是lua开发cocos2dx的一大优点。

    lua脚本

     

    001. require "AudioEngine"
    002. -- for CCLuaEngine traceback
    003. function __G__TRACKBACK__(msg)
    004. print("----------------------------------------")
    005. print("LUA ERROR: " .. tostring(msg) .. "
    006. ")
    007. print(debug.traceback())
    008. print("----------------------------------------")
    009. end
    010.  
    011. --打印函数
    012. local cclog = function(...)
    013. print(string.format(...))
    014. end
    015.  
    016. function main()
    017. --调用其他脚本的方法
    018. require "hello2"
    019. --调用其他lua的脚本中的方法
    020. cclog("调用hello2脚本的方法:Result = "..myadd(3,5))
    021. --获取屏幕分辨率
    022. local visibleSize = CCDirector:sharedDirector():getVisibleSize()
    023. --获取屏幕分辨率的起始坐标
    024. local origin = CCDirector:sharedDirector():getVisibleOrigin()
    025.  
    026. print("可视区域的起点坐标:",origin.x,origin.y)
    027. print("屏幕分辨率:",visibleSize.width,visibleSize.height)
    028.  
    029. --创建一个场景
    030. local scene = CCScene:create()
    031. --创建一个层
    032. local layer = CCLayer:create()
    033. --创建一个文本
    034. local label = CCLabelTTF:create("你好 Lua","simkai",50)  --如果中文不显示的话,必须要将lua文件保存为中文
    035. label:setPosition(ccp(visibleSize.width/2+30,visibleSize.height/2+100))
    036. layer:addChild(label)
    037. --创建一个Sprite图标
    038. local iconSprite = CCSprite:create("Icon.png")
    039. iconSprite:setPosition(ccp(80,260))
    040. layer:addChild(iconSprite)
    041.  
    042. ----------------------------创建一个动画精灵---------------------------------------------------
    043. local function createDog()
    044. --创建一个动画(这里是两张图片合成的一张,所以要根据矩形分割)
    045. local frameWidth = 105
    046. local frameHeight = 95
    047. --纹理块管理器创建一个图片文理
    048. local textureDog = CCTextureCache:sharedTextureCache():addImage("dog.png")
    049. local rect = CCRectMake(0,0,frameWidth,frameHeight)
    050. --创建精灵帧
    051. local frame0 = CCSpriteFrame:createWithTexture(textureDog,rect)
    052. rect = CCRectMake(frameWidth,0,frameWidth,frameHeight)
    053. local frame1 = CCSpriteFrame:createWithTexture(textureDog,rect)
    054. --创建一个精灵
    055. local spriteDog = CCSprite:createWithSpriteFrame(frame0)
    056. spriteDog.isPaused = false
    057. spriteDog:setPosition(origin.x+visibleSize.width-60,origin.y + visibleSize.height/2)
    058.  
    059. local animFrames = CCArray:create()
    060.  
    061. animFrames:addObject(frame0)
    062. animFrames:addObject(frame1)
    063. --由容器类实例对象创建一个动画帧对象,设定每0.4秒更新一帧
    064. local animation = CCAnimation:createWithSpriteFrames(animFrames,0.4)  --第二个参数是播放的速率,值越小播放越快
    065. --创建一个动画
    066. local animate = CCAnimate:create(animation)
    067. --设置精灵循环播放这个动作
    068. spriteDog:runAction(CCRepeatForever:create(animate))
    069.  
    070. --设置精灵颜色
    071. --spriteDog:setColor(ccc3(0,255,0))
    072.  
    073. --自定义一个定时器
    074. local function tick()
    075. if spriteDog.isPaused then return end
    076. local x,y = spriteDog:getPosition() --获取坐标
    077. if x<origin.x+60  then
    078. x = origin.x+visibleSize.width-60
    079. else
    080. x = x - 1
    081. end
    082.  
    083. spriteDog:setPositionX(x)
    084. end
    085. --启动定时器
    086. CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(tick,0,false)
    087.  
    088. return spriteDog
    089. end
    090.  
    091.  
    092.  
    093. ---------------------------------创建一个可移动的背景层-----------------------------------------
    094. local function createMoveLayer()
    095. local layerFarm = CCLayer:create()
    096.  
    097. --添加背景
    098. local bg = CCSprite:create("farm.jpg")
    099. bg:setPosition(origin.x+visibleSize.width/2+80,origin.y+visibleSize.height/2 -20)
    100. layerFarm:addChild(bg)
    101.  
    102. --添加地面田地
    103. for i = 0,3 do
    104. for j = 0,1 do
    105. local spriteLand = CCSprite:create("land.png")
    106. spriteLand:setPosition(200+j*180 - i%2 *90 ,10 + i*95/2)
    107. layerFarm:addChild(spriteLand)
    108. end
    109. end
    110.  
    111. --添加植物(一个4*1的图片)
    112. local frameCrop = CCSpriteFrame:create("crop.png",CCRectMake(0,0,105,95))
    113. for i = 0,3 do
    114. for j = 0,1 do
    115. local spriteCrop = CCSprite:createWithSpriteFrame(frameCrop)
    116. spriteCrop:setPosition(10+200+j*180 - i%2*90,30+10+i*95/2)
    117. layerFarm:addChild(spriteCrop)
    118. end
    119. end
    120.  
    121. --------------------触摸事件-------------------------------------------
    122. local touchBeginPoint = nil
    123. --开始触摸
    124. local function onTouchBegan(x,y)
    125. cclog("onTouchBegin:%0.2f,%0.2f",x,y)
    126. touchBeginPoint = {x = x,y = y}
    127. return true
    128. end
    129. --触摸移动
    130. local function onTouchMoved(x,y)
    131. cclog("onTouchMoved:%0.2f,%0.2f",x,y)
    132. if touchBeginPoint then
    133. local cx,cy = layerFarm:getPosition()
    134. layerFarm:setPosition(cx+x-touchBeginPoint.x,cy+y-touchBeginPoint.y)
    135. touchBeginPoint = {x = x,y = y}
    136. end
    137. end
    138. --结束触摸
    139. local function onTouchEnded(x,y)
    140. cclog("onTouchEnded:%0.2f,%0.2f",x,y)
    141. touchBeginPoint = nil
    142. end
    143. --判断触摸动作
    144. local function onTouch(eventType,x,y)
    145. if eventType == "began" then
    146. return onTouchBegan(x,y)
    147. elseif eventType == "moved" then
    148. return onTouchMoved(x,y)
    149. else
    150. return onTouchEnded(x,y)
    151. end
    152. end
    153.  
    154. --调用layerFarm的registerScriptTouchHnadler函数注册按下的事件相应函数
    155. layerFarm:registerScriptTouchHandler(onTouch)
    156. --使layerFarm能够相应屏幕按下的事件
    157. layerFarm:setTouchEnabled(true)
    158. return layerFarm
    159.  
    160. end
    161.  
    162. --------------------------创建菜单-----------------------------------------------------
    163. local function createLayerMenu()
    164.  
    165. local layerMenu = CCLayer:create()
    166.  
    167. local menuPopup,menuTools,effectID   --菜单栏、左下角的工具栏按钮、音效ID
    168.  
    169. --关闭菜单栏
    170. local function menuCallBackClosePopup()
    171.  
    172. AudioEngine.stopEffect(effectID)  --根据ID号来关闭这个声音
    173. menuPopup:setVisible(false)
    174.  
    175. end
    176.  
    177. --开启菜单栏
    178. local function menuCallBackOpenPopup()
    179.  
    180. local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename("effect1.wav")
    181. effectID = AudioEngine.playEffect(effectPath) --播放一个声音然后赋值给某个ID
    182. menuPopup:setVisible(true)
    183.  
    184. end
    185.  
    186. --添加一个选择菜单
    187. local menuPopupItem = CCMenuItemImage:create("menu2.png","menu2.png") -- 菜单选项
    188. menuPopupItem:setPosition(0,0)--选项卡的位置
    189. menuPopupItem:registerScriptTapHandler(menuCallBackClosePopup) --点击事件
    190. menuPopup = CCMenu:createWithItem(menuPopupItem) --根据菜单选项创建菜单
    191. menuPopup:setPosition(origin.x+visibleSize.width/2,origin.y+visibleSize.height/2) --设置菜单的位置
    192. menuPopup:setVisible(false) --设置面板的不显示
    193. layerMenu:addChild(menuPopup) --将菜单添加到菜单层中
    194.  
    195. --添加左下角的工具图标
    196. local menuToolsItem = CCMenuItemImage:create("menu1.png","menu1.png")
    197. menuToolsItem:setPosition(0,0)
    198. menuToolsItem:registerScriptTapHandler(menuCallBackOpenPopup)
    199. menuTools = CCMenu:createWithItem(menuToolsItem)
    200. local itemWidth = menuToolsItem:getContentSize().width --获取图片的宽
    201. local itemHeight = menuToolsItem:getContentSize().height --获取图片的高
    202. menuTools:setPosition(origin.x + itemWidth/2,origin.y + itemHeight/2)  --设置位置
    203. layerMenu:addChild(menuTools)
    204.  
    205. return layerMenu
    206.  
    207. end
    208.  
    209.  
    210. ---------------------------添加背景音乐-----------------------------------------------
    211. --循环播放背景音乐
    212. --SimpleAudioEngine:sharedEngine():playBackgroundMusic("background.mp3",true)
    213. --或者
    214. local bgMusicPath = CCFileUtils:sharedFileUtils():fullPathForFilename("background.mp3")
    215. AudioEngine.playMusic(bgMusicPath,true)
    216.  
    217.  
    218. -- 取得声音引擎的实例对象并调用其preloadEffect函数将声音文件“effect1.wav”预加载进内存。这里并不播放,预加载是为了在播放时不造成卡顿感。 
    219. --SimpleAudioEngine:sharedEngine():preloadEffect("effect1.wav"); 
    220. --或者
    221. local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename("effect1.wav")
    222. AudioEngine.preloadEffect(effectPath)
    223.  
    224.  
    225. --添加动画狗
    226. layer:addChild(createDog(),4) --第二个参数是Z(深度),值越大越在前面
    227.  
    228. --添加可移动的背景层到主场景中
    229. scene:addChild(createMoveLayer())
    230. --添加menu菜单
    231. scene:addChild(createLayerMenu())
    232. --添加自己绘制的图标和文字层
    233. scene:addChild(layer)
    234. --运行场景
    235. CCDirector:sharedDirector():runWithScene(scene)
    236. end
    237.  
    238.  
    239. --脚本的入口函数,前面一个参数是调用执行的函数,后面一个是错误处理的函数
    240. xpcall(main, __G__TRACKBACK__)

    注意:如果要显示中文,解决方案将lua文件保存为utf8格式

    \

    \

     

    关于内存问题可以参考:http://blog.csdn.net/honghaier/article/details/7906629

     


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值