経路探索クラスを実装しようとしているプロジェクトがありますが、修正できないように見える問題に遭遇しました。
エラーが発生したときのビデオは、 https ://www.dropbox.com/s/25ajb0mc5p4a3a9/Tilemap%20Error.mov にあります。
スローされるエラー メッセージは次のとおりです。Assertion failure in -[CCTMXLayer tileGIDAt:withFlags:], /Users/Dave/Desktop/AI_DISS_new copy/AI_DISS/libs/cocos2d/CCTMXLayer.m:304
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'TMXLayer: invalid position'.
ポイントはピクセル値として返され、マップとレイヤーのサイズはタイル値で返されるため、ピクセル値を保持する変数をタイルの幅または高さで除算しようとしましたが、何も機能していないようです。
tileAt:point の GID は、ピクセル値を使用すると (当然のことながら) 大きすぎる値を返し、タイル値に変換すると非常に長い時間検索し、最終的にはマップから外れて、Xcode がクラッシュするまで検索を続けます。
できるだけ詳しく説明するように努めましたが、このフォーラムに適した質問ではない場合は申し訳ありません。何かお役に立てば幸いです。
詳細が必要な場合は、お問い合わせください。
このクラスを使用する元の手順は、オーバーホールされたばかりの cocos2d フォーラムにあり、スレッドが移動または削除されたように見えるため引用できませんが、タイルマップ (TMX タイルマップ) とレイヤー属性が変更されていることは確かです。正しく渡されました。
私の HelloWorldLayer クラスからの値は次のとおりです。
//Pathfinding related code
////////////////////////////
_tileMap = [CCTMXTiledMap tiledMapWithTMXFile:@"NewMap.tmx"];
_pathFinder = [[AStar alloc] initWithTileMap:_tileMap groundLayer:@"Collision"]; //collidable Tiles
[_pathFinder setCollideKey:@"Collidable"]; // defaults to COLLIDE
[_pathFinder setCollideValue:@"True"]; // defaults to 1
_pathFinder2 = [[AStar alloc] initWithTileMap:_tileMap groundLayer:@"Collision"]; //collidable Tiles
[_pathFinder2 setCollideKey:@"Collidable"]; // defaults to COLLIDE
[_pathFinder2 setCollideValue:@"True"]; // defaults to 1
/////////////////////////////
move メソッドは次のように呼び出されます。
/////////////// player path finding related code //////////////////
[_pathFinder moveSprite:_player from:s to:f atSpeed:0.003];
///////////// end player path finding related code //////////////
前もって感謝します。
以下にコメントされているGIDコード:
if (tileGid)
{
// check the tile for the collide property.
NSDictionary *dict = [tileMap propertiesForGID:tileGid];
if (dict)
{
//check the tile for the collideKey and return Yes if a match
NSString *collide = [dict valueForKey:collideKey];
if (collide && [collide compare:collideValue] == NSOrderedSame)
return YES;
}
}