0

私が遭遇する問題は、CCLabelBMFont ラベルの位置とそのラベルを構成する CCSprite 文字の 1 つが異なるように見えるため、タッチ イベントを管理できないことです...

この問題をさらに詳しくテストするために、私はこれを試しました:

    -(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 タッチ処理では、スプライトの位置が画面の左下隅にあるようにリストされています。

だから、単純なものが欠けているかもしれませんが、スプライトの位置をラベルと同じ場所に変換して、ラベルの文字のタッチを認識できるようにする方法はありますか?

前もって感謝します。

4

4 に答える 4

1

子ノードの位置は、親に対して相対的です。それに応じて位置を変換するには、スプライトの convertToNodeSpace または convertToWorldSpace メソッドを使用する必要があります。この場合、バウンディング ボックスの衝突をテストする前に、各スプライトの入力として convertToNodeSpace を touchLocation とともに使用する必要があります。

これで修正されるはずです:

for (CCSprite *character in [label children])
{
   CGPoint touchLocationNodeSpace = [character convertToNodeSpace:touchLocation];
   if (CGRectContainsPoint([character boundingBox], touchLocationNodeSpace))
   {
      [character setColor:ccRED];
   }
}
于 2012-06-29T11:13:43.773 に答える
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
}
于 2013-07-08T10:15:14.747 に答える
0

これは私のためのトリックを行います

CGRect boundingBox = [character boundingBox];
boundingBox.origin = CGPointZero;
于 2013-02-13T21:56:48.200 に答える
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];
        }
    }
}
于 2012-06-30T12:15:02.683 に答える