1

www.raywenderlich.comのタイルチュートリアルを使用しました。横向きのビューでタイルマップを設定し、チュートリアルのコードを使用して、次のようにタッチを検出しました。

    CGPoint touchLocation = [touch locationInView: [touch view]];       
    touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
    touchLocation = [self convertToNodeSpace:touchLocation];

そして、このビットを使用して、それがどのタイルにあるかを判断します。

    CGPoint touchTilePos = [self tileCoordForPosition:touchLocation];
    int tileIndex = [self tileIndexForTileCoord:(touchTilePos)];
    CCSprite *touchTile = [self.background tileAt:touchTilePos];
    self.player.position = [touchTile.parent convertToWorldSpace:touchTile.position];

問題はそれが少しずれていることです。左側に近いタッチはかなり近いですが、右側に近いタッチは左側から離れて検出されます。ある種のスケーリングの問題のように見えますが、私のコードの唯一のスケーリングはプレーヤーのスプライトです。

何か案は?提案?どんな半分でも大歓迎です!

編集:コードで参照されている2つのメソッドは次のとおりです。

- (CGPoint) tileCoordForPosition:(CGPoint)position 
{
    int x = position.x / _tileMap.tileSize.width;
    int y = ((_tileMap.mapSize.height * _tileMap.tileSize.height) - position.y) / _tileMap.tileSize.height;
    return ccp(x, y);  
}

- (int) tileIndexForTileCoord:(CGPoint)aTileCoord
{
    return aTileCoord.y*(self.tileMap.mapSize.width) + aTileCoord.x;
}

更新:コードを簡略化しました:

CGPoint touchLocation = [touch locationInView: [touch view]];
touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
touchLocation = [self.background convertToNodeSpace:touchLocation];

int x = touchLocation.x / _tileMap.tileSize.width;
int y = ((_tileMap.mapSize.height * _tileMap.tileSize.height) - touchLocation.y) / _tileMap.tileSize.height;
CGPoint touchTilePos = ccp(x,y);

また、最初からtouchLocationが左側にオフになっていることに気付きました。このコードは、私の場合(iPad /ランドスケープ)では正しく機能しないと思います。

CGPoint touchLocation = [touch locationInView: [touch view]];
4

2 に答える 2

2

致命的なミスをしました!私はHEXタイルを使用していますが、それらは少し重なっています(約1/4)。私はそれを説明しなければなりません!そして、それが私がさらに右にタップするにつれて効果が悪化する理由です、これはそれを修正するためのコードです:

    int x = (touchLocation.x - tileSize.width/8) / (_tileMap.tileSize.width * (3.0/4.0)) ;
    int y = 0;
    if(x % 2 == 0)
    {
        // even
        y = ((_tileMap.mapSize.height * tileSize.height) - touchLocation.y) / tileSize.height;
    }
    else
    {
        // odd
        y = ((_tileMap.mapSize.height * tileSize.height) - (touchLocation.y + tileSize.height/2)) / tileSize.height;
    }
    CGPoint touchTilePos = ccp(x,y);

乾杯!

于 2012-04-30T03:48:12.913 に答える
0

チュートリアルコードは正常に機能するようです。数学的に同じで一貫性のある/正しい結果が得られるコードを使用しています。

私の唯一の提案はself、この行のオブジェクトが touchLocation = [self convertToNodeSpace:touchLocation];TMXMapの実際の直接の親ノードであることを二重に確認することです。

私のコードでは、CCLayerは直接の親ではないため、マップの親ノードに明示的にタグを付けて、次のように取得できるようにします。

CCNode *parentNode = [self getChildByTag:kTagParentNode];
CGPoint worldPt = [parentNode convertToNodeSpace:touchLocation];
于 2012-04-24T14:45:06.280 に答える