从 quick-cocos2d-x 2.2.3 移植到 cocos2d-x 3.4

1. 引擎级别

  • ccp = cc.p
  • cc.t2point = cc.p
  • ccc3 = cc.c3b
  • cc.c3 = cc.c3b
  • CCRect = cc.rect
  • CCSize = cc.size

绝大部分 CC 开头的类,要改成 cc. 开头。

例如:

  • CCMove 改成 cc.Move
  • CCNode 改成 cc.Node

等等

Action 中的部分修改:

-- 不仅支持两个 Action 了。
CCSpawn:createWithTwoActions = cc.Spawn:create

Node 中关于定时器的操作:

Node:pauseSchedulerAndActions()
Node:resumeSchedulerAndActions()
-- 改为
Node:pause()
Node:resume()

Node:scheduleUpdate
-- 改为
-- 计划一个全局帧事件回调,并返回该定时器的句柄。
scheduler.scheduleUpdateGlobal(listener)

-- 或者也可以指定调用间隔,同样会返回句柄。
scheduler.scheduleGlobal(listener, interval)

-- 取消一个定时器句柄
scheduler.unscheduleGlobal(handle)

2. 自定义

2.1 打印 TextureCache 中的缓存内容

打印代码原来可能要写三行

print('-------------------------------')
CCTextureCache:sharedTextureCache:dumpCachedTextureInfo()
print('-------------------------------')

替换为:

lll.RM.printCachedTextureInfo('----------------\n%s\n------------------')

2.2 几个以前使用的全局类

  • FontUtil = lll.FNT (请将碰到的 FontUtil 改成 lll.FNT)
  • CCFileUtils = lll.FU (禁止直接使用 cc.FileUtils,请查看 quick/zr/FileUtil.lua 了解具体用法)
  • CCTextureManager = lll.RM (禁止直接使用 TextureManager,请查看 quick/zr/ResourceManager.lua 查看具体用法)
  • lll.CSU 截图功能封装,请查看代码中的相关截图范例
  • StringUtil = lll.SU
  • RegExp = lll.RE
  • SharedObject = lll.SO
  • HTTPFunc = lll.HF
  • lll.File = lll.SO

关于 lll.File.set ,以前的用法:

lll.File.set(__file, "local data = {}\nreturn data")

现在的用法:

lll.SO.saveEmptyTable(__file)

对于一个要保存的数据表,可以直接存储成 lua 文件

lll.SO.saveTable({a=1,b=2,c=3})
-- 保存的内容为:
local data = {
    ['a'] = 1,
    ['b'] = 2,
    ['c'] = 3,
}
return data

2.3 创建 Sprite

所有单张的图片,必须使用 lll.RC.newSprite 来创建。Scale9Sprite 和 TilesSprite也需要这样使用。

具体用法查看 quick/zr/ResourceCache.lua

  • display.newTilesSprite = lll.RC.newTilesSprite(场景名称, .....)
  • display.newSprite(单张图片) = lll.RC.newSprite(场景名称, 单张图片)
  • display.newScale9Sprite(单张图片) = lll.RC.newScale9Sprite(场景名称,单张图片)

2.4 绘制几何形状

矩形绘制

display.newRect = display.newDrawNode():drawSolidRect()

改用:

display.newDrawNode():drawSolidRect()  绘制矩形填充
display.newDrawNode():drawRect() 绘制矩形边框

详见 quick/cocos2dx/DrawNodeEx.lua

如果非要既有填充又有边框,那么使用 display.newRect

有几个函数可以快速生成绘图函数的参数,包括:

display.newRectArgs 可以快速生成 drawSolidRect 和 drawRect 需要的参数。
display.newCircleArgs 可以快速生成 drawSolidCircle 的参数

详见 root/gf/display.lua

2.5 计时器

Node:scheduleUpdate

现在 sheduler 是个单例类(其实以前也是,只是封装到了 Node 中,这样不合理) 启动一个 schedule,这样就可以了。会把 dt 传到 handler_enterFrame 中

scheduler.scheduleUpdateGlobal(handler(self, self.handler_enterFrame))

详见 src/quick/scheduler.lua

cc.net.SocketTCP.getTime() = os.gettime()
math.randomseed(os.gettime()) = math.newrandomseed()

2.6 table

  • table.removeItem = table.removebyvalue
  • table.insertTo = table.insertto
  • table.insertOf = table.insertof
  • table.find = table.keyof
  • table.insertUnique = table.insertunique

2.7 类型转换

  • toint = checkint
  • checknumber
  • checkbool
  • checktable

2.8 DragonBones

Warning

禁止使用 lll.Armature.newlll.ArmatureBase.new 来创建对象。所有的 Armature 请必须使用下面的方法来创建。

2.8.1 创建一个 ArmatureBase

创建一个 ArmatureBase,参数顺序和 ArmatureBase.new 一致(除了第一个参数),但加入了 asyncHandler。

若提供了 asyncHandler,则使用异步加载,返回 false。反之则进行同步加载,直接返回新建的 ArmatureBase 对象。

第一个参数fname 只需要提供相对于 res/arm 的文件夹名称即可。

lll.DBM.newArmatureBase(fname, movementHandler, options, asyncHandler)
local arm = lll.DBM.newArmatureBase('gailun', nil, nil, nil)
-- OR
lll.DBM.newArmatureBase('claw/claw1', nil, nil, function(arm)
    self._arm = arm
end)

2.8.2 创建一个 Armature

创建一个 Armature,参数顺序和原来一致,但加入了 asyncHandler。

lll.DBM.newArmature(csvId, fsmobj, movementHandler, options, asyncHandler)

2.8.3 预载

若要增强性能,则需要使用下面的方法在进入场景的时候预载,预载成功会调用 callback ,没有参数:

lll.DBM.preloadHeros(mySide, csvIds, callback)

2.8.4 getAnimationData

假设要获取的 Animation 名称为 attack

那么:

local arm = lll.DBM.newArmature(......)

local loop = arm:getAnimationPlayTimes("attack")
local duration = arm:getAnimationDuration("attack")
local scale = arm:getAnimationScale("attack")

-- 检测 armature 是否有 attack 这个动作
local exists = arm:hasAnimationName("attack")

Warning

不要频繁调用 getAnimation*** 方法,为了性能考虑,请缓存其值。

2.8.5 动作事件

原来的事件:

Hero:_onMovement(__evtType, __moveId)

现在的事件:

-- arm 骨骼动画本身
-- mtype 事件类型 zr.dragonbones.EventType
-- mid 事件的名称 attack、die 等等
-- isCurState 代表这个动作是否就是当前状态播放的动作。
Hero:_onMovement(arm, mtype, mid, isCurState)

2.9 misc.

这两个全局方法 resumeSchedulerAndActions pauseSchedulerAndActions (孙铭鸿所写)

改为:

Node:callChildrenFunc('resume')
Node:callChildrenFunc('pause')

3. 可用场景名称

  • root 这个场景中的内容应该总是处于缓存中,不销毁
  • game
  • main
  • login