調用 `itemLayer->getTileAt(point)` 時觸發斷言失敗,但同樣代碼加載另一張地圖正常。
int gid = itemLayer->getTileGIDAt(tileCoord);
if (gid != 0) {
// 關鍵:先判斷 gid 是否在當前 tileset 範圍內
auto tileset = itemLayer->getTileSet();
if (tileset && gid >= tileset->_firstGid && gid < tileset->_firstGid + tileset->_tileCount) {
Sprite* tile = itemLayer->getTileAt(tileCoord);
if (tile) { // 雙重保險
tile->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
// 後續邏輯...
} else {
CCLOGWARN("Tile at (%d,%d) has GID %d but getTileAt returns nullptr",
tileCoord.x, tileCoord.y, gid);
}
} else {
CCLOGWARN("Invalid GID %d at (%d,%d) - not in tileset range",
gid, tileCoord.x, tileCoord.y);
}
}
斷言失敗源於 **地圖數據存在無效 GID**,而非代碼邏輯錯誤。短期在代碼加雙重判空防崩潰,長期**重新製作地圖並建立驗證機制**徹底根治。同樣代碼加載另一張圖正常,證明邏輯無誤,問題在具體 `.tmx` 文件。