Cocos2d-x:从字符串启动TMXTiledMap时崩溃

时间:2013-01-17 19:12:05

标签: cocos2d-iphone cocos2d-x tiled tmx

我在从字符串输入创建tmx映射时遇到问题。

bool LevelManager::initLevel(int currentLevel)
{
    const char* map;
    try {

        map = LevelManager::getLevel(currentLevel);
    } catch (int) {
        throw 1;
    }
    if(map != NULL){
        CCLog("%s", map);
        tileMap = CCTMXTiledMap::create(map);
        tileMap->setAnchorPoint(ccp(0,0));
        tileMap->setPosition(ccp(15,20));
        this->addChild(tileMap, 5);
        backgoundLayer = tileMap->layerNamed("Background");
    } else {
        throw 1;
    }
    return true;
}

这就是我的代码。 它非常不稳定。大多数时候它会崩溃,有时却不会崩溃。 我正在从字符串映射中加载我的地​​图。这是一个const * char。 我的地图名为Level1.tmx,当我像这样加载地图时:tileMap = CCTMXTiledMap :: create(“Level1.tmx”);它始终有效,永不崩溃。 而且我知道map的值是Level1.tmx,因为我在加载之前将它记录在行中。

当它崩溃时,日志输出:(lldb) 并在行tileMap-> setAnchorPoint(ccp(0,0));它说“线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x0)

有谁知道为什么会发生这种情况以及如何解决这个问题?

非常感谢。

Ps:我正在使用xcode,最新的cocos2d-x版本和iPhone模拟器

修改

使用断点我在加载tilemap时检查了哪里出了问题。

在行tileMap = CCTMXTiledMap :: create(map); 我的变量图仍然很好

但在线tileMap-> setAnchorPoint(ccp(0,0)); 它突然被破坏(大部分时间)

2 个答案:

答案 0 :(得分:1)

听起来你正在返回在堆栈上创建的char *字符串,这意味着内存可能会或可能不会被破坏,具体取决于环境,月相和不存在。

所以问题是:如何定义getLevel以及它做了什么(发布代码)?

如果您这样做:

const char* LevelManager::getLevel(int level)
{
    char* levelName = "default.tmx";
    return levelName;
}

......然后那将是罪魁祸首。在堆栈上创建了levelName变量,没有为它分配内存(在堆上)。一旦方法返回,levelName变量和它指向的内存将变为无效。

因此,当方法离开此levelName指向的内存区域时,可以由程序的其他部分或其他方法的堆栈内存分配。无论在该内存区域中的任何内容仍可能是字符串,或者它可能(部分)被其他位和字节覆盖。

PS:您的异常处理代码是......它表明缺乏理解异常处理的作用,如何使用它,特别是何时使用它。我希望这些只是试图找到问题的底部的残余,否则摆脱它。如果您想继续使用异常,我建议您阅读有关C ++异常处理的教程和介绍。特别是(map!= NULL)应该是一个断言,而不是例外。

答案 1 :(得分:0)

我修好了。

const char *应该受到责备。

当我将地图作为char *返回时,它完美无瑕。

    const char *levelFileName = level.attribute("file").value();
    char *levelChar = new char[strlen(levelFileName) + 1];
    std:: strcpy (levelChar, levelFileName);

return levelChar;

多数民众赞成我现在如何返回地图。