Cocos2d iphone 使用Cocos2d获取EXC\u BAD\u访问权限&;尝试使用DebugDraw时的Box2d

Cocos2d iphone 使用Cocos2d获取EXC\u BAD\u访问权限&;尝试使用DebugDraw时的Box2d,cocos2d-iphone,exc-bad-access,box2d,box2d-iphone,Cocos2d Iphone,Exc Bad Access,Box2d,Box2d Iphone,这件事让我发疯了 我正在试验Cocos2d(0.99.5)和Box2D,我已经成功地创建了一个场景,其中包含一个层和两个实体(实际上是两个弹跳球)。现在我想启用DebugDrawing,以便能够准确地看到正在发生的事情。考虑到所有的工作都与禁用的Debug绘图一起工作。 谈到代码,在我的init方法中,我有以下内容: m_debugDraw = new GLESDebugDraw(PTM_RATIO); uint32 flags; flags = 0; fla


这件事让我发疯了
我正在试验Cocos2d(0.99.5)和Box2D,我已经成功地创建了一个场景,其中包含一个层和两个实体(实际上是两个弹跳球)。现在我想启用DebugDrawing,以便能够准确地看到正在发生的事情。考虑到所有的工作都与禁用的Debug绘图一起工作。 谈到代码,在我的init方法中,我有以下内容:

    m_debugDraw = new GLESDebugDraw(PTM_RATIO);


    uint32 flags;
    flags = 0;
    flags += 1  * b2DebugDraw::e_shapeBit;
    flags += 1  * b2DebugDraw::e_jointBit;
    flags += 1  * b2DebugDraw::e_aabbBit;
    flags += 1  * b2DebugDraw::e_pairBit;
    flags += 1  * b2DebugDraw::e_centerOfMassBit;

    m_debugDraw->SetFlags(flags);
    _world->SetDebugDraw(m_debugDraw);
我的画法如下:

-(void)draw {
    [super draw];

    glDisable(GL_TEXTURE_2D);
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    _world->DrawDebugData();  // <------ here comes the problem

    glEnable(GL_TEXTURE_2D);
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}
在中引发EXC\u BAD\u访问异常。调试器在此处显示错误:

void b2World::DrawDebugData()
{
    if (m_debugDraw == NULL)
    {
        return;
    }

    uint32 flags = m_debugDraw->GetFlags();    // <----- this is the row pointed by Xcode

    if (flags & b2DebugDraw::e_shapeBit)
    {
    [...]
)>

当前语言:自动;目前为c++

(gdb)

我尝试过谷歌搜索,发现了很多关于这个错误的东西,但我仍然无法解决它。它发生在模拟器和iPhone上。另一个讨论中的人(抱歉,丢失了链接)指出,这可能与编译器或优化有关,因此我尝试了不同的组合,从LLVM切换到GCC,再切换到LLVM-GCC,并在不同级别设置优化,但没有成功

有人能给我指出正确的方向吗?如果需要更多信息,请告诉我

谢谢大家,

Daniele Salatti使用调试器查看您的
世界
debugDraw
变量。看起来其中一个已损坏

使用调试器查看您的
世界
debugDraw
变量。看起来其中一个已损坏

Cocos2D Box2D模板的唯一区别在于,在分配标志后调用SetDebugDraw。这应该没有什么区别,但您可能希望完全像Box2D模板项目那样尝试:

    world = new b2World(gravity, doSleep);

    world->SetContinuousPhysics(true);

    // Debug Draw functions
    m_debugDraw = new GLESDebugDraw( PTM_RATIO );
    world->SetDebugDraw(m_debugDraw);

    uint32 flags = 0;
    flags += b2DebugDraw::e_shapeBit;
    m_debugDraw->SetFlags(flags);       
更新:我发现了另一个不同点。在draw方法中,调用[super draw]。Box2D模板项目不会这样做。再说一次,这不会有什么区别,但你永远不会知道。如果它仍然崩溃,我建议将您的项目与Box2D模板进行比较,以发现任何其他(可能细微的)差异。除了排除所有编译器故障的常规建议之外:清理所有目标、删除构建文件夹、重新启动Xcode(和整个计算机)、从模拟器/设备中删除应用程序(以及重新启动设备)

PS:我看到您在使用下划线前缀,就像在:\u world中一样。苹果公司建议不要这样做,因为下划线前缀是为它们自己的内部使用而保留的,还有一些C风格的函数。在ObjC中,如果必须根据某种方案命名成员变量,则更喜欢使用下划线后缀,如world->SetDebugDraw()


就我个人而言,我试图完全避免使用这些world、world或m_world命名方案,除了传统的和相互冲突的函数参数名称之外,这没有任何意义。如有必要,我宁愿将函数参数名称更改为带有后缀下划线。

Cocos2D Box2D模板的唯一区别在于,在指定标志后调用SetDebugDraw。这应该没有什么区别,但您可能希望完全像Box2D模板项目那样尝试:

    world = new b2World(gravity, doSleep);

    world->SetContinuousPhysics(true);

    // Debug Draw functions
    m_debugDraw = new GLESDebugDraw( PTM_RATIO );
    world->SetDebugDraw(m_debugDraw);

    uint32 flags = 0;
    flags += b2DebugDraw::e_shapeBit;
    m_debugDraw->SetFlags(flags);       
更新:我发现了另一个不同点。在draw方法中,调用[super draw]。Box2D模板项目不会这样做。再说一次,这不会有什么区别,但你永远不会知道。如果它仍然崩溃,我建议将您的项目与Box2D模板进行比较,以发现任何其他(可能细微的)差异。除了排除所有编译器故障的常规建议之外:清理所有目标、删除构建文件夹、重新启动Xcode(和整个计算机)、从模拟器/设备中删除应用程序(以及重新启动设备)

PS:我看到您在使用下划线前缀,就像在:\u world中一样。苹果公司建议不要这样做,因为下划线前缀是为它们自己的内部使用而保留的,还有一些C风格的函数。在ObjC中,如果必须根据某种方案命名成员变量,则更喜欢使用下划线后缀,如world->SetDebugDraw()


就我个人而言,我试图完全避免使用这些world、world或m_world命名方案,除了传统的和相互冲突的函数参数名称之外,这没有任何意义。如有必要,我宁愿将函数参数名称更改为带后缀的下划线。

好的,我编辑了代码。不再调用[super draw],我在分配标志之前调用SetDebugDraw。此外,我将我的项目与Box2d模板进行了比较,发现了一些差异,但问题仍然存在。我尝试用不同的名称重命名我的变量(例如myWorld,只是为了尝试),但没有任何改变。还在调查…好的,我编辑了我的代码。不再调用[super draw],我在分配标志之前调用SetDebugDraw。此外,我将我的项目与Box2d模板进行了比较,发现了一些差异,但问题仍然存在。我尝试用不同的名称重命名我的变量(例如myWorld,只是为了尝试),但没有任何改变。仍在调查。。。
    world = new b2World(gravity, doSleep);

    world->SetContinuousPhysics(true);

    // Debug Draw functions
    m_debugDraw = new GLESDebugDraw( PTM_RATIO );
    world->SetDebugDraw(m_debugDraw);

    uint32 flags = 0;
    flags += b2DebugDraw::e_shapeBit;
    m_debugDraw->SetFlags(flags);