type para pagina otra link etiqueta ejemplos botones boton button cocos2d-iphone touch extend area

para - etiqueta button html



cocos2d extiende el área táctil desde un botón (4)

Tengo algunos botones de radio, pero la toucharea es demasiado pequeña. La toucharea depende del tamaño de la imagen. ¿Existe una manera elegante de extender el área de contacto con cocos2d sin usar una imagen más grande o crear mis propias áreas táctiles con cgrect? setContentSize hace lo que quiero. Lamentablemente, la imagen se mueve hacia la esquina inferior izquierda de la zona de contenidos. Establecer el punto de anclaje mueve el contenido pero la imagen permanece en la esquina inferior izquierda.

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)];

Gracias por adelantado.


Hice una solución reemplazando -(CCMenuItem*) itemForTouch:(UITouch *)touch desde CCMenu.

-(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; }

Centrar el rect en el medio de la imagen no funcionó


Debe anular el método 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; }

Esto simplemente le dice al sprite que verifique que el tacto se encuentre dentro de su CGRect alterado

Editar para mostrar la subclase CCSprite ---

- (void)onEnter { [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; [super onEnter]; } - (void)onExit { [[CCTouchDispatcher sharedDispatcher] removeDelegate:self]; [super onExit]; }


Tomando el código de respuesta original ...

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)];

... solo tienes que configurar la imagen en la posición correcta ...

[[[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)];

... ¡solo con 4 líneas de código! ¡Que te diviertas!


Además, puede cambiar la propiedad activeArea de CCMenuItem. (cocos2d 2.x)

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];