在《三勇者传说》(暂定名)的开发过程中,我遇到了一些小问题,这里记录下来,以便之后查阅以及他人分享建议。
首先是最常见的场景渐变,cocos2dx自身有一定数量的场景渐变效果,原本无需做太多说明,不过既然算是一种小伎俩,这里也备注一下。
然后是半透明遮罩,这在游戏需要进行暂停时,以及弹出信息窗口时非常常用。
- CCScene* pLoginScene = CLoginScene::scene();
- if( pLoginScene )
- {
- float fTime = 1.5f;
- CCTransitionScene * pTransScene = CCTransitionFade ::create( fTime , pLoginScene );
- CCDirector::sharedDirector()->replaceScene( pTransScene );
- }
ShadeLayer.h
- #pragma once
- //--------------------------------------------------------------------
- #include "CommonHead.h"
- //--------------------------------------------------------------------
- class CShadeLayer : public CCLayer
- {
- public:
- static CShadeLayer* create( CCLayer* p_pUILayer );
- bool init( CCLayer* p_pUILayer );
- private:
- void MenuCallback(CCObject* pSender){}
- };
ShadeLayer.cpp
- #include "ShadeLayer.h"
- //--------------------------------------------------------------------
- CShadeLayer* CShadeLayer::create( CCLayer* p_pUILayer )
- {
- CShadeLayer* pLayer = new CShadeLayer;
- if( pLayer && pLayer->init( p_pUILayer ) )
- {
- pLayer->autorelease();
- return pLayer;
- }
- else
- {
- delete pLayer;
- pLayer = NULL;
- return NULL;
- }
- }
- //--------------------------------------------------------------------
- bool CShadeLayer::init( CCLayer* p_pUILayer )
- {
- bool bRet = false;
- do
- {
- CC_BREAK_IF(!CCLayer::init());
- CCAssert( p_pUILayer, "p_pUILayer == NULL!");
- CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
- CCLayerColor* layerColor = CCLayerColor::create();
- layerColor->setColor(ccc3(0, 0, 0));
- layerColor->setOpacity(150);
- layerColor->setContentSize(CCSizeMake(visibleSize.width, visibleSize.height));
- this->addChild(layerColor);
- CCMenuItemImage* item = CCMenuItemImage::create();
- item->setContentSize(CCSizeMake(visibleSize.width, visibleSize.height));
- item->initWithTarget(this, menu_selector(CShadeLayer::MenuCallback));
- CCMenu* menu = CCMenu::create(item, NULL);
- menu->setTouchPriority( SHADER_LAYER_TOUCH_PRIORITY );
- this->addChild(menu);
- this->setTag( SHADE_LAYER_TAG );
- bRet = true;
- } while (0);
- return bRet;
- }
- //--------------------------------------------------------------------
我们上面的代码是使用一个巨大的CCMenu去截获消息,虽然方法不传统,但是的确高效。如果使用传统的建议方式,Layer设置接收消息并重载消息回调四个函数,这个方法也行的通,但是代价较高,性能上也无优化,并不划算。注意的是,里面的宏 SHADER_LAYER_TOUCH_PRIORITY 必须小于UI默认的消息级别 -128,建议为-129.那么我们假如在这个遮罩层上放置新的UI或者Layer一定注意将新的UI消息级别高于这个 SHADER_LAYER_TOUCH_PRIORITY,即建议为-130以下。
它的调用方式如下:
- // 在某个Scene中添加遮罩层
- this->addChild( CShadeLayer::create(this), 100 );
最后,记录一下UI显示时的震动效果。我们通常显示一个UI,并不希望它突然就出现在屏幕上,而是经过一个极短的动画过程再显示。我这里介绍一种震动效果。代码如下:
- CCAction* shakeAction = CCSequence::create(CCScaleTo::create(0.0, 0.0),
- CCScaleTo::create(0.12, 1.08),
- CCScaleTo::create(0.10, 0.92),
- CCScaleTo::create(0.10, 1.04),
- CCScaleTo::create(0.10, 0.96),
- CCScaleTo::create(0.10, 1.0), NULL);
- // 增加UI层
- CUIPanelLayer* pLayer = CUIPanelLayer::create();
- if( pLayer )
- {
- pLayer ->runAction( shakeAction );
- this->addChild( pLayer );
- }
这样就模拟形成了一个震动显示的UI效果。
今天就记录到这里,欢迎讨论~
没有评论:
发表评论