您好,登錄后才能下訂單哦!
帶冷卻的菜單按鈕完美封裝。
下面是用到的兩個圖片:藍色的是按鈕,灰色的是冷卻的蒙板效果。
按鈕有三個狀態:未點擊,冷卻中,不可點擊。見圖:
當然,數字不算在呢,還有圖片好丑。好吧,好不專業。最討厭不專業的了。
我們要做的是繼承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一樣的使用是不是很激動。完美的封裝到此結束,你可以根據自己的需求對他進行修改和內容的添加。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。