cocos2d-x API学习---CCNode

在熟悉了Lua的语法后就是需要学习了解cocos2d-x中的各种常用API,之后才能理解项目代码并进行一些功能的实现。


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()) -- 检查是否允许传递颜色值设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值