91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

cocos2d帶冷卻的菜單按鈕封裝

發布時間:2020-08-11 12:57:36 來源:網絡 閱讀:1079 作者:bhubhu 欄目:開發技術

    帶冷卻的菜單按鈕完美封裝。


   下面是用到的兩個圖片:藍色的是按鈕,灰色的是冷卻的蒙板效果。

cocos2d帶冷卻的菜單按鈕封裝cocos2d帶冷卻的菜單按鈕封裝

   按鈕有三個狀態:未點擊,冷卻中,不可點擊。見圖:

cocos2d帶冷卻的菜單按鈕封裝cocos2d帶冷卻的菜單按鈕封裝cocos2d帶冷卻的菜單按鈕封裝

當然,數字不算在呢,還有圖片好丑。好吧,好不專業。最討厭不專業的了。


我們要做的是繼承cocos2d提供的精靈菜單按鈕項(CCMenuItemSprite),對它進行效果的添加。

首先我們要了解CCMenuItemSprite的使用:


//紋理緩存
            CCTextureCache * textureCache = [CCTextureCache sharedTextureCache];
            //未選擇狀態
            CCSprite *normal = [CCSprite spriteWithTexture:[textureCache textureForKey:@"tool.png"]];
            //選擇狀態
            CCSprite *selected = [CCSprite spriteWithTexture:[textureCache textureForKey:@"tool.png"]];
            //不可選擇狀態(可為空)
            CCSprite *disabled = [CCSprite spriteWithTexture:[textureCache textureForKey:@"tool.png"]];
            //精靈菜單項
            CCMenuItemSprite *tool = [CCMenuItemSprite itemWithNormalSprite:normal selectedSprite:selected disabledSprite:disabled target:self selector:@selector(toolCallback)];
            //菜單添加菜單項
            CCMenu *menu = [CCMenu menuWithItems:tool, nil];
            //菜單坐標為原點 這樣菜單項就可以根據屏幕坐標設置位置
            [menu setPosition:CGPointZero];
            [self addChild:menu];


為什么不直接加載圖片,難道你不覺得在游戲開始的時候把圖片一次性加載到緩存里,會使游戲更加流暢,這也是為什么我們使用CCMenuItemSprite的原因。還有上述代碼設置的用來響應按鈕的回調函數:


-(void) toolCallback
{
    //按鈕的功能
}


以上是CCMenuItemSprite的使用,當然我們的封裝也要這樣的使用。網上有個博文對按鈕的封裝把響應按鈕的回調函數寫在了按鈕類里,這就使封裝毫無意義,添加一個按鈕,就再寫一個類?好不專業有沒有。


首先聲明部分:

#import <Foundation/Foundation.h>
#import "cocos2d.h"
@interface MYMenuItemSprite : CCMenuItemSprite {
    //蒙板精靈
    CCSprite *_becloundsSprite;
    //冷卻進度條
    CCProgressTimer* _progressSprite;
    //冷卻時間
    ccTime _time;
    //是否正在冷卻中
    BOOL isCool;
}
//按鈕圖片 蒙板圖片 冷卻時間 當前layer 當前layer里的響應按鈕函數
+(id)initMenuItemSprite:(CCSprite *)normalSprite becloudsSprite:(CCSprite *) becloundsSprite duration:(ccTime)time target:(id)target selector:(SEL)selector;
-(id)initMenuItemSprite:(CCSprite *)normalSprite becloudsSprite:(CCSprite *) becloundsSprite duration:(ccTime)time target:(id)target selector:(SEL)selector;
//冷卻效果
-(void)coolingEffect;
//冷卻完成后
-(void)progressCallback;
//按鈕是否可用(和父類的只是有點像)
-(void)setEnabled:(BOOL) is;
@end

我們自己的冷卻按鈕也是按鈕,繼承自CCMenuItemSprite,對它進行功能的擴充。

下面是實現部分:

#import "MYMenuItemSprite.h"
@implementation MYMenuItemSprite
+(id)initMenuItemSprite:(CCSprite *)normalSprite becloudsSprite:(CCSprite *) becloundsSprite duration:(ccTime)time target:(id)target selector:(SEL)selector
{
    //返回一個可以自動釋放的對象
    return [[[self alloc] initMenuItemSprite:normalSprite becloudsSprite:becloundsSprite duration:time target:target selector:selector] autorelease];
}
//自己的構造
-(id)initMenuItemSprite:(CCSprite *)normalSprite becloudsSprite:(CCSprite *) becloundsSprite duration:(ccTime)time target:(id)target selector:(SEL)selector
{
    //未選擇和已選擇圖片相同
    CCSprite *sprite = [CCSprite spriteWithTexture:normalSprite.texture];
                                       
    //父類的構造
    self = [super initWithNormalSprite:normalSprite selectedSprite:sprite disabledSprite:nil target:target selector:selector];
                                       
    //新的構造
    if(self)
    {
        //蒙板精靈
        _becloundsSprite = [CCSprite spriteWithTexture:becloundsSprite.texture];
        _becloundsSprite.visible = NO;
        //包含菜單的layer,包含蒙板精靈,在菜單項之上
        [target addChild:_becloundsSprite z:2];
                                           
        //冷卻精靈,即按鈕圖片
        CCSprite *sprite2 = [CCSprite spriteWithTexture:normalSprite.texture];
        _progressSprite = [CCProgressTimer progressWithSprite:sprite2];
        //包含菜單的layer,包含冷卻精靈,在蒙版之上
        [target addChild:_progressSprite z:3];
                                           
        //冷卻時間
        _time = time;
    }
                                       
    return self;
}
-(void)dealloc
{
    [super dealloc];
}
// 向父類的方法添加蒙板精靈的定位
-(void)setPosition:(CGPoint)position
{
    [super setPosition:position];
    _becloundsSprite.position = position;
    [_progressSprite setPosition: position];
}
//父類的按鈕點擊后的回調函數
-(void) selected
{
    [super selected];
}
//父類的離開按鈕的回調函數
-(void) unselected
{
    [super unselected];
                                       
    //點擊按鈕后 播放冷卻效果
    [self coolingEffect];
}
//父類的回調函數
-(void) activate
{
    //執行相應本按鈕的回調函數
    [super activate];
    //回調函數執行后 按鈕不可按狀態
    self.isEnabled = NO;
}
//冷卻效果
-(void)coolingEffect
{
    //冷卻效果
    CCActionInterval *action = [CCProgressTo actionWithDuration:_time percent:100];
    CCCallFunc *callFunc = [CCCallFunc actionWithTarget:self selector:@selector(progressCallback)];
    CCSequence *seq = [CCSequence actions:action, callFunc, nil];
    [_progressSprite runAction:seq];
                                       
    //蒙板可見
    _becloundsSprite.visible = YES;
    //冷卻狀態中
    isCool = YES;
}
-(void)progressCallback
{
                                       
    if (isCool) {
        isCool = NO;
    }else{
        //若已提前結束冷卻狀態,則直接返回
        return;
    }
                                       
    //冷卻完畢 激活按鈕
    self.isEnabled = YES;
    //蒙板不可見
    _becloundsSprite.visible = NO;
                                       
}
//設置當前按鈕是否可用
-(void)setEnabled:(BOOL) is
{
    //冷卻的時候不可進入可用狀態,冷卻的時候設置為不可用,可直接冷卻完成
    if(is){
        if(!isCool){
            self.isEnabled = YES;
            _progressSprite.visible = YES;
            _becloundsSprite.visible = NO;
        }
    }else
    {
        isCool = NO;
        self.isEnabled = NO;
        _progressSprite.visible = NO;
        _becloundsSprite.visible = YES;
    }
}
@end

有一點需要注意,我們傳進去的回調函數對象即target:只能是當前添加菜單的CCNode,因為它需要繪制我們的蒙板圖片,當然,平時的時候我們也都這樣寫。只是這里只能這樣寫。如果也非要傳遞一個非CCNode對象也可以,自己修改一下,添加一個參數,把添加菜單的CCNode傳遞進去。比如構造函數的末尾添加:scene:(CCNode*)scene


最后是對自己的冷卻按鈕項的使用:

{
            CCTextureCache * textureCache = [CCTextureCache sharedTextureCache];
            //蒙板圖片
            CCSprite *tool_b = [CCSprite spriteWithTexture:[textureCache textureForKey:@"tool_b.png"]];
            CCSprite *normal = [CCSprite spriteWithTexture:[textureCache textureForKey: @"tool.png"]];
            //自己的冷卻菜單按鈕項
            MYMenuItemSprite *tool = [MYMenuItemSprite initMenuItemSprite:normal becloudsSprite:tool_b duration:1.1 target:self selector:@selector(toolMenuCallback)];
            //設置冷卻菜單項的位置
            [tool setPosition:ccp(0,0)];
                                                                                                                                                                                                        
            menu = [CCMenu menuWithItems:tool, nil];
            [menu setPosition:CGPointZero];
            [self addChild:menu z:1];
        }
                                                                                                                                                                                                    
        -(void) toolMenuCallback
        {
            //按鈕的功能
        }

和CCMenuItemSprite一樣的使用是不是很激動。完美的封裝到此結束,你可以根據自己的需求對他進行修改和內容的添加。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汤阴县| 五莲县| 武城县| 东台市| 施甸县| 蒙山县| 神木县| 保亭| 永州市| 宁阳县| 临西县| 越西县| 嘉善县| 南木林县| 盘锦市| 剑阁县| 隆德县| 台州市| 邵阳县| 舟曲县| 秦皇岛市| 定远县| 宣威市| 林芝县| 蛟河市| 阿城市| 延庆县| 怀柔区| 汽车| 临夏县| 兴义市| 新龙县| 瑞金市| 左权县| 哈巴河县| 紫云| 色达县| 宁海县| 会东县| 太谷县| 乃东县|