使用Cocos2d&获得EXC_BAD_ACCESS Box2d在尝试使用DebugDraw时

时间:2011-03-03 21:42:49

标签: cocos2d-iphone exc-bad-access box2d box2d-iphone


这件事让我发疯了! 我正在尝试使用Cocos2d(0.99.5)和Box2D,我已经成功创建了一个带有图层和两个实体(实际上是几个弹跳球)的场景。现在我想启用DebugDrawing,以便我可以准确地看到发生了什么。考虑一切都适用于DebugDrawing禁用。

谈到代码,在我的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);
}

问题是当程序到达行

_world->DrawDebugData();

抛出EXC_BAD_ACCESS异常。调试器在这里显示错误:

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)
    {
    [...]

主窗口显示的错误是:“线程1:编程接收信号:'EXC_BAD_ACCESS'”。这是我得到的输出:

  

GNU gdb 6.3.50-20050815(Apple版gdb-1515)(2011年1月8日星期六00:31:48 UTC)   版权所有2004 Free Software Foundation,Inc。

     

GDB是免费软件,由GNU通用公共许可证涵盖,您就是   欢迎在某些条件下更改和/或分发它的副本。

     

输入“显示复制”以查看条件。

     

GDB绝对没有保修。输入“show warranty”了解详情。

     

此GDB配置为“--host = x86_64-apple-darwin --target = arm-apple-darwin”.tty / dev / ttys000   target remote-mobile /tmp/.XcodeGDBRemote-191-40

     

切换到remote-macosx协议

     

mem 0x1000 0x3fffffff cache

     

mem 0x40000000 0xffffffff none

     

mem 0x00000000 0x0fff none

     

[切换到主题11779]

     

[切换到主题11779]

     

sharedlibrary apply-load-rules all

     

2011-03-03 22:10:3​​6.477 MyApp [2738:707] cocos2d:cocos2d v0.99.5

     

2011-03-03 22:10:3​​6.529 MyApp [2738:707] cocos2d:使用导演类型:CCDirectorDisplayLink

     

2011-03-03 22:10:3​​6.936 MyApp [2738:707] cocos2d:操作系统版本:4.3(0x04030000)

     

2011-03-03 22:10:3​​6.943 MyApp [2738:707] cocos2d:GL_VENDOR:Imagination Technologies

     

2011-03-03 22:10:3​​6.949 MyApp [2738:707] cocos2d:GL_RENDERER:PowerVR SGX 535

     

2011-03-03 22:10:3​​6.956 MyApp [2738:707] cocos2d:GL_VERSION:OpenGL ES-CM 1.1 IMGSGX535-58.1

     

2011-03-03 22:10:3​​6.966 MyApp [2738:707] cocos2d:GL_MAX_TEXTURE_SIZE:2048

     

2011-03-03 22:10:3​​6.973 MyApp [2738:707] cocos2d:GL_MAX_MODELVIEW_STACK_DEPTH:16

     

2011-03-03 22:10:3​​6.979 MyApp [2738:707] cocos2d:GL_MAX_SAMPLES:4

     

2011-03-03 22:10:3​​7.020 MyApp [2738:707] cocos2d:GL支持PVRTC:是

     

2011-03-03 22:10:3​​7.026 MyApp [2738:707] cocos2d:GL支持BGRA8888纹理:是

     

2011-03-03 22:10:3​​7.033 MyApp [2738:707] cocos2d:GL支持NPOT纹理:是

     

2011-03-03 22:10:3​​7.039 MyApp [2738:707] cocos2d:GL支持discard_framebuffer:是

     

2011-03-03 22:10:3​​7.060 MyApp [2738:707] cocos2d:使用NPOT支持编译:否

     

2011-03-03 22:10:3​​7.066 MyApp [2738:707] cocos2d:在TextureAtlas中使用VBO支持编译:是

     

2011-03-03 22:10:3​​7.072 MyApp [2738:707] cocos2d:在CCNode中使用仿射矩阵转换编译:是

     

2011-03-03 22:10:3​​7.078 MyApp [2738:707] cocos2d:使用性能分析支持编译:否

     

2011-03-03 22:10:44.375 MyApp [2738:707] cocos2d:帧间隔:1

     

2011-03-03 22:10:44.420 MyApp [2738:707] cocos2d:表面尺寸:320x480

     

2011-03-03 22:10:44.654 MyApp [2738:707]收到内存警告。级= 1

     

2011-03-03 22:10:44.696 MyApp [2738:707] cocos2d:deallocing

"MenuBackGround.png",

"Star.png",

"fps_images.png"
     

)GT;

     

当前语言:auto;目前是c ++

     

(gdb)

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

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

谢谢大家,
Daniele Salatti

2 个答案:

答案 0 :(得分:2)

与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);       

更新:我发现了另一个区别。在你的绘制方法中,你正在调用[超级绘图]。 Box2D模板项目不这样做。再说一次,它应该没有任何区别,但你永远不会知道。如果它仍然崩溃我建议将您的项目与Box2D模板进行比较,以找到任何其他(可能是微妙的)差异。除了排除所有编译器打嗝的通常建议:清除所有目标,删除构建文件夹,重新启动Xcode(和整个机器),从模拟器/设备中删除应用程序(以及重新启动设备)。

PS:我看到你正在使用下划线前缀,如:_world。 Apple建议不要这样做,因为下划线前缀是为自己内部使用而保留的,以及一些C样式函数。在ObjC中,如果必须根据某种方案命名成员变量,则更喜欢使用下划线后缀,如世界_-&gt; SetDebugDraw()

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

答案 1 :(得分:1)

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