Cocos2dx+lua中Color参数的坑

cocos2x的lua中有如下几种颜色定义

--Color3B
function cc.c3b( _r,_g,_b )
return { r = _r, g = _g, b = _b }
end

--Color4B
function cc.c4b( _r,_g,_b,_a )
return { r = _r, g = _g, b = _b, a = _a }
end

--Color4F
function cc.c4f( _r,_g,_b,_a )
return { r = _r, g = _g, b = _b, a = _a }
end

今天使用Cocos2dx的Label碰到一个问题,我感觉挺容易被忽略的

virtual void enableShadow(const Color4B& shadowColor = Color4B::BLACK,const Size &offset = Size(2,-2), int blurRadius = 0);

使用Label的enableShadow函数定义的颜色要求是Color4B,如果不小心使用了Color3B就根本没有效果

我看了下从lua表转化到C++中Color4B的代码,结果是为空时就赋值为0,所以使用Color3B传进来,alpha值为nil,它直接赋值为0了

全透明了当然也就看不到了。。。

bool luaval_to_color4b(lua_State* L,int lo,Color4B* outValue)
{
    if (NULL == L || NULL == outValue)
        return false;

    bool ok = true;

    tolua_Error tolua_err;
    if (!tolua_istable(L, lo, 0, &tolua_err) )
    {
#if COCOS2D_DEBUG >=1
        luaval_to_native_err(L,"#ferror:",&tolua_err);
#endif
        ok = false;
    }

    if(ok)
    {
        lua_pushstring(L, "r");
        lua_gettable(L,lo);
        outValue->r = lua_isnil(L,-1) ? 0 : lua_tonumber(L,-1);
        lua_pop(L,1);

        lua_pushstring(L, "g");
        lua_gettable(L,lo);
        outValue->g = lua_isnil(L,-1) ? 0 : lua_tonumber(L,-1);
        lua_pop(L,1);

        lua_pushstring(L, "b");
        lua_gettable(L,lo);
        outValue->b = lua_isnil(L,-1) ? 0 : lua_tonumber(L,-1);
        lua_pop(L,1);

        lua_pushstring(L, "a");
        lua_gettable(L,lo);
        outValue->a = lua_isnil(L,-1) ? 0 : lua_tonumber(L,-1);
        lua_pop(L,1);
    }

    return ok;
}

还有如果需要传入Color4F的地方如果传入了Color3B或者Color4B也会不正常

因为Color4F要求rgba范围都是0~1

void drawDot(const Vec2 &pos, float radius, const Color4F &color);

lua本来就是弱类型的这样很容易出错,而且还不会有警告!!!

只能自己多加注意了,使用颜色一定要注意看清使用的哪种颜色结构

时间: 2024-11-10 14:11:40

Cocos2dx+lua中Color参数的坑的相关文章

Cocos2d-x Lua中使用标签

游戏场景中的文字包括了静态文字和动态文字.静态文字如下图所示游戏场景中①号文字“COCOS2DX”,动态文字如图4-1所示游戏场景中的②号文字“Hello World”.静态文字一般是由美工使用Photoshop绘制在背景图片上,这种方式的优点是表现力很丰富,例如:①号文字“COCOS2DX”中的“COCOS”.“2D”和“X”设计的风格不同,而动态文字则不能,而且静态文字无法通过程序访问,无法动态修改内容.动态文字一般是需要通过程序访问,需要动态修改内容.Cocos2d-x Lua可以通过标签

Cocos2d-x Lua中实例:特效演示

Cocos2d-x Lua中实例:特效演示 下面我们通过一个实例介绍几个特效的使用,这个实例如下图所示,上图是一个操作菜单场景,选择菜单可以进入到下图动作场景,在下图动作场景中点击Go按钮可以执行我们选择的特性动作,点击Back按钮可以返回到菜单场景. 特效实例 我们重点看看MyActionScene场景,MyActionScene.lua主要代码如下: [html] view plaincopy … … local sprite                                 

Cocos2d-x Lua中Sprite精灵类

Cocos2d-x Lua中Sprite精灵类 精灵类是Sprite,它的类图如下图所示. Sprite类图 Sprite类直接继承了Node类,具有Node基本特征.此外,我们还可以看到Sprite类的子类有:PhysicsSprite和Skin.PhysicsSprite是物理引擎精灵类,Skin是皮肤精灵类用于骨骼动画.创建Sprite精灵对象创建精灵对象有多种方式,其中常用的函数如下:cc.Sprite:create ().创建一个精灵对象,纹理[ 纹理(texture),表示物体表面细

Cocos2d-x Lua中帧动画

Cocos2d-x Lua中帧动画 帧动画就是按一定时间间隔.一定的顺序.一帧一帧地显示帧图片.我们的美工要为精灵的运动绘制每一帧图片,因此帧动画会由很多帧组成,按照一定的顺序切换这些图片就可以了. 在Cocos2d-x Lua中播放帧动画涉及到两个类:Animation和Animate,类图如图所示,Animation是动画类,它保存有很多动画帧,Animate类是动作类它继承于ActionInterval类,属于间隔动作类,它的作用是将Animation定义的动画转换成为动作进行执行,这样我

Cocos2d-x Lua中网格动作

Cocos2d-x Lua中网格动作 GridAction它有两个主要的子类Grid3DAction和TiledGrid3DAction,TiledGrid3DAction系列的子类中会有瓦片效果,如下图所示是Waves3D特效(Grid3DAction子类),如后图所示是WavesTiles3D特效(TiledGrid3DAction子类),比较这两个效果我们会看到瓦片效果的特别之处是界面被分割成多个方格. Waves3D特效 WavesTiles3D特效 网格动作都是采用3D效果给用户的体验

cocos2d-x lua 中使用protobuf并对http进行处理

本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链接 http://blog.csdn.net/vpingchangxin/article/details/24458051 protobuf  Google的一个非常好用的数据传输的封装 说实话Google的东西确实比較好用 所以我们前后端数据交换就用他了 只是Google没有对lua进行支持 还好社区有开源的大侠们贡献 找了全部关于lua protobuf 我仅仅找到

cocos2d-x lua中实现异步加载纹理

原文地址:  http://www.cnblogs.com/linchaolong/p/4033118.html 前言   问题:最近项目中需要做一个loading个界面,界面中间有一个角色人物走动的动画,在显示这个loading界面的时候加载资源,项目是用cocos2d-x lua实现的,界面做出来后发现在加载资源的时候界面会卡住. 原因: 因为使用的不是异步加载,而且cocos2d-x没有绑定异步加载资源的api到lua中,其实在lua中实现不了异步. 想通过在lua中启动一个线程去加载资源

cocos2dx lua中异步加载网络图片,可用于显示微信头像

最近在做一个棋牌项目,脚本语言用的lua,登录需要使用微信登录,用户头像用微信账户的头像,微信接口返回的头像是一个url,那么遇到的一个问题就是如何在lua中异步加载这个头像,先在引擎源码里找了下可能会提供这个功能的地方,发现好像没有提供类似功能,那么只能自己动手写.所以我在ImageView这个类里面添加了一个成员方法,其实可以不写在ImageView里,而且我觉得非必需情况下还是不要修改引擎源码的好,因为如果源码改动比较多的话,将来引擎版本升级会比较麻烦.我写在ImageView里纯粹是想偷

Cocos2d-x Lua中生命周期函数

场景(Scene)以及所有节点(Node)的生命周期事件如下:enter.进入场景时候触发.enterTransitionFinish.进入场景而且过渡动画结束时候触发.exit.退出场景时候触发 .exitTransitionDidStart.退出场景而且开始过渡动画时候触发.cleanup.场景对象被清除时候触发.提示  GameScene场景中的(Scene)继承于节点(Node),这些生命周期事件根本上是从Node继承而来.事实上所有Node对象(包括:场景.层.精灵等)都有这些事件,具