1. 程式人生 > >Cocos2d-x Sprite 執行 CCFade~ 這類透明度變化動作的一些有關問題

Cocos2d-x Sprite 執行 CCFade~ 這類透明度變化動作的一些有關問題

Cocos2d-x Sprite 執行 CCFade~ 這類透明度變化動作的一些問題

在引擎中提供了幾個有關透明度變化的動作:CCFadeIn,CCFadeOut,CCFadeTo

CCFadeIn:the opacity from 0 to 255

CCFadeOut:the opacity from 255 to 0

CCFadeTo: from the current value to a custom one

下面簡單記錄一下我所遇到的一些問題:

問題一:父Sprite執行fade動作,子Sprite不執行問題

看到下面的程式碼:

CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    CCSprite* bgSprite = CCSprite::create("HelloWorld.png");
    bgSprite->setPosition(ccp(winSize.width/2, winSize.height/2));
    this->addChild(bgSprite);
    
    CCSprite* sprite = CCSprite::create("Icon.png");
    sprite->setPosition(ccp(200, 200));
    bgSprite->addChild(sprite);
    
    CCFadeOut* fadeout = CCFadeOut::create(1);
    bgSprite->runAction(fadeout);
分析:這裡面的父sprite添加了一個子sprite,那麼當父sprite執行fade out的動作,子sprite也是要一樣執行fade out這個動作的,但是實際執行結果是,只有父sprite執行了這個動作,子sprite並沒有執行。
那麼這個問題如何解決呢? ---  一個最笨的方法就是 去getChildren() 然後每一個子sprite再去執行這個動作。

那麼,還有其他方法嗎?

--有的。我們可以用 setCascadeOpacityEnabled 這個方法。

在 CCRGBAProtocol 類定義了這個方法:

/** 
     *  whether or not opacity should be propagated to its children.
     */
    virtual bool isCascadeOpacityEnabled(void) = 0;
    virtual void setCascadeOpacityEnabled(bool cascadeOpacityEnabled) = 0;

     看到註釋就知道是神馬作用了,當設定為true的時候,父sprite執行opacity的變化,子sprite也同樣會執行到這個變化。

再具體看看:

void CCNodeRGBA::setCascadeOpacityEnabled(bool cascadeOpacityEnabled)
{
    _cascadeOpacityEnabled = cascadeOpacityEnabled;
}

virtual void updateDisplayedOpacity(GLubyte opacity) = 0;

void CCNodeRGBA::updateDisplayedOpacity(GLubyte parentOpacity)
{
	_displayedOpacity = _realOpacity * parentOpacity/255.0;
	
    if (_cascadeOpacityEnabled)
    {
        CCObject* pObj;
        CCARRAY_FOREACH(m_pChildren, pObj)
        {
            CCRGBAProtocol* item = dynamic_cast<CCRGBAProtocol*>(pObj);
            if (item)
            {
                item->updateDisplayedOpacity(_displayedOpacity);
            }
        }
    }
}

同樣的,在這個類中還有這個方法:

/**
     *  whether or not color should be propagated to its children.
     */
    virtual bool isCascadeColorEnabled(void) = 0;
    virtual void setCascadeColorEnabled(bool cascadeColorEnabled) = 0;
顯然就是為了在父sprite執行顏色變化的時候,子sprite也可以執行到這個變化。

回到上面的程式碼例子,新增: bgSprite->setCascadeOpacityEnabled(true);  這條語句就沒有問題了。

問題二:自定義的sprite執行 CCFade~ 的問題

我自定義了一個sprite類:在這個自定義的精靈內部又添加了兩個子sprite。

SelectedBoxSprite* SelectedBoxSprite::createWithPic(const char *name)
{
    SelectedBoxSprite* pobView = new SelectedBoxSprite();
    if (pobView && pobView->initWithFile(name) && pobView->setUpdateView()) {
        pobView->autorelease();
        return pobView;
    }
    CC_SAFE_DELETE(pobView);
    return NULL;
}

