cocos2d-x API学习---CCNode
2014-03-07 16:25
302 查看
在熟悉了Lua的语法后就是需要学习了解cocos2d-x中的各种常用API,之后才能理解项目代码并进行一些功能的实现。
CCNode 对象是所有显示对象的基础类。
主要功能:
提供所有类型显示对象公用的属性,例如位置、尺寸、角度、显示层级等
作为其他显示对象的容器
可以执行各种动作
在大多数情况下,使用 ZOrder 更简单,也更容易理解。显示对象构成的树状结构天然就是层次关系,而 ZOrder 用于调整同级显示对象的前后遮挡关系。
默认 ZOrder 为 0,ZOrder 越大,显示层级越高。虽然理论上 ZOrder 可以设置为任意整数,但实践中我们发现 ZOrder 的值最好在 -30000 到 +30000 之间,超过此范围的值有时候可能出问题。
addChild() 支持用第二个参数指定子对象的 ZOrder,因此上面的代码可以写成:
要删除子对象也有多种途径:
在开启帧事件后,会在显示对象每一次渲染时调用指定的函数。
quick 中包含了几十种不同的动作,可以动态改变对象的属性,例如移动、旋转、淡入淡出等。
-- 利用transition.sequence()依次执行多个动作
我们可以查询显示对象上当前有多少个动作在执行:
动作在执行时间结束后,会自动停止。但我们也可以在需要的时候停止正在执行的动作:
前面提到 scheduleUpdate 方法可以注册帧事件,如果我们需要按照指定间隔时间执行函数,就需要用到 schedule() 方法:
CCNode 对象是所有显示对象的基础类。
主要功能:
提供所有类型显示对象公用的属性,例如位置、尺寸、角度、显示层级等
作为其他显示对象的容器
可以执行各种动作
坐标和锚点
每一个显示对象的位置信息由坐标和锚点两部分组成。-- 设置坐标。 node:setPosition(x, y) node:setPosition(CCPoint(x, y)) node:setPositionX(x) -- 单独改变 x node:setPositionY(y) -- 单独改变 y -- 读取坐标 local x, y = node:getPosition() local x = node:getPositionX() -- 仅读取 x local y = node:getPositionY() -- 仅读取 y local point = node:getPositioInCCPoint() -- 返回一个 CCPoint 对象
-- 设置锚点 node:setAnchorPoint(CCPoint(0, 0)) -- 读取锚点 local anchorPoint = node:getAnchorPoint() print(anchorPoint.x, anchorPoint.y) -- 读取锚点对应的坐标 local anchorPointInPoints = node:getAnchorPointInPoints() print(anchorPointInPoints.x, anchorPointInPoints.y)默认情况下,一个显示对象的锚点(Flash 中称为参考点)在其中央位置。
显示层级
当多个显示对象属于同一个父对象时,它们之间的显示层级决定了画面上的互相遮盖关系。在 quick 中,设置显示层次有两种途径:ZOrder 和 OpenGL Z 轴。在大多数情况下,使用 ZOrder 更简单,也更容易理解。显示对象构成的树状结构天然就是层次关系,而 ZOrder 用于调整同级显示对象的前后遮挡关系。
local hero = display.newSprite("Hero.png") -- 创建一个人物角色图像 hero:setZOrder(1000) -- 设置人物角色的 ZOrder 为 1000 local tree = display.newSprite("Tree.png") -- 创建树的图像 -- 将两者添加到场景中 scene:addChild(hero) scene:addChild(tree)
默认 ZOrder 为 0,ZOrder 越大,显示层级越高。虽然理论上 ZOrder 可以设置为任意整数,但实践中我们发现 ZOrder 的值最好在 -30000 到 +30000 之间,超过此范围的值有时候可能出问题。
addChild() 支持用第二个参数指定子对象的 ZOrder,因此上面的代码可以写成:
scene:addChild(hero, 1000)
变形
quick 可以指定一个显示对象的变形属性,例如缩放、倾斜等。改变一个对象的变形属性后,这个对象中所有的子对象都会受到影响。node1:setScale(2.0) -- 放大为 2 倍显示 node2:setScaleX(1.5) -- 水平方向拉伸为 1.5 倍 node3:setScaleY(3.0) -- 垂直方向拉伸为 3.0 倍 如果 scaleX 和 scaleY 使用了不同的值,那么调用对象的 getScale() 方法会报告错误(因为 getScale() 不知道该返回 scaleX 还是 scaleY 的值)。
node1:setSkewX(10) -- 水平倾斜 10 度 node2:setSkewY(20) -- 垂直倾斜 20 度 print(node1:getSkewX()) print(node2:getSkewY())
node1:setRotation(90) -- 设置旋转角度 print(node1:getRotation())
是否可见
不可见的对象不会渲染,也不会接受触摸事件,除此之外与可见对象没有任何区别,帧事件、延迟调用、动作等都会正常工作。node:setVisible(false) -- 设置对象不可见 print(node:isVisible())
添加和管理子对象
子对象可以用多种途径访问:print(node) -- 输出 node 值 -- 查询指定 tag 的子对象,如果有多个返回第一个,否则返回 nil local childNode = node:getChildByTag(tag) -- 返回子对象的总数(不含子对象的子对象) print(node:getChildrenCount()) -- 获得一个包含所有子对象的 CCArray 对象,然后遍历其中所有子对象 local array = node:getChildren() for i = 0, array:count() - 1 do -- local childNode = tolua.cast(array:objectAtIndex(i), "CCNode") print(childNode:getParent()) -- 输出子对象的父对象,应该与 node 的值相同 end
要删除子对象也有多种途径:
childNode:removeSelf() -- 从父对象中删除自己 node:removeChild(childNode) -- 删除一个子对象 -- 删除指定 tag 的子对象,如果有多个 tag 相同的子对象,删除第一个 childNode:setTag(1) -- 设置子对象的 tag 为 1 node:removeChildByTag(1) -- 删除所有子对象 node:removeAllChildren()事件
CCNode 提供了两类事件:显示对象事件和帧事件。 local node = display.newNode() node.onEnter = function() -- 显示对象加入父对象时调用 end node.onExit = function() -- 显示对象从父对象删除时调用 -- 利用 onExit 事件,可以做一些清理工作 end node:setNodeEventEnabled(true) -- 允许显示对象的事件
node:setNodeEventEnabled(false)--禁止显示对象的事件
在开启帧事件后,会在显示对象每一次渲染时调用指定的函数。
local node = display.newNode() local function onEnterFrame(dt) -- dt 是这一帧和上一帧之间的时间间隔,通常为 1/60 秒 end node:scheduleUpdate(onEnterFrame)--开启帧事件
node:unscheduleUpdate()--取消帧事件
执行动作
动作是 quick 里最强大的功能之一。quick 中包含了几十种不同的动作,可以动态改变对象的属性,例如移动、旋转、淡入淡出等。
-- 0.3 秒移动到 100, 200 node:runAction(CCMoveTo:create(0.3, CCPoint(100, 200)))
-- 移动的同时旋转 node:runAction(CCMoveTo:create(0.3, CCPoint(100, 200))) node:runAction(CCRotateBy:create(0.3, 360))
-- 利用transition.sequence()依次执行多个动作
local sequence = transition.sequence({ CCMoveTo:create(0.5, CCPoint(display.cx, display.cy)), CCFadeOut:create(0.2), CCDelayTime:create(0.5), CCFadeIn:create(0.3), }) node:runAction(sequence)
我们可以查询显示对象上当前有多少个动作在执行:
print(node:getNumberOfRunningActions())
动作在执行时间结束后,会自动停止。但我们也可以在需要的时候停止正在执行的动作:
local action = CCMoveTo:create(0.3, CCPoint(100, 200)) node:runAction(action) -- 在需要停止的时候 action:stop() -- 或者写为 node:stopAction(action) -- 通过 tag 停止指定的动作 local action = CCMoveTo:create(0.3, CCPoint(100, 200)) action:setTag(1) node:runAction(action) -- 在需要停止的时候 node:stopActionByTag(1) -- 或者写为 local action = node:getActionByTag(1) action:stop() -- 停止所有正在执行的动作 node:stopAllActions()
前面提到 scheduleUpdate 方法可以注册帧事件,如果我们需要按照指定间隔时间执行函数,就需要用到 schedule() 方法:
local function onSchedule() -- 函数操作 end node:schedule(onSchedule, 0.5) -- 每隔 0.5 秒执行一次函数
颜色和透明度
改变显示对象的颜色值和透明度时,可以设置是否传递到子对象。local childNode = display.newSprite("Hello.png") node:addChild(childNode) node:setCascadeOpacityEnabled(true) -- 改变透明度时,影响所有的子对象 node:setOpacity(128) -- 透明度可用值为 0 - 255, 128 相当于 50% 透明度 print(node:getOpacity()) -- 返回显示对象的透明度 print(childNode:getOpacity()) -- 输出 255,因为我们没有直接改变 childNode 的透明度 print(childNode:getDisplayedOpacity()) -- 输出 128,这个透明度是自身透明度和父对象透明度的综合 print(node:isCascadeOpacityEnabled()) -- 检查是否允许传递透明度设置
local childNode = display.newSprite("Hello.png") node:addChild(childNode) node:setCascadeColorEnabled(true) -- 改变颜色值时,影响所有的子对象 node:setColor(ccc3(64, 64, 64)) -- 设置一个灰色,这会让图像看上去变得更黯淡 local color = node:getColor() -- 返回显示对象的颜色值 print(color.r, color.g, color.b) local displayedColor = childNode:getDisplayedColor() -- 返回实际的显示颜色 print(displayedColor.r, displayedColor.g, displayedColor.b) print(node:isCascadeColorEnabled()) -- 检查是否允许传递颜色值设置
相关文章推荐
- (转)cocos2d-X学习之主要类介绍:节点CCNode
- 【Cocos2d-X开发学习笔记】第02期:渲染框架之节点类(CCNode)的使用
- cocos2d-x学习笔记-CCNode
- 【Cocos2d-X开发学习笔记】第02期:渲染框架之节点类(CCNode)的使用 [
- cocos2d游戏学习一:CCNode
- cocos2d-X学习之主要类介绍:节点CCNode
- (转载)cocos2d-X学习之主要类介绍:节点CCNode
- cocos2d-x学习笔记-CCNode
- Cocos2D-x学习:核心类----CCNode
- cocos2d-x学习笔记-CCNode
- 【Cocos2d-X开发学习笔记】第02期:渲染框架之节点类(CCNode)的使用
- cocos2d-X学习之主要类介绍:节点CCNode
- cocos2d-X学习之主要类介绍:节点CCNode
- cocos2d-X学习之主要类介绍:节点CCNode
- cocos2d-x 基础系列 (03) 设计主界面以及Sprite类的学习
- 【学习1】Cocos2d-x 3.x中使用物理引擎创建边界
- 【学习4】Cocos2d-x 常用控件之Sprite
- 跟着BOY 学习COCOS2D-X 网络篇---强联网(采用技术 BSD SOCKET+多线程技术 +protobuf)(环境搭建篇+服务器)
- 腾讯大牛 cocos2d学习
- cocos2d学习(一)helloWorld