现在主流的移动游戏开发方法是cocos2d-x + Lua脚本语言做快速开发。经历了几个小游戏的开发过程,体味到了cocos2d-x 和 Lua的强大之处。
但是有些东西掌握地不牢,用的时候不免会捉襟见肘。网上提供的资料也是零零散散的,有时候看起来然人一头雾水。
所以决定将对Lua-tests进行解读,记录下来,形成一套完整的Lua + cocos2d-x教程。一来温故知新,二来与大家交流,共同进步。
接下来的博文中,如有错误的地方,还需要大家不吝指正!
本博文对应的引擎版本和工具:
- cocos2d-x-3.2 (不要3.0与3.2混用,谁用谁懂的。。。)
- Cocos Code IDE Build:V1.0.0.RC0
- Visual Studio 2012 - 用来创建自定义runtime
- 环境配置如图,windows环境变量的设置从略
顺便提一句,在网上很少能找到专门介绍 cocos2d-x + Lua的文章,本系列博客将只介绍Lua版本。C++先放一边,还有,现在的Cocos Code IDE已经能够将你的项目刷到真机上测试了!!
以下步骤可以在Cocos Code IDE中运行Lua-test,并Package to APK 装到真机上测试:
- 进入Cocos Code IDE,在项目管理其空白处右击,选择Cocos Lua Project创建新项目。
- 输入一个你想要的非 nil名字,点击下一步,勾选Add Native Codes,点击Finish,IDE会用内置的项目模板给你生成原始项目
- 此时打开你的workspace,找到你的项目,会有这几个文件夹:.settings , frameworks,res,runtime,src。
- 接下来:删除src,res文件夹下的所有文件
- 找到你的cocos2d-x-3.2,一次进入test→lua-tests。里面有project,res,src三个文件夹,30个.lua文件,一个.cocos-project.json文件
- 现在,将30个.lua文件复制到你项目的 根文件夹下,然后将res,src中的文件都复制到你项目对应的文件夹中
- 进到你项目src文件夹,里面有48个Test文件夹和这几个.lua文件:controller.lua ,helper.lua ,mainMenu.lua ,testResource.lua ,VisibelRect.lua。将controlle.lua重命名为main.lua
- 回到Cocos Code IDE,刷新项目,就能在项目目录中看到上面提到的所有文件了。然后,选中项目,右键 → Run As → Cocos Luabinding运行
到这一步,已经在PC上面完成。
下面上图,刷到真机上:
最后一步,连接你的设备到电脑,点击Refresh,找到你设备之后,Refresh会变成Install,点击即可
还可以点击Open Package Location好到你的apk文件。
刷到你的手机里面,随时感受Cocos2d-x的魅力吧。
下面是本文“主题” - 加速器
在Cocos Code IDE一次找到src → AccelerometerTest - 打开AccelerometerTest.lua 就会见到下面的代码
(看懂代码的前提:掌握Lua语法 + 了解Cocos2d-x基本框架)
--[[ 每一个test文件是一个Scene,该Scene中包含多个小test,每个test是一个层,主框架是一个Layer,包含主界面菜单,封装了所有Scene都用得到的基本功能 ]]-- local function AccelerometerMainLayer() local function title() return "AccelerometerTest" end local layer = cc.Layer:create() local function onEnter() --首先设置layer的可加速属性为true,对layer启用加速器 layer:setAccelerometerEnabled(true)
--[[
这个是设置测试的标题:ttf字体标签,
显示内容:title()方法返回的字符串,
字体文件:fonts/arial.ttf
字体大小:32
添加到层中,设置锚点和坐标
]]-- local label = cc.Label:createWithTTF(title(), "fonts/arial.ttf", 32) layer:addChild(label, 1) label:setAnchorPoint(cc.p(0.5, 0.5)) label:setPosition( cc.p(VisibleRect:center().x, VisibleRect:top().y - 50) ) --生成小球 - Sprite local ball = cc.Sprite:create("Images/ball.png") --设置初始位置 ball:setPosition(cc.p(VisibleRect:center().x, VisibleRect:center().y)) layer:addChild(ball) local function accelerometerListener(event,x,y,z,timestamp) --[[ 加速事件发生时,会传出多个参数:event,x,y,z,timestamp event:被绑定的物件发出的加速器事件,可以用getCurrentTarget()获取事件的发送者 x,y,z:加速器传递的的坐标 ]]-- --获取ball local target = event:getCurrentTarget() --获取尺寸 local ballSize = target:getContentSize() --获取小球初始坐标,存入ptNowX,ptNowY中,并配合加速器传来的坐标x,y进行一系列计算 local ptNowX,ptNowY = target:getPosition() ptNowX = ptNowX + x * 9.81 ptNowY = ptNowY + y * 9.81 --设置小球活动的时候x坐标的范围 local minX = math.floor(VisibleRect:left().x + ballSize.width / 2.0) local maxX = math.floor(VisibleRect:right().x - ballSize.width / 2.0) --进行简单的碰撞判定 if ptNowX < minX then ptNowX = minX elseif ptNowX > maxX then ptNowX = maxX end --设置小球活动的时候y坐标的范围 local minY = math.floor(VisibleRect:bottom().y + ballSize.height / 2.0) local maxY = math.floor(VisibleRect:top().y - ballSize.height / 2.0) if ptNowY < minY then ptNowY = minY elseif ptNowY > maxY then ptNowY = maxY end --将计算后的ptNowX,ptNowY设置给小球 因为ptNowX,ptNowY与加速器坐标x,y相关,是动态的,所以小球会随加速器动起来 target:setPosition(cc.p(ptNowX , ptNowY)) end --onEnter()方法入口,注册加速事件侦听器,accelerometerListener()方法定义了事件发生时触发的相关操作(逻辑,动作。。) local listerner = cc.EventListenerAcceleration:create(accelerometerListener) --与ball的事件调度器绑定 --不了解cocos2d-x事件调度机制的人,留言交流 layer:getEventDispatcher():addEventListenerWithSceneGraphPriority(listerner,ball) end local function onExit() layer:setAccelerometerEnabled(false) end --载入节点的时候,引擎自动调用onEnter(),开始布局和启用加速器 --退出的时候,调用onExit(),关闭加速器(仅对本层 关闭 local function onNodeEvent(event) if "enter" == event then onEnter() elseif "exit" == event then onExit() end end --首先给layer注册节点事件,这里是读代码的入口 layer:registerScriptHandler(onNodeEvent) return layer end function AccelerometerMain() cclog("AccelerometerMain") local scene = cc.Scene:create() scene:addChild(AccelerometerMainLayer()) scene:addChild(CreateBackMenuItem()) return scene end
注:测试工程的架构不值得大家学习,所以就不做介绍了。
程序猿提高的方法一是保持学习,二是跟保持学习的人交流。
看到太多太多的程序员上网发帖,开口就跪求。。。大量的时间浪费在质量不高的学习资料中,真让人心酸呀。。。
好的程序员是高智慧人群,学习是有方法的。大家共勉
ps:原创,转载请著名出处。