bool SelectedBoxSprite::setUpdateView()
{
    bool isRet = false;
    do {
        this->setCascadeOpacityEnabled(true);
        
        CCSprite* spr1 = CCSprite::create("yellow.png");
        spr1->setAnchorPoint(CCPointZero);
        spr1->setTag(1);
        spr1->setPosition(ccp(0, 4));
        this->addChild(spr1);
        
        listSpriteArray->addObject(spr1);

        CCSprite* spr2 = CCSprite::create("yellow_1.png");
        spr2->setAnchorPoint(CCPointZero);
        spr2->setTag(2);
        spr2->setPosition(ccp(0, 30));
        this->addChild(spr2);
        
        listSpriteArray->addObject(spr2);
        
        isRet = true;
    } while (0);
    return isRet;
}
我建立了這樣的一個例項,想要執行CCFadeIn這個動作
SelectedBoxSprite* selectBoxSprite = SelectedBoxSprite::createWithPic("list_box.png");
    selectBoxSprite->setAnchorPoint(ccp(0.5, 0.5));
    selectBoxSprite->setPosition(ccp(300, 305));
    selectBoxSprite->setTag(2);
    this->addChild(selectBoxSprite,1);
    
    CCFadeIn* fadein = CCFadeIn::create(1);
    selectBoxSprite->runAction(fadein);

但是,發現有問題,就是這個自定義sprite裡面的兩個子sprite不會執行這個fade in動作奮鬥

那麼這麼辦呢?

那我就想 CCFadeOut 也會不會有這個問題呢

    CCFadeOut* fadeout = CCFadeOut::create(1);
    selectBoxSprite->runAction(fadeout);
發現沒有問題,這個自定義的sprite會fade out;

同樣我又試了一下 CCFadeTo ,同樣也是沒有問題

    CCFadeTo* fadeto = CCFadeTo::create(1, 0);
    selectBoxSprite->runAction(fadeto);
這個時候,我冷靜下來看看程式碼,發現原來 在fade in之前沒有 將這個精靈的opacity設定為 0 
//這個很重要,不要忘了
    selectBoxSprite->setOpacity(0);
    
    CCFadeIn* fadein = CCFadeIn::create(1);
    selectBoxSprite->runAction(fadein);

這樣發現執行就正常了,裡面的兩個子sprite也會運行了。

相關推薦

Cocos2d-x Sprite 執行 CCFade~ 透明度變化動作一些有關問題

Cocos2d-x Sprite 執行 CCFade~ 這類透明度變化動作的一些問題 在引擎中提供了幾個有關透明度變化的動作:CCFadeIn,CCFadeOut,CCFadeTo CCFadeIn:the opacity from 0 to 255 CCFadeO

Cocos2d-x 專案新建自定義後編譯錯誤:打不開自定義標頭檔案錯誤解決方案

現在Cocos2dx新建工程需要執行Python指令碼來建立,不再提供Cocos2dx模板。一般我們使用VS2010編譯完Cocos2dx後,可以開始使用Cocos2dx目錄下\tools\project-creator\create_project.py來建立工程。 命

cocos2d-x 3.4 之 三消遊戲——萬聖大作戰(附加篇)

***************************************轉載請註明出處:http://blog.csdn.net/lttree******************************************** 三消遊戲——萬聖大作戰,應該是

Cocos2d-X執行緒(3) cocos2dx中的執行緒安全

在使用多執行緒時,總會遇到執行緒安全的問題。cocos2dx 3.0系列中新加入了一個專門處理執行緒安全的函式performFunctionInCocosThread(),他是Scheduler類的一個成員函式: void Scheduler::performFunction

13.cocos2d-x執行緒(二)執行緒鎖

xxx.h檔案: int count; void threadA(); void threadB(); xxx.cpp檔案: /* 引

Cocos2d-x 3 1 1 Lua示例 ActionEaseTest(動作

cc.p(60, s.height * 4 / 5))  -- 初始化層  Helper.initWithLayer(layer)  return layerend-------------------------------------  SpriteEase------------------------

對非執行緒安全List一些總結

一個專案的一個功能點,需要從介面接受返回資料,並對返回的資料進行一些業務處理,處理完成之後,新增到一個List<T>中,然後在View中迴圈這個List<T>,展示所有的資料。每次從介面中取回的資料量不等,最多會有上百條。雖說上百條也不算多,但是每條資料都要經過一系列的業務處理,感覺這

cocos2d-x型轉換(CCstring int string char UTF-8互轉)

htm for ons cocos2d oat form int str intvalue http://www.cnblogs.com/leehongee/p/3642308.html //int 轉 CCstring int num=5; CCString* n

Cocos2d-x第三方庫不支持arm64的問題解決(64位架構)

data- cocos -a mar 三方庫 popu dsm article 位操作 32位能夠兼容64位操作系統。 ipad mini2 64位編譯有問題。 各種第三方庫不支持64位操作系統。 設置build setting 直接上圖:

Cocos2d-x學習筆記(四)淺析動作CCAction(3)

【1】動作管理類CCActionManager: 動作管理類CCActionManager是一個管理所有動作的單例,可以對動作進行一系列的操作,如:新增動作、刪除動作、暫停動作、重啟動作,這個單例可以通過CCDirector::sharedDirector()->getActionMa

Cocos2d-x學習筆記(三)淺析動作CCAction(2)

有關CCAction其它動作類簡介: (1)攝像機動作類CCOrbitCamera:  攝像機動作是環繞中心螢幕旋轉所形成的動作,其旋轉座標採用球座標描述。  Create()函式原型CCOrbitCamera* create(fl

Cocos2d-x學習筆記(二)淺析動作CCAction(1)

Cocos2d-x的動作類CCAction並不是一個在螢幕中顯示的物件,動作必須要依託於CCNode類及其子類的例項才能發揮作用。CCAction繼承於物件類CCObject,有三個子類:有限時間動作、跟隨、移動速度,其中有限時間動作子類CCActionInterVal會形成動畫過程。

cocos2d-x 中選單

選單相關類包含:選單類和選單項類,選單類圖,從類圖可見Menu類繼承於Layer。   選單項類圖,從圖中可見所有的選單項都是從BaseMenuItem繼承而來的,BaseMenuItem是抽象類,具體使用時是使用它的6個子類。 說明如下:   MenuItem       最基本的選單

cocos2d-x 動作

int 動作 相關 n) 分享 img 間隔 .com inter 動作類是Action      IntervalAction是間隔動作,InstantAction是瞬時動作。   動作的管理是要由節點負責的,任何的節點都可以管理節點,如精靈、菜單、層、甚至場景都可以管理

自定義Cocos2d-x模板

由於許可權問題,mac安裝Cocos2d-x 3.x版本後,新建Cocos2d-x專案正常,但需要新建cocos2dx類檔案時發現沒有模板,瞬間懵逼,難道新建C++檔案,雖然新建後得到的是.cpp、.hpp字尾的類檔案,與Cocos2dx的類檔案.cpp、.h內容有一點不一樣,但功能沒什麼區別,

cocos2d-x lua 面向物件 ===> 呼叫基在派生中已經被過載了的函式

基類: local Base = class("Base", function () return cc.Layer:create() end) function Base:ctor( ... ) end function Base:test(self, ...

【iOS-cocos2d-X 遊戲開發之四】Cocos2dX建立Android NDK新專案並編譯匯入Eclipse中正常執行

站文章均為 李華明Himi 原創,轉載務必在明顯處註明: 轉載自【黑米GameDev街區】 原文連結: http://www.himigame.com/android-game/645.html          ☞ 點選訂閱 ☜ 本部落格最新動態

cocos2d-x v3.0各個環境下建立專案以及編譯、執行官方DEMO

如何建立一個新專案 How to start a new game Runsetup.pyRun thecocosscriptExample: $ cd cocos2d-x $ ./setup.py $ source FILE_TO_SAVE_SYSTEM_VARIAB

如何把win32下寫好的cocos2d-x 轉到android上執行

首先必須具備幾樣工具。 cygwin ,  ndk ,    android-sdk,eclipse 編譯。 其實很簡單。   cocos2d-x 2.0.1的最新版本。裡面有個檔案create-android-project.bat 關於這個配置,我前幾篇文章有寫  現在生

【玩轉cocos2d-x之二十二】多執行緒和同步02-售票

pthread有很多不同應用,官網都有相應的API解釋和Sample,這裡不再重複,本文主要介紹一個cocos2d-x多執行緒和同步示例。 1.售票 孫鑫老師的C++和Java多執行緒售票一直讓