Button cocos2d从按钮扩展触摸区域

Button cocos2d从按钮扩展触摸区域,button,cocos2d-iphone,touch,extend,area,Button,Cocos2d Iphone,Touch,Extend,Area,我有一些单选按钮,但触摸区域太小了。触摸区域取决于图像大小。有没有一种优雅的方法可以在不使用更大图像的情况下使用cocos2d扩展触摸区域,或者使用cgrect创建自己的触摸区域? setContentSize做我想做的事。不幸的是,图像移动到contentsize的左下角。设置主播点移动contentsize,但图像保持在左下角 CCMenuItem* pickEasy = [CCMenuItemImage itemFromNormalImage:@"radiobutton_off.p

我有一些单选按钮,但触摸区域太小了。触摸区域取决于图像大小。有没有一种优雅的方法可以在不使用更大图像的情况下使用cocos2d扩展触摸区域,或者使用cgrect创建自己的触摸区域? setContentSize做我想做的事。不幸的是,图像移动到contentsize的左下角。设置主播点移动contentsize,但图像保持在左下角

    CCMenuItem* pickEasy = [CCMenuItemImage itemFromNormalImage:@"radiobutton_off.png" selectedImage:@"radiobutton_on.png" target:self selector:@selector(pickEasyTapped:)];
    pickEasy.position = ccp(ss.width * 0.40, ss.height * 0.78);
    [pickEasy setContentSize:CGSizeMake(50, 50)];

提前谢谢

您需要重写rectInPixels方法

- (CGRect)rectInPixels
{
CGSize s = [self contentSize];
return CGRectMake(0, 0, s.width, s.height);
}

- (BOOL)containsTouchLocation:(UITouch *)touch
{   
CGPoint p = [self convertTouchToNodeSpace:touch];
CGRect r = [self rectInPixels];
return CGRectContainsPoint(r, p);
}

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {

NSSet *allTouches = [event allTouches];
for (UITouch *aTouch in allTouches) {

        if ( ![self containsTouchLocation:aTouch] ) return NO;
}

return YES;
}
这只是告诉精灵检查触摸是否在更改后的CGRect中碱化

编辑以显示CCSprite子类---


我通过覆盖CCMenu中的
-(CCMenuItem*)itemForTouch:(UITouch*)touch
来解决问题

-(CCMenuItem*) itemForTouch:(UITouch *)touch { CGPoint touchLocation = [touch locationInView:[touch view]]; touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation]; CCMenuItem* item; CCARRAY_FOREACH(children_, item) { if ([item visible] && [item isEnabled]) { CGPoint local = [item convertToNodeSpace:touchLocation]; CGRect r = [item rect]; r.origin = CGPointZero; // increase rect by * 2 // a rect at bottom left of the image CGRect bigR = CGRectMake(r.origin.x - r.size.width, r.origin.y - r.size.height, r.size.width * 2, r.size.width * 2); // a rect at top right of the image CGRect bigR2 = CGRectMake(0, 0, r.size.width * 2, r.size.width * 2); if (CGRectContainsPoint(bigR, local) || CGRectContainsPoint(bigR2, local)) { return item; } } } return nil; } -(CCMenuItem*)itemForTouch:(UITouch*)触摸 { CGPoint touchLocation=[触摸位置视图:[触摸视图]]; touchLocation=[[CCDirector sharedDirector]convertToGL:touchLocation]; 项目*项目; CCARRAY\u FOREACH(儿童,项目) { 如果([项目可见]&&[项目已启用]){ CGPoint local=[item convertToNodeSpace:touchLocation]; CGRect r=[项目rect]; r、 原点=零; //将rect增加*2 //图像左下角的矩形 CGRect bigR=CGRectMake(r.origin.x-r.size.width,r.origin.y-r.size.height,r.size.width*2,r.size.width*2); //图像右上角的矩形 CGRect bigR2=CGRectMake(0,0,r.size.width*2,r.size.width*2); if(CGRectContainsPoint(bigR,local)| CGRectContainsPoint(bigR2,local)){ 退货项目; } } } 返回零; }

中心在图像中间的ReCT没有工作

< P>使用原始答案代码…

CCMenuItem* pickEasy = [CCMenuItemImage itemFromNormalImage:@"radiobutton_off.png" selectedImage:@"radiobutton_on.png" target:self selector:@selector(pickEasyTapped:)];
pickEasy.position = ccp(ss.width * 0.40, ss.height * 0.78);
[pickEasy setContentSize:CGSizeMake(50, 50)];
。。。您只需将图像设置在正确的位置

[[[pickEasy children] objectAtIndex:0] setAnchorPoint:ccp(0.5,0.5)];
[[[pickEasy children] objectAtIndex:1] setAnchorPoint:ccp(0.5,0.5)];
[[[pickEasy children] objectAtIndex:0] setPosition:ccp(pickEasy.contentSize.width/2,pickEasy.contentSize.height/2)];
[[[pickEasy children] objectAtIndex:1] setPosition:ccp(pickEasy.contentSize.width/2,pickEasy.contentSize.height/2)];

…只有4行代码!玩得开心

此外,您还可以更改CCMenuItem的activeArea属性。(CoCoS2D2.x)


谢谢你的回复。我不知道在哪里覆盖矩形像素。在尝试了ccnode、ccsprite、ccmenu、ccmenuitem和我自己的类之后,我找到了一个适合我的解决方法。这是一个简单的ccsprite覆盖,但您必须将该类添加到CCTouchDispatcher。看我编辑的回答天才!这对我来说非常有效。我无法使子类正确工作,因此这是一个很好的破解。非常感谢。在我看来,天才并不能公正地对待这个完美的解决方案+1谢谢分享。因为
activeArea
是标准配置,我认为这个解决方案是正确的。如果您使用旧版本,请参阅Sébastien Dabet的post()并手动修补您的cocos2d。这在Cocos2dx中可用吗?找不到。
[[[pickEasy children] objectAtIndex:0] setAnchorPoint:ccp(0.5,0.5)];
[[[pickEasy children] objectAtIndex:1] setAnchorPoint:ccp(0.5,0.5)];
[[[pickEasy children] objectAtIndex:0] setPosition:ccp(pickEasy.contentSize.width/2,pickEasy.contentSize.height/2)];
[[[pickEasy children] objectAtIndex:1] setPosition:ccp(pickEasy.contentSize.width/2,pickEasy.contentSize.height/2)];
CGRect active = [someMenuItem activeArea];
[someMenuItem setActiveArea:CGRectMake(active.origin.x - active.size.width * 2.f, active.origin.y - active.size.height * 2.5f, active.size.width * 2.f, active.size.height * 2.f)];
[someMenu addChild:someMenuItem];