cocos 学习记录

LUA学习

待学习

警示

  • 场景帧刷新内,就不要用runAction来做坐标变化,变化中坐标获取会不准确,待研究

  • 使用:timer+runAction 做角色移动,在速度控制时会有异常,原因应该同上,待研究。

  • sprite使用了scale之后,如果使用getContentSize获取宽高,得到的应该是sprite的原始宽高,而不是scale之后的。

    可以直接使用boundBox来获取size,这个获取到的是当前的size。

  • android 调用lua lua里要做延时调用(可0秒),防止UI等各种异常

  • lua 中 userdata 类型的数据不add到node上 过了定义范围就会被清除,空的class类型还是table

  • 慎用 全局层级 全局布局上容易产生各种影响

  • 接口请求 异常时 增加功能 从接口逻辑上

数学

 local a = math.modf(1.3333)--a =1 取整
 local vectorX = math.cos(math.rad(angle))
 local vectorY = math.sin(math.rad(angle))
 local t=math.random(360) --math.random(1,360)
函数名   描述      示例          结果
pi        圆周率      math.pi    3.1415926535898
abs   取绝对值    math.abs(-2012)     2012
ceil  向上取整    math.ceil(9.1)  10
floor     向下取整    math.floor(9.9)     9
max   取参数最大值  math.max(2,4,6,8)   8
min   取参数最小值  math.min(2,4,6,8)   2
pow   计算x的y次幂     math.pow(2,16)  65536
sqrt  开平方     math.sqrt(65536)    256
mod   取模  math.mod(65535,2)   1
modf  取整数和小数部分    math.modf(20.12)    20   0.12
randomseed    设随机数种子  math.randomseed(os.time())   
random    取随机数    math.random(5,90)   5~90
rad   角度转弧度   math.rad(180)   3.1415926535898
deg   弧度转角度   math.deg(math.pi)   180
exp   e的x次方   math.exp(4)     54.598150033144
log   计算x的自然对数    math.log(54.598150033144)   4
log10     计算10为底,x的对数     math.log10(1000)    3
frexp     将参数拆成x * (2 ^ y)的形式     math.frexp(160)     0.625    8
ldexp     计算x * (2 ^ y)   math.ldexp(0.625,8)     160
sin   正弦  math.sin(math.rad(30))  0.5
cos   余弦  math.cos(math.rad(60))  0.5
tan   正切  math.tan(math.rad(45))  1
asin  反正弦     math.deg(math.asin(0.5))    30
acos  反余弦     math.deg(math.acos(0.5))    60
atan  反正切     math.deg(math.atan(1))  45

button

function tt.button(a, b, c)
a:"icon.png"(资源图片) or "#icon.png" (纹理图片)
b:"GRAY" 按钮置灰 or 空 正常
--封装后添加点击事件,本质还是在touchend时执行
function Button:listen(obj, method)
    if method then
        return self:addEndListener(handler(obj, method))
    else
        return self:addEndListener(obj)
    end
end
--button 添加点击监听  
 button_close:addTouchEventListener(callback)
--按钮设置大小
 btn:setContentSize(cc.size(100, 100))
 btn:ignoreContentAdaptWithSize(false)

listen

function Button:listen(obj, method)
    if method then
 -- handler(obj, method)将lua对象及方法包装为一个匿名函数 obj.method(obj)等效于obj:method()
 --C++ 无法识别 Lua对象方法,handler() 进行一下包装
        return self:addEndListener(handler(obj, method))
    else
        return self:addEndListener(obj)
    end
end
两个参数时
obj:lua对象
method:对象方法
一个参数时
obj:要执行的方法
按钮点击时,调用 obj:method

ccui.list

  self.listView = ccui.ListView:create()
      self.listView:setContentSize(1000, 380)
      self.listView:setPosition(270, 5)
      self.listView:setDirection(1)
      self.listView:setItemsMargin(0)
      self.listView:setBounceEnabled(true)
      self.listView:setInertiaScrollEnabled(true)   
      self.listView:pushBackCustomItem("这里添加需要加入的子节点")

