2012-06-29 2 views
0

Проблема я сталкиваюсь в том, что позиции лейбла CCLabelBMFont и один из CCSprite символов, составляющих этот ярлык, кажется, отличается, так что я не могу управлять сенсорными события ...регистрирующие затрагивает CCSprite символов лейбла CCLabelBMFont

Чтобы проверить более подробно этот вопрос я попытался это:

-(id)init 
    { 
     if ((self = [super init]) 
     { 
     CCLabelBMFont *label = [CCLabelBMFont labelWithString:"welcome" fntFile:@"Arial.fnt"]; 
     CGSize size = [[CCDirector sharedDirector] winSize]; 
     label.position = ccp(size.width/2, size.height/2); 
     [self addChild: self.label]; 

     self.isTouchEnabled = YES; 
     } 
    return self; 
    } 

    -(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
     UITouch *touch = [touches anyObject]; 
     CGPoint touchLocation = [touch locationInView:[touch view]]; 
     touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation]; 
     NSLog(@"point touched: x:%f, y:%f", touchLocation.x, touchLocation.y); 

     for (CCSprite *character in [label children]) 
     { 
     if (CGRectContainsPoint([character boundingBox], touchLocation)) 
     { 
      [character setColor:ccRED]; 
     } 
     } 
    } 

И все, что письмо этикетки я потрогать это не покраснеет, как это должно быть.

И причина, почему я считаю, что положение спрайтов, составляющие CCLabelBMFont и метка сами по себе различны, что, когда я вставляю:

NSLog(@"character position: x:%f y: %f", character.position.x, character.position.y); 

в обработке ccTouchesBegan касания, положение спрайтов перечислены чтобы быть в левом нижнем углу экрана.

Так что, может быть, мне не хватает чего-то простого, но есть ли способ конвертировать положение спрайтов в одно и то же место с меткой, чтобы можно было распознать штрихи на буквах ярлыка?

Заранее спасибо.

ответ

1

Позиция дочерних узлов относительно их родителя. Вы должны использовать методы convertToNodeSpace sprite или convertToWorldSpace для преобразования позиции соответственно. В этом случае вам нужно будет использовать convertToNodeSpace с touchLocation в качестве входных данных для каждого спрайта, прежде чем использовать его для проверки столкновений с ограничивающей коробкой.

Это должно исправить:

for (CCSprite *character in [label children]) 
{ 
    CGPoint touchLocationNodeSpace = [character convertToNodeSpace:touchLocation]; 
    if (CGRectContainsPoint([character boundingBox], touchLocationNodeSpace)) 
    { 
     [character setColor:ccRED]; 
    } 
} 
+0

Спасибо большое, теперь она прекрасно работает для первой буквы моего слова, но для других я должен прикасаться дальше справа от отображаемого слова, чтобы они также стали красными, не знаете ли вы, откуда это могло произойти? – PoohKun

0

Благодаря вашим советам и с небольшой модификацией я, наконец, удалось заставить его работать, смещение я заметил, было связано с началом координат, которые были использованы для вычисление ограничивающих полей каждого символа, составляющего метку.

Так, добавив:

CGRect boundingBox = [character boundingBox]; 
boundingBox.origin = CGPointZero; 

Я очистил это смещение в обнаружении касаний.

Вот окончательный код для прикосновений:

-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchLocation = [touch locationInView:[touch view]]; 
    touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation]; 

    for (CCSprite *character in [self.label children]) 
    { 
     CGRect boundingBox = [character boundingBox]; 
     boundingBox.origin = CGPointZero; 
     CGPoint touchLocationNodeSpace = [character convertToNodeSpace:touchLocation]; 
     if (CGRectContainsPoint(boundingBox, touchLocationNodeSpace)) 
     { 
      [character setColor:ccRED]; 
     } 
    } 
} 
0

Это делает трюк для меня

CGRect boundingBox = [character boundingBox]; 
boundingBox.origin = CGPointZero; 
0

Не трогать левое ухо правой рукой.
Если бы я тебя, я бы зарегистрировать его в меню, как это: (также добавляет масштаб влияет на лету)

-(void)GenerateButtons 
{ 
    CGSize s = [[CCDirector sharedDirector] winSize]; 
    CCLabelBMFont *myBtn=[CCLabelBMFont labelWithString:@"BLABLA" fntFile:@"comicsansms.fnt"]; 
    CCMenuItemLabel *lbl_=[CCMenuItemLabel itemWithLabel:shakeBtn target:self selector:@selector(myButtonPressed)]; 
CCMenu *menu_=[CCMenu menuWithItems:lbl_, nil]; 
[self addChild:menu_]; 
[menu_ setPosition:ccp(s.width/2,(myBtn.boundingBox.size.height))]; 
} 

-(void)myButtonPressed{ 
    //do what your CCLabelBMFont should do 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^