看了一下CCMenu类的实现,主要包含以下几个关键参数:
- selected_成员变量,配合selected和unselected方法设置CCMenuItemImage中SelectedItemImage是否显示。
- state_成员变量有2种状态,当TouchBegan的时候设置为Tracking状态,TouchEnd的时候设置为Waiting状态。
- activate方法使得当前CCMenuItem获得焦点,真正的被选中。
-
CCMenuItem *curSelection = [self itemForTouch:touch];该变量用来记录当前touch的CCMenuItem
创建一个CCRadioMenu类继承自CCMenu类
1. curHightLighted_ 成员变量,表示当前选中的Item
CCRadioMenu.m文件主要内容如下:
- (void)setSelectedItem: (CCMenuItem *)item{
[selectedItem_ unselected];
selectedItem_ = item;
[selectedItem_ selected];
}
-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
if( state_ != kCCMenuStateWaiting || !visible_ )
return NO;
CCMenuItem *curSelection = [self itemForTouch:touch];
[curSelection selected];
_curHightlighted = curSelection;
if (_curHightlighted) {
if (selectedItem_ != curSelection) {
[selectedItem_ unselected];
state_ = kCCMenuStateTrackingTouch;
return YES;
}
}
return NO;
}
-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
NSAssert(state_ == kCCMenuStateTrackingTouch, @"[Menu ccTouchEnded] -- invalid state");
CCMenuItem *curSelection = [self itemForTouch:touch];
if (curSelection) {
if (curSelection != _curHightlighted) {
[_curHightlighted unselected];
selectedItem_ = curSelection;
[selectedItem_ selected];
[selectedItem_ activate];
_curHightlighted = nil;
state_ = kCCMenuStateWaiting;
return;
}
}
[selectedItem_ unselected];
selectedItem_ = _curHightlighted;
[selectedItem_ selected];
[selectedItem_ activate];
_curHightlighted = nil;
state_ = kCCMenuStateWaiting;
}
用法如下:
CCRadioMenu *radioMenu = [CCRadioMenu menuWithItems:menuItem1, menuItem2, menuItem3, nil];
[radioMenu setSelectedItem:menuItem1];
[radioMenu alignItemsVerticallyWithPadding:(20.0/480)*winSize.height];
radioMenu.position = ccp(winSize.width/2, winSize.height/2);
[self addChild:radioMenu z:2];