cocos2dx lua 如何接入sdk
本文将仅介绍 Lua 版本的接入方法,C++ 版本暂不涉及。目前,Cocos Code IDE 已支持将项目刷到真机上进行测试。
一、所需引擎版本和工具
- Cocos2d-x 3.2:请确保不要将 3.0 与 3.2 版本混用,可点击此处下载。
- Cocos Code IDE Build:V1.0.0.RC0:点击此处下载。
- Visual Studio 2012:用于创建自定义 runtime。
关于 Windows 环境变量的设置,本文从略,环境配置可参考相关图示。
二、在 Cocos Code IDE 中运行 Lua - test 并打包到 APK 进行真机测试步骤
1. 创建新项目
进入 Cocos Code IDE,在项目管理器的空白处右键单击,选择“Cocos Lua Project”来创建新项目。输入一个非 nil 的项目名称,点击“下一步”,勾选“Add Native Codes”,然后点击“Finish”,IDE 会使用内置的项目模板生成原始项目。
2. 查看项目文件夹
此时打开 workspace,找到创建的项目,会看到以下几个文件夹:.settings
、frameworks
、res
、runtime
、src
。
3. 清理项目文件
删除 src
和 res
文件夹下的所有文件。
4. 复制测试文件
找到 Cocos2d - x 3.2 目录,依次进入 test→lua - tests
,该目录下有 project
、res
、src
三个文件夹,30 个 .lua
文件以及一个 .cocos - project.json
文件。将这 30 个 .lua
文件复制到项目的根文件夹下,再将 res
和 src
文件夹中的文件分别复制到项目对应的 res
和 src
文件夹中。
5. 重命名文件
进入项目的 src
文件夹,其中有 48 个 Test
文件夹以及 controller.lua
、helper.lua
、mainMenu.lua
、testResource.lua
、VisibelRect.lua
这几个 .lua
文件。将 controller.lua
重命名为 main.lua
。
6. 运行项目
回到 Cocos Code IDE,刷新项目,此时项目目录中应能看到上述提到的所有文件。选中项目,右键选择“Run As → Cocos Luabinding”运行,至此已在 PC 上完成项目的初步运行。
7. 刷到真机测试
- 连接设备到电脑,点击“Refresh”,找到设备后,“Refresh” 按钮会变为 “Install”,点击即可将项目安装到真机上。
- 还可以点击 “Open Package Location” 找到生成的 APK 文件。
三、加速器相关代码解析
在 Cocos Code IDE 中依次找到 src → AccelerometerTest
,打开 AccelerometerTest.lua
文件,以下是对该文件代码的详细解析:
--[[
每一个 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:加速器传递的坐标
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 listener = cc.EventListenerAcceleration:create(accelerometerListener)
-- 与 ball 的事件调度器绑定
layer:getEventDispatcher():addEventListenerWithSceneGraphPriority(listener, 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
以上代码实现了一个简单的加速器测试功能,通过监听加速器事件,控制小球在屏幕内随设备的倾斜而移动。在 onEnter
方法中启用加速器并注册事件监听器,在 onExit
方法中关闭加速器,确保资源的合理使用。