node的常用属性

--是否可见
v:setVisible(false)
v:setOpacity(200)--(0,255) --透明度

进度条

--条形进度条
local left = cc.ProgressTimer:create(tt.new("loading/01.png")):ppos(self, 5)
left:setType(cc.PROGRESS_TIMER_TYPE_BAR)
left:setMidpoint(cc.p(0, 0))--起点
left:setBarChangeRate(cc.p(1, 0))--变化方向
--圆形进度条
local left = cc.ProgressTimer:create(tt.new("ani_hall_room.png")):ppos(self.voiceBg, 5)
left:setType(cc.PROGRESS_TIMER_TYPE_RADIAL)
left:setMidpoint(cc.p(0.5, 0.5))--
left:setReverseDirection(true)--顺时针 flase 逆时针
left:runAction(cc.ProgressFromTo:create(10,100,0))

文本Label

--BMFont格式 1,2等效
1 local label =  cc.Label:createWithBMFont ("huangshe.fnt","test",1,200)
2 ccui.TextBMFont:create('00000', "res/fonts/baishe.fnt")
label:setString("555")
--系统字性能最低
3 cc.Label:createWithTTF(title, TTF_NAME, size)

4 cc.Label:createWithTTF(scoreText, 'rS.ttf', 42, cc.size(180, 45), 2):setColor(cc.c3b(168, 88, 32)):ppos(node, 5, -650 -50+ k * x, 2)
--常用,项目内封装过 
--正常体 tt.label(text, size, color, dimensions)
tt.label("文", 28, cc.c3b(1, 1, 1), cc.size(100, 40))
--粗圆
LabelTTF.new(text, 30, cc.c3b(241, 227, 219))
--对齐方式
label:setAlignment(2)--1,2,

--使用位图资源创建文本,一下两个等效 w
  ccui.TextBMFont:create("hello","fonts/join.fnt"):ppos(self.bg, 2, 100 , 120)
  cc.LabelBMFont:create("hello","fonts/zuan.fnt",40):ppos(self.bg, 2, 100 , 130)
--字体,文本,TextAlignment,maxwidth
  cc.Label:createWithBMFont("fonts/join.fnt","hello",2,100):ppos(self.bg, 2, 100, 120)

导演

--导演对象
cc.Director:getInstance():getScheduler():setTimeScale(0.5)
--纹理图,图片资源管理器
:getTextureCache()
--时间控制器:0.5倍速度播放,全局
:getScheduler():setTimeScale(0.5)

场景

version: cocos2d-x 3.6

onEnter和onExit在lua中不会因节点别add和remove而直接被调用,当子节点被父节点add和remove时,会发送enter和exit的消息,所以需要再初始化节点的时候,监听消息,并在收到消息后调用onEnter或onExit。

    local function onNodeEvent(event)
        if event == "enter" then
            self:onEnter()
        elseif event == "exit" then
            self:onExit()
        end
    end
    self:registerScriptHandler(onNodeEvent)

在创建该节点时,加入上面的代码,那么onEnter和onExit就会在节点被add和remove是调用了。

层Layer

LayerColor :颜色布景层
LayerGradient :渐变色布景层
LayerMultiplex :多层布景层

ColorLayer

颜色布景层CCLayerColor有两个父类:CCLayerRGBACCBlendProtocol。相信有前面知识的积累,学到这也知道这两个类大致是干嘛的了。一个是颜色类,另一个是颜色混合协议。

​ 所以CCLayerColor主要是在CCLayer类的基础上,扩展了三个属性:

​ (1)修改图层背景颜色,RGB颜色。

​ (2)修改图层透明度。

​ (3)颜色混合模式。

​ 此外,CCLayerColor也继承于CCNode类。所以也可以进行放缩、旋转、执行动作等操作。

  • 值得注意的是:CCLayerColor也是CCLayer类,所以它也忽略锚点设置,锚点始终为(0,0)

