Cocos2d-x开发系列 从一个图片灰态需求开始我的博客之旅
2015-08-24 22:02
507 查看
题外话:工作几年来,屡屡在网上可以找到解决方案和技术分享。从事Cocos2d-x开发几年来,从网上找到学习到很多的知识,也屡屡在犯愁的时候得到解决方案,非常感谢Cocos2d-x引擎,及提供的开发者社区。现在是时候来整理整理我的开发积累了。一直来都没啥头绪,也不知道写些什么。干脆就从开发中碰到的问题开始入手。从我设计现在的项目开始我的博客之旅。然后我会从一个Cocos2d-x项目的思路写下去,就从我现在的项目构思,架构,优化写下去,到最后希望能整理一个开源的框架来鞭策自己进步。(之前QQ第三方登录,发了这篇文章,早上起来看到居然有好些人阅读,看了看排版内容,真是对不起观众,所以现在开始好好整理,全部移植到这个账号里来)
首先我第一个想到的是设置Color,发现其结果类似于添加一个灰色的遮罩。没办法只能是用Shander了。曾经我在一个卡牌游戏中使用过通过Shandr来达到灰态处理(Cocos2d-x3.2 Lua)。直接移植到现在项目(Cocos2d-x 3.5 C++) 效果还不错,但是哥们反应这个Shander函数在Debug的时候会挂掉,调查了下果然会出现。当我查找灰态的Shander文件的时候,偶然想了下3.5会不会有相应的处理方法。突然发现Scale9Sprite有这个处理方式,发现跟我实现的差不多,我的Shander文件现在引擎里面有了,所以稍加修改,一测试就OK了。所以说最好的文档资料是引擎本身。
实用于任务系统、签到奖励等功能中。亦可以用于按钮灰态中。
class WWShanderFactory
{
public:
WWShanderFactory();
virtual ~WWShanderFactory();
static void convSpriteGray(Sprite* node);
static void convSpriteNormal(Sprite* node);
static void convImageViewGray(ImageView* node);
static void convImageViewNormal(ImageView* node);
};
提供的4个函数中,前两个为Sprite的灰色和常态处理。后面两个为ImageView的相关处理。在看下具体实现。
代码中的具体细节可以自行研究下。这里就不多讲了。接下来看看具体使用。
效果图如下:
左边为灰态。右边为常态。
Cocos2d-x图片灰态的适用处理办法
一、构思分析
Cocos2d-x项目一直以来都对图片的要求很高,提起优化每个人都会从讲到纹理图片优化开始。所以从项目经理、美术、策划一票人都应该会重视这个问题。RPG游戏,卡牌游戏就更加会注重这些了,所以能省则省,在不影响美观的情况下,尽量做到图片资源最优。今天美术同学就跟我提出了一个需求,希望一些按钮的灰态处理,程序能自己处理。首先我第一个想到的是设置Color,发现其结果类似于添加一个灰色的遮罩。没办法只能是用Shander了。曾经我在一个卡牌游戏中使用过通过Shandr来达到灰态处理(Cocos2d-x3.2 Lua)。直接移植到现在项目(Cocos2d-x 3.5 C++) 效果还不错,但是哥们反应这个Shander函数在Debug的时候会挂掉,调查了下果然会出现。当我查找灰态的Shander文件的时候,偶然想了下3.5会不会有相应的处理方法。突然发现Scale9Sprite有这个处理方式,发现跟我实现的差不多,我的Shander文件现在引擎里面有了,所以稍加修改,一测试就OK了。所以说最好的文档资料是引擎本身。
实用于任务系统、签到奖励等功能中。亦可以用于按钮灰态中。
二、代码实现
这里实现一个WWShanderFactory类。首先看头文件class WWShanderFactory
{
public:
WWShanderFactory();
virtual ~WWShanderFactory();
static void convSpriteGray(Sprite* node);
static void convSpriteNormal(Sprite* node);
static void convImageViewGray(ImageView* node);
static void convImageViewNormal(ImageView* node);
};
提供的4个函数中,前两个为Sprite的灰色和常态处理。后面两个为ImageView的相关处理。在看下具体实现。
void WWShanderFactory::convSpriteGray(Sprite* node) { GLProgramState *glState = nullptr; auto program = GLProgram::createWithByteArrays(ccPositionTextureColor_noMVP_vert, ccUIGrayScale_frag); glState = GLProgramState::getOrCreateWithGLProgram(program); node->setGLProgramState(glState); } void WWShanderFactory::convSpriteNormal(Sprite* node) { GLProgramState *glState = GLProgramState::getOrCreateWithGLProgramName("ShaderPositionTextureColor_noMVP"); glState->setUniformTexture("u_texture", node->getTexture()->getName()); glState->getGLProgram()->updateUniforms(); node->setGLProgramState(glState); } void WWShanderFactory::convImageViewGray(ImageView* iv) { ((ui::Scale9Sprite*)(iv->getVirtualRenderer()))->setState(ui::Scale9Sprite::State::GRAY); } void WWShanderFactory::convImageViewNormal(ImageView* iv) { ((ui::Scale9Sprite*)(iv->getVirtualRenderer()))->setState(ui::Scale9Sprite::State::NORMAL); }
代码中的具体细节可以自行研究下。这里就不多讲了。接下来看看具体使用。
auto sp_demo = Sprite::create("res/Images/Common/comm_box.png"); sp_demo->setPosition(Vec2(640, 500)); addChild(sp_demo); WWShanderFactory::convSpriteGray(sp_demo); WWShanderFactory::convSpriteNormal(sp_demo);
效果图如下:
左边为灰态。右边为常态。
相关文章推荐
- 用css3实现图片变灰
- android如何将图片变成灰色?
- Cocos 图片变灰 倒计时进度条
- Cocos2d-x 通讯的数据压缩与解压
- Cocos2d-x 图片资源加密,Lua文件加密
- Cocos2d-x 3.0及以上版本资源及脚本解密
- 【cocos2d-x 3.7 飞机大战】 决战南海I (十) 游戏主场景
- 【cocos2d-x 3.7 飞机大战】 决战南海I (九) 飘字特效
- 【cocos2d-x 3.7 飞机大战】 决战南海I (八) 背景移动
- 【cocos2d-x 3.7 飞机大战】 决战南海I (七) 控制器的实现
- 【cocos2d-x 3.7 飞机大战】 决战南海I (六) 保存玩家数据
- Cocos2d-JS 使用cocostudio创建游戏并用摇杆控制游戏实例
- Cocos2d-JS 环境搭建
- Cocos2d-x 实现Loading界面加载资源进度条显示百分比(回调函数)
- 使用Visual Studio 2015调试Android平台Cocos2d-x游戏的C++代码
- Cocos2d-x 创建精灵的五种方法
- 在COCOS2D-X3.0里面如何使用拖拽精灵
- cocos2dx[3.2](11)——新回调函数std::bind
- cocos2d-x 计算两点之间的夹角
- quick-cocos2d-x 3.3打包apk,编译时候报错:系统找不到指定路径