SpriteWithHue,通过修改色调实现资源复用

转载:http://www.cocoachina.com/bbs/read.php?tid-302467.html

工程下载地址:http://download.csdn.net/my

==================================================================================

另外使用过程中发现2个问题 :

1. 我的版本是cocos2dx3.3,,,,所以在SpriteWithHue.cpp 中的updateColorMatrix()方法报错,

改成这样:

void SpriteWithHue::updateColorMatrix()
{
    //GLfloat mat[3][3];
    //hueMatrix(mat, _hue);
    //premultiplyAlpha(mat, getAlpha());

    //auto callback = [this, &mat](cocos2d::GLProgram *p, cocos2d::Uniform *u)
    //{
    //  glUniformMatrix3fv(u->location, 1, GL_FALSE, (GLfloat*)&mat);
    //};
    //getGLProgramState()->setUniformCallback("u_hue", callback);

	getGLProgramState()->setUniformCallback("u_hue",
		[this](cocos2d::GLProgram *p, cocos2d::Uniform *u)
	{
		GLfloat mat[3][3];
		hueMatrix(mat, _hue);
		premultiplyAlpha(mat, getAlpha());
		glUniformMatrix3fv(u->location, 1, GL_FALSE, (GLfloat*)&mat);
	});
}

问题1,ok!!


2.通过这个类创建精灵后添加到界面上,然后调用移除精灵的方法,内存是不会下降的,反而添加一次增加一次,只增加不减少

添加精灵代码:
Size visibleSize = Director::getInstance()->getVisibleSize();
    if (!m_node) {
        m_node = Node::create();
        this->addChild(m_node);
        m_node->setContentSize(Size(Vec2(visibleSize.width, visibleSize.height)));
    }
    for (int i = 0; i < 30; i++) {
        auto spriteWithHue = SpriteWithHue::create("ball_red.png");
        spriteWithHue->setPosition(Vec2(rand_0_1() * visibleSize.width, rand_0_1() * visibleSize.height));
        spriteWithHue->setHue(M_PI * 2 * rand_0_1());
        m_node->addChild(spriteWithHue);
    }


移除精灵方法:
if (m_node) {
        m_node->removeFromParent();
        m_node = nullptr;
    } 

问题2解决办法:

主要是2个问题导致内存没降下来。

a.GLProgramStateCache每次都会缓存program state,这部分,直接调用

void GLProgramStateCache::removeUnusedGLProgramState()即可。

b.GLProgram创建后,即使析构了内存也降不下来。这部分不太清楚,先建了个issue给引擎。

https://github.com/cocos2d/cocos2d-x/issues/12138

这块得等引擎fix。


==================================================================================



SpriteWithHue

这个类主要实现的功能是对cocos2d::Sprite色调的修改,从而达到一套纹理可以重复利用的目的,特别对于一些只需在颜色上换装的游戏来说,真是大大的福利。


这是我从CCSpriteWithHue Github扒过来,从Cocos2d-iphone移植到Cocos2d-x,并进行了适当的修改(感谢原作者Alex314)。


实现的效果如图:

QQ截图20150529104556.jpg

支持Sprite以及Animtion。使用的引擎版本是Cocos2d-x v3.5 Final。


测试例如图:

41_300874_04dd3779f85f8d0.jpg

41_300874_82afd19d36564ee500.gif

使用方式很简单,和cocos2d::Sprite一样,只是多了一个setHue(float hue)接口用于设置色调,范围处于0~2π。

示例代码:

1
2
3
4
auto alien = SpriteWithHue::create( "alien.png" );
alien->setPosition(Vec2(100, 100));
alien->setHue(M_PI);
this ->addChild(alien);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值