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