CCLayerColor总共有三种创建方式,若不规定背景颜色、透明度,及尺寸大小,那么默认创建的与CCLayer效果类似。即:无背景色、不透明、尺寸大小为窗口大小。

static CCLayerColor* create();//无背景色、不透明、尺寸大小为窗口大小。
static CCLayerColor* create(const ccColor4B& color, float width, float height);
static CCLayerColor* create(const ccColor4B& color);
//更改图层尺寸大小
void changeWidth(float w);
void changeHeight(float h);
void changeWidthAndHeight(float w ,float h);
//设置背景颜色、透明度
virtual void setColor(const ccColor3B &color);
virtual void setOpacity(GLubyte opacity);
//设置混合模式
void setBlendFunc(ccBlendFunc);
ccBlendFunc getBlendFunc();

动作

self.role:runAction(cc.RotateTo:create(0.2, 0))
--顺序执行动作 runActionTable() 或者cc.Sequence:create() 
cc.Sequence:create({action1, cc.CallFunc:create(function() end)})
--同时执行动作
cc.Spawn:create({action1,action2})
--重复执行  
cc.Repeat:create(action,3)--重复N次
cc.RepeatForever:create()--一直重复
--回调
cc.CallFunc:create(function() end)
--延时
cc.DelayTime:create(0.5)
--移动
cc.MoveTo:create(0.1, cc.p(x,y))--移动到
cc.MoveBy:create(0.1, cc.p(x,y))--移动矢量x,y
--旋转
cc.RotateTo:create(0.1, x)--转到x°
--变色
  local action1 = cc.TintTo:create(2, 255, 0, 255)  
  local action2 = cc.TintBy:create(2, -127, -255, -127)  
  local action2Back = action2:reverse()  
  kathia:runAction(cc.Sequence:create(action2, action2Back))  

动画

--动画所在层 层级调整 
--self:zorder(Constant.LAYER_ZORDER_ANIMATION)
local c = 'res/ccs/csb/chat_animation/donghua.csb‘
local node = cc.CSLoader:createNode(c)
local action = cc.CSLoader:createTimeline(c)
action:clearFrameEventCallFunc()
--同时播放多个动画,可直接run多个action
--播放方式1
action:gotoFrameAndPlay(0, true)--第几帧开始方法,是否循环
--播放方式2
action:play('animation_1', true)--.csb内动画文件名,是否循环
node:ppos(self, 4, 0, 0)--动画其实地点
node:runAction(action)--开始执行动画
--播放方式3 播放动画组 与node:runAction互斥
node:runActionTable({    
     cc.MoveTo:create(time, cc.p(100,100),
     --cc标准动画完成后回调
     cc.CallFunc:create(function()
        Music:playSound("interact/" .. data.name .. ".mp3")
        action:stop()--停止之前的循环动画
        action:play('animation_2', false)
        --序列帧动画完成后回调
        action:setLastFrameCallFunc(function()
            node:remove()--移除动画node
        end)
     end),
 })
 -- 设置层级关系 Constant.lua全局属性
node:setGlobalZOrder(1111)--设置全局的层级,约大约上层
node:setLocalZOrder(11) --设置在父类里的层级
--重复执行  
cc.Repeat:create(action,3)--重复N次
cc.RepeatForever:create()--一直重复
--顺序执行一组act1,act2
cc.Sequence:create(act1,act2) 
  

骨骼动画

    local manager = ccs.ArmatureDataManager:getInstance()
    manager:addArmatureFileInfo("res/run/man10.png", "res/run/man10.plist", "res/run/man1.ExportJson")
--    manager:addArmatureFileInfoAsync("res/run/man10.png", "res/run/man10.plist", "res/run/man1.ExportJson", self.callback)
local armature = ccs.Armature:create("man1"):ppos(self, 5)
    armature:getAnimation():playWithIndex(1);
    armature:getAnimation():play("动画名",0,loop);
-- @param  durationTo The frames between two animation changing-over.
--  It's meaning is changing to this animation need how many frames
--  -1 : use the value from MovementData get from flash design panel
-- * @param  loop   Whether the animation is loop
--           loop < 0 : use the value from MovementData get from flash design panel
--           loop = 0 : this animation is not loop
--           loop > 0 : this animation is loop
--勉强实现播放骨骼动画的某一帧
    self.role.figure:getAnimation():setSpeedScale(0.0001);
    self.role.figure:getAnimation():play("attack", 0, 1);
    self.role.figure:getAnimation():gotoAndPlay(index);
--水平翻转
    armature->setScaleX(-1);
--播放速率
    self.role:getAnimation():setSpeedScale(0.01);

帧动画

local adAnimition = cc.Sprite:createWithSpriteFrameName("enemy bow (1).png")
adAnimition:setPosition(cc.p(x, y));
adAnimition:setAnchorPoint(cc.p(1, 0))
self:addChild(adAnimition, 100);
local animation = cc.Animation:create()
local number, name
for i = 1, 17 do
    name = "enemy bow (" .. i .. ").png"
    animation:addSpriteFrame(cc.SpriteFrameCache:getInstance():getSpriteFrame(name))
end
animation:setLoops(1) --设置 -1,表示无限循环
animation:setDelayPerUnit(0.07)
animation:setRestoreOriginalFrame(true)
local action = cc.Animate:create(animation)
adAnimition:runAction(cc.Sequence:create(action, cc.RemoveSelf:create(), NULL))

粒子效果

--1播放plist的粒子效果
local waveEffect = cc.ParticleSystemQuad:create("res/role/lizi_shuihua_jian.plist"):ppos(self, 5)
waveEffect:setAutoRemoveOnFinish(true)   --设置播放完毕之后自动释放内存  
--2系统的粒子效果
 local ps = cc.ParticleFire:create():ppos(self, 5)
 ps:setAutoRemoveOnFinish(true) --设置播放完毕之后自动释放内存
--设置纹理图,也可不设置
 ps:setTexture(cc.Director:getInstance():getTextureCache():addImage("res/role/dead.png"))
 ps:setDuration(0.02)

矩形相接检测

--系统的
cc.rectIntersectsRect(rect1,rect2)
--自己瞎写的
function Scene:rectIntersectsRect(rect1, rect2)
    if self:rectContainsPoint(rect1, cc.p(rect2.x, rect2.y)) then return true end
    if self:rectContainsPoint(rect1, cc.p(rect2.x+rect2.width, rect2.y)) then return true end
    if self:rectContainsPoint(rect1, cc.p(rect2.x, rect2.y+rect2.height)) then return true end
    if self:rectContainsPoint(rect1, cc.p(rect2.x+rect2.width, rect2.y+rect2.height)) then return true end
    if self:rectContainsPoint(rect2, cc.p(rect1.x, rect1.y)) then return true end
    return false
end

function Scene:rectContainsPoint(rect, point)
    if point.x >= rect.x and point.x <= (rect.x + rect.width) and point.y >= rect.y and point.y <= (rect.y + rect.height) then
        return true
    else
        return false
    end
end

事件

--添加事件监听 类似通知 
self:addEvent('刷新用户信息', handler(self, self.moPaiAction))
--调用
Event:dispatch('刷新用户信息',table)--key,参数表
Event:call('LOADING说明', '正在重启')

触摸事件

--cocos2dx-lua封装了 Layer:onTouch(callback, isMultiTouches, swallowTouches) 
self:onTouch(handler(self, self.eventTouch)) --使用
--参数解析
_layer:registerScriptTouchHandler(onTouchEvent,true,0,false);
@onTouchEvent 回调 
@ture表示捕获要捕获多点触摸 
@0优先级 
@false 是否吞没触摸事件 
如果是单点触摸 args[1] ->x,y,id 
如果是多点触摸 args[1] ->x1,y1,id1,x2,y2,id2
--完整方法
function Layer:onTouch(callback, isMultiTouches, swallowTouches)
    if type(isMultiTouches) ~= "boolean" then isMultiTouches = false end
    if type(swallowTouches) ~= "boolean" then swallowTouches = false end
    self:registerScriptTouchHandler(function(state, ...)
        local args = {...}
        local event = {name = state}
        if isMultiTouches then
            args = args[1]
            local points = {}
            for i = 1, #args, 3 do
                local x, y, id = args[i], args[i + 1], args[i + 2]
                points[id] = {x = x, y = y, id = id}
            end
            event.points = points
        else
            event.x = args[1]
            event.y = args[2]
        end
        return callback( event )
    end, isMultiTouches, 0, swallowTouches)
    self:setTouchEnabled(true)
    return self
end

音乐

Music:playSound("game/win.mp3")--..music/game/win.mp3

纹理图TextureCache

--路径src/之下完整路径 
game.loadPlist(name)--文件路径 
display.loadSpriteFrames('res/room.plist', 'res/romm.png')--加载纹理图配置   纹理图
--纹理图创建精灵
sprite = cc.Sprite:createWithSpriteFrameName("biaoqing_" .. biaoqingPos .. ".png")
--精灵换图
 local texture = cc.Director:getInstance():getTextureCache():addImage("a.png")
self.tttt:setTexture(texture)
--删除图片缓存
 cc.Director:getInstance():getTextureCache():removeTextureForKey(image)
--看图片资源信息
    std::string getCachedTextureInfo() const;
--通过


--旋转,缩小,还希望有较好的抗锯齿效果 
texture->generateMipmap();  
ccTexParams texParams = {GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE};  
texture->setTexParameters(&texParams);  

地图编辑器

--CCTMXTiledMap .tmx  
pMap = cc.TMXTiledMap:create("res/map1/map0.tmx"):ppos(self,5)
--CCTMXObjectGroup  tmx内部的层,基本是对象层
group = pMap:getObjectGroup("对象层 1"); 
array = pMap:getObjectGroups()
--c++:group = pMap->objectGroupNamed("层名");
--层内获取 item
local p = group:getObject("up item名")   
local plist = group:getObjects()
--c++:  array = group:getObjects
function Model:ctor()
    

end

webp压缩

指令格式 webp [options] -q quality input.png -o output.webp

具体指令 webp hall_a_dl.png -q 70 -o hall_a_dl.webp

富文本使用

 local x = {
        {
            ["type"] = 1,
            ["content"] = "索是指用细绳串起来的雀鸟,表示消灭了多少雀患,因此一索。",
            ["color"] = { 255, 1, 1 }, --R,G,B,alpha
            ["alpha"] = 255, --1透明,255不透明
            ["font"] = 25, --字号
        },
        {
            ["type"] = 2,
            ["image"] = "res/b9.png", --完整图片路径 "#js_tongyi.png"
        },
        {
            ["type"] = 3 --换行
        },
        {
            ["type"] = 4, --设定行距
            ["rowledge"] = 50
        },
    }

function View:getRichText(data)
    local richtext = ccui.RichText:create()
    richtext:ignoreContentAdaptWithSize(false)
    richtext:setContentSize(cc.size(600, 2100))

    for _, v in ipairs(data) do
        if v.type == 1 then
            local re1 = ccui.RichElementText:create(0, cc.c3b(v.color[1], v.color[2], v.color[3]),
                v.alpha, v.content, '', v.font);
            richtext:pushBackElement(re1)
        elseif v.type == 2 then
            local reimg = ccui.RichElementImage:create(0, cc.c3b(1, 1, 1), 255, v.image);
            richtext:pushBackElement(reimg)
        elseif v.type == 3 then
            richtext:pushBackElement(ccui.RichElementNewLine:create(0, cc.c3b(255, 1, 1), 255))
        elseif v.type == 4 then
            richtext:setVerticalSpace(v.rowledge)
        end
    end
    richtext:formatText()
    return richtext
end

前后台通知

-- game.lua-------------前后台切换
function game.initAppEvent()
    local a = cc.EventListenerCustom:create("APP_ENTER_FOREGROUND_EVENT", function()
        Event:call('切换到前台')
    end)
    cc.Director:getInstance():getEventDispatcher():addEventListenerWithFixedPriority(a, 1)

    local b = cc.EventListenerCustom:create("APP_ENTER_BACKGROUND_EVENT", function()
        Event:call('切换到后台')
    end)
    cc.Director:getInstance():getEventDispatcher():addEventListenerWithFixedPriority(b, 1)
end

与OC,Android互相调用

--OC 
luaoc.callStaticMethod('类名', "方法名", { callBack = Model.nativeWxLogin })
--Android 3.传参,4 (传参类型)返回类型 I:方法,V:void  Ljava/lang/String:字符串 ;隔开
luaj.callStaticMethod("包名.类名", "调用的方法名", { Model.payCallBack }, '(I)V')

贝塞尔曲线

--调用self:test(pointarray)
function View:test(posData)
    local drawNode = cc.DrawNode:create()
    self:addChild(drawNode)
    drawNode:setPosition(cc.p(5,100))
    --控制点

    local startPos = posData[1]       --起始点位置
    local distance = 20              --虚线的点之间的间隔
    local radius = 3                 --点的半径
    local color = cc.c4f(1,0,0,1)    --点的颜色
    local time = 0
    while time < 1 do
        local pos = self:getBezierPos(posData,time)
        local d = cc.pGetDistance(pos,startPos)
        if d >= distance then
            drawNode:drawDot(pos,radius,color)
            startPos = pos
        end
        time = time + 0.001
    end
    --查看配置相关控制点
--    for idx,pos in pairs(posData)do
--        drawNode:drawDot(pos,5,color)
--    end
end

function View:clone(object)
    local lookup_table = {}
    local function _copy(object)
        if type(object) ~= "table" then
            return object
        elseif lookup_table[object] then
            return lookup_table[object]
        end
        local new_table = {}
        lookup_table[object] = new_table
        for key, value in pairs(object) do
            new_table[_copy(key)] = _copy(value)
        end
        return setmetatable(new_table, getmetatable(object))
    end
    return _copy(object)
end

--求阶乘
function View:factorial(n)
    if n== 0 then
        return 1
    else
        return n * self:factorial(n-1)
    end
end
--获取贝塞尔曲线上面的点
function View:getBezierPos(posData,t)
--    local data = self:clone(posData)
    local data = posData
    local n = #data -1
    local x = 0
    local y = 0
    for idx,pos in pairs(data) do
        x = x + pos.x *(self:factorial(n)/(self:factorial(n-idx+1)*self:factorial(idx-1))) * math.pow(1-t,n-idx+1) * math.pow(t,idx-1)
        y = y + pos.y *(self:factorial(n)/(self:factorial(n-idx+1)*self:factorial(idx-1))) * math.pow(1-t,n-idx+1) * math.pow(t,idx-1)
    end
--    cclog("曲线"..x.."-"..y)
    return cc.p(x,y)
end



function View:listLayout(fwidth, num, width, anchor, edgeOffset)
    local post = {}
    local pre;
    local offset; 
    local chor
    if anchor ~= nil then
        chor = anchor -1
    else
        chor = 0
    end
    if edgeOffset ~= nil then
        pre = (fwidth - edgeOffset * 2 - width * num) / (num - 1)
        offset = edgeOffset
    else
        pre = (fwidth - width * num) / (num + 1)
        offset = pre
    end
    for i = 1, num, 1 do
        post[i] = offset + (i - 1) * pre + chor*pre/2
    end
    return post
end
function View:AddsonView(fview,sonViewlist,type){
  local anchor = (type-1)%3+1
  local plist =View:listLayout(fview:getWidtn(),#sonviewlist,sonViewlist[1].getWidtn(),)
    for i, position in pairs(plist) do
        sonViewlist[i]:ppos(self.bg,1,position,0)
    end  
}

更新流程:

  1. 修改config.lua

  2. 修改build.py

  3. 运行python build.py

  4. 将compile/src 和version.manifest传给小吴
    小吴:

  5. 将version.manifest放到oss : zzxx-chess/lanxi/debug/version.manifest

  6. zzxx-chess/lanxi/debug/创建版本文件夹 如:1.1,然后将src下的东西上传到1.1下

Lua自写公共方法

对象设置全局层级带子界面

--暂时仅一级子界面  为了解决牌花跟财神角标 不随牌设置层级改变
function View:setGlobalZOrderWithChildren(node,order)
    node:setGlobalZOrder(order)
    for _,v in pairs(node:getChildren())do
        if type(v) == 'userdata' then
            v:setGlobalZOrder(order)
        end
    end
end

Lua绑定C++

参考网址:lua绑定c++类方法总结Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

//手写的c++方法 供lua调用
static int tolua_cocos2d_utils_captureNode(lua_State* tolua_S)
{
#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
    if (!tolua_istable(tolua_S,1,0, &tolua_err) ||
        !tolua_isusertype(tolua_S, 2, "cc.Node", 0, &tolua_err)
        )
    goto tolua_lerror;
    else
#endif
    {
        cocos2d::Node* node = static_cast<Node*>(tolua_tousertype(tolua_S, 2, nullptr));
        Image*  ret = cocos2d::utils::captureNode(node, 1);
        object_to_luaval<Image>(tolua_S, "Image",(Image*)ret);
//        cocos2d::RenderTexture* ret =cocos2d::utils::captureNode(node, 1);
//        object_to_luaval<cocos2d::RenderTexture>(tolua_S, "cc.RenderTexture",(cocos2d::RenderTexture*)ret);
        return 1;
    }
#if COCOS2D_DEBUG >= 1
tolua_lerror:
    tolua_error(tolua_S,"#ferror in function 'tolua_cocos2d_utils_captureNode'.",&tolua_err);
    return 0;
#endif
}

其他工具

位图字体工具Bitmap Font Tools
BMFont (Windows)
FonteditorGlyph
DesignerHieroLabelAtlasCreator
粒子编辑工具Particle Editing Tools
ParticleCreator
Particle Designer
物理编辑工具Physics Editing Tools
Mekanimo
PhysicsBench
PhysicsEditor
VertexHelper
场景编辑工具Scene Editing Tools
CocosBuilder
Cocoshop
LevelHelper
纹理地图集工具Texture Atlas Tools
DarkFunction Editor
SpriteHelper
TexturePacker
Zwoptex

瓦片地图编辑工具Tilemap Editing Tools
iTileMaps
Tiled Map Editor
声音特效编辑工具Audio Effect Editing Tools
cfxr
背景音乐编辑工具Background Music Editing Tools
GarageBand (MAC 系统自带)
BOX2D多边形定义工具VertexHelper
VertexHelperGIF

动画帧导出工具Ulead GIF Animator
UleadGifAnimator

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容

  • 最近在写瘦金体的字帖,深有感触 瘦金体虽重风骨,但看似刚硬,实则最为多情。时纤时丰,每一笔都充满了多变,圆润时棱起...
    神奇阿霂阅读 293评论 0 0
  • 前言 孩子在活动中成长,春游秋游,运动会看演出,每一次活动孩子们都精神头十足,跑东跑西,一切都是那么的有趣。 大型...
    苏益民阅读 162评论 0 1
  • 春节一过,各种相亲也便少了很多,宝宝也从各种压力里面挣脱。那些曾相过的亲,见过的人仿佛随着春节的结束而远去了,唯有...
    天然之乐阅读 158评论 2 1