2011-04-11 10 views
7

Ho ricevuto alcuni pulsanti di opzione, ma il toucharea è troppo piccolo. Il toucharea dipende dalla dimensione dell'immagine. Esiste un modo elegante per estendere l'area tattile con cocos2d senza utilizzare un'immagine più grande o creare le mie aree di tocco con cgrect? setContentSize fa quello che voglio. Sfortunatamente l'immagine si sposta nell'angolo in basso a sinistra del contenuto. Imposta il punto di ancoraggio per spostare il contenuto intorno ma l'immagine rimane nell'angolo in basso a sinistra.cocos2d estendere l'area di tocco da un pulsante

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

Grazie in anticipo.

risposta

2

È necessario eseguire l'override del metodo 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; 
} 

Questo dice solo lo sprite di verificare che le soluzioni alcaline tattili all'interno della vostra alterato CGRect

Modifica per mostrare CCSprite sottoclasse ---

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

- (void)onExit 
{ 
[[CCTouchDispatcher sharedDispatcher] removeDelegate:self]; 
[super onExit]; 
} 
+0

Grazie per la risposta. Non so dove sovrascrivere rectInPixels. Dopo aver provato ccnode, ccsprite, ccmenu, ccmenuitem e la mia classe, ho trovato una soluzione che funziona per me. – zeiteisen

+0

è un semplice override di ccsprite, ma devi aggiungere la classe a CCTouchDispatcher. Vedi la mia risposta modificata – Bongeh

2

Ho risolto il problema sostituendo -(CCMenuItem*) itemForTouch:(UITouch *)touch da 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; 
} 

centro il rettangolo al centro del non ha ancora lavorato immagine

11

Prendendo il codice di risposta originale ...

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

... è sufficiente impostare l'immagine nella corretta posizione ...

[[[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 righe di codice! Divertiti!

+0

Genius! Questo ha funzionato perfettamente per me. Non riuscivo a far funzionare correttamente le sottoclassi, quindi questo è un bel trucco. Grazie mille. – Arbel

+0

Il genio non rende giustizia a questo, a mio avviso, soluzione perfetta. +1 grazie per la condivisione. –

4

Inoltre, è possibile modificare la proprietà activeArea di 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]; 
+0

Perché 'activeArea' è standard, penso che questa soluzione sia giusta. Se si utilizzano versioni precedenti, consultare il post di Sébastien Dabet (http://2sa-studio.blogspot.kr/2013/01/custom-touch-area-for-ccmenuitem-in.html) e applicare le patch manualmente a cocos2d. – Dalinaum

+0

Bene, ho risolto lo stesso problema del codice precedente. –

+0

È disponibile in Cocos2dx? Non riesco a trovarlo. – Anil

Problemi correlati