1

Cocos2d for iPhone を使用するのは初めてで、タッチ位置に問題があります。現時点では、単に画面上でスプライトに触れて移動しようとしていますが、これは、レイヤーが移動されていないときと、レイヤーを移動するとき (私の場合は X 方向に self.position を変更するとき) に正常に機能しますが、スケーリングすると私のレイヤー(例:self.scale = .5)タッチでスプライトが動かなくなりました。私は多くのフォーラム検索/Google検索を行ってきましたが、私の問題は座標変換(ノード空間/ワールド空間など)に関係していると思いますが、100%確実ではありません. スケールするときに、スケールなしでスプライトがある場所をクリックすると、スプライトを移動できることに気付きました。これは、私の変換がスケールを考慮していないと私に信じさせます。

タッチ位置を取得するために現在使用している座標変換コードは次のとおりです。

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *myTouch = [touches anyObject];
    CGPoint location = [myTouch locationInView:[myTouch view]];
    location = [self convertToNodeSpace:location];
    location = [[CCDirector sharedDirector] convertToGL:location];
}

これは、場所 (上記と同じ場所変数) がスプライトに触れているかどうかをチェックするコードですが、このコードが正しいことには自信があります。

for (CCSprite *sprite in movableSprites) {
    if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) {
        NSLog(@"Woohoo, you touched a sprite!");
        break;
    }
}

さらに情報が必要な場合はお知らせください。お読みいただきありがとうございます。

4

2 に答える 2

1

スケールで境界ボックスを2倍にする必要があると思います

   for (CCSprite *sprite in movableSprites) {
    if (CGRectContainsPoint(sprite.boundingBox*sprite.scale, touchLocation)) {
       //touch sprite action
    }
}

ポイントの変換について、絶対スクリーン ポイントが必要な場合は、常に使用します。

convertToWorldSpace:CGPointZero. 

タッチ位置でこれが必要な理由はよくわかりません。通常、親ノードでの位置を無視する必要がある場合は、スプライトでこれを行います。

それ以外では、ゲームが実際のマルチタッチ ゲームでない場合は、ccTouchesBegan ではなく ccTouchBegan を使用することをお勧めします。

于 2012-07-16T07:31:25.583 に答える
0

この関数を使用して、スプライトを修正します。

-(CGRect)getSpriteRect:(CCNode *)inSprite
{
    CGRect sprRect = CGRectMake(
                                inSprite.position.x - inSprite.contentSize.width*inSprite.anchorPoint.x,
                                inSprite.position.y - inSprite.contentSize.height*inSprite.anchorPoint.y,
                                inSprite.contentSize.width, 
                                inSprite.contentSize.height
                                ); 

    return sprRect;
}



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

    for (CCSprite *sprite in movableSprites) 
    {
       CGRect rect = [self getSpriteRect:sprite];
       if (CGRectContainsPoint(rect, location)) 
       {
           NSLog(@"Woohoo, you touched a sprite!");
           break;
       }
   }
}
于 2012-07-16T07:49:47.420 に答える