有时候需要实现一个暂停菜单暂停游戏,但菜单自身不暂停(可以有动画),菜单周围都是半透明的(能显示底部的游戏内容),以下代码就是实现此类功能:
PauseLayer.h
PauseLayer.h
#import <Foundation/Foundation.h>
#import "cocos2d.h"
@interface PauseLayerProtocol: CCNode
-(void)pauseLayerDidPause;
-(void)pauseLayerDidUnpause;
@end
@interface PauseLayer : CCLayerColor {
PauseLayerProtocol * delegate;
}
@property (nonatomic,assign)PauseLayerProtocol * delegate;
+ (id) layerWithColor:(ccColor4B)color delegate:(PauseLayerProtocol *)_delegate;
- (id) initWithColor:(ccColor4B)c delegate:(PauseLayerProtocol *)_delegate;
-(void)pauseDelegate;
@end
PauseLayer.m
//
// PauseLayer.m
// Pause
//
// Created by Pablo Ruiz on 06/06/11.
// Copyright 2011 PlaySnack. All rights reserved.
//
#import "PauseLayer.h"
@implementation PauseLayer
@synthesize delegate;
+ (id) layerWithColor:(ccColor4B)color delegate:(id)_delegate
{
return [[[self alloc] initWithColor:color delegate:_delegate] autorelease];
}
- (id) initWithColor:(ccColor4B)c delegate:(id)_delegate {
self = [super initWithColor:c];
if (self != nil) {
CGSize wins = [[CCDirector sharedDirector] winSize];
delegate = _delegate;
[self pauseDelegate];
CCSprite * background = [CCSprite spriteWithFile:@"pause_background.png"];
[self addChild:background];
CCMenuItemImage *resume = [CCMenuItemImage itemFromNormalImage:@"pause_btn_resume.png"
selectedImage:@"pause_btn_resume_dwn.png"
target:self
selector:@selector(doResume:)];
CCMenu * menu = [CCMenu menuWithItems:resume,nil];
[menu setPosition:ccp(0,0)];
[resume setPosition:ccp([background boundingBox].size.width/2,[background boundingBox].size.height/2)];
[background addChild:menu];
[background setPosition:ccp(wins.width/2,wins.height/2)];
}
return self;
}
-(void)pauseDelegate
{
if([delegate respondsToSelector:@selector(pauseLayerDidPause)])
[delegate pauseLayerDidPause];
[delegate onExit];
[delegate.parent addChild:self z:10];
}
-(void)doResume: (id)sender
{
[delegate onEnter];
if([delegate respondsToSelector:@selector(pauseLayerDidUnpause)])
[delegate pauseLayerDidUnpause];
[self.parent removeChild:self cleanup:YES];
}
-(void)dealloc
{
[super dealloc];
}
@end
ccColor4B c={0,0,0,150};
[PauseLayerlayerWithColor:c delegate:self];