这件事让我发疯了!
我正在尝试使用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:36.477 MyApp [2738:707] cocos2d:cocos2d v0.99.5
2011-03-03 22:10:36.529 MyApp [2738:707] cocos2d:使用导演类型:CCDirectorDisplayLink
2011-03-03 22:10:36.936 MyApp [2738:707] cocos2d:操作系统版本:4.3(0x04030000)
2011-03-03 22:10:36.943 MyApp [2738:707] cocos2d:GL_VENDOR:Imagination Technologies
2011-03-03 22:10:36.949 MyApp [2738:707] cocos2d:GL_RENDERER:PowerVR SGX 535
2011-03-03 22:10:36.956 MyApp [2738:707] cocos2d:GL_VERSION:OpenGL ES-CM 1.1 IMGSGX535-58.1
2011-03-03 22:10:36.966 MyApp [2738:707] cocos2d:GL_MAX_TEXTURE_SIZE:2048
2011-03-03 22:10:36.973 MyApp [2738:707] cocos2d:GL_MAX_MODELVIEW_STACK_DEPTH:16
2011-03-03 22:10:36.979 MyApp [2738:707] cocos2d:GL_MAX_SAMPLES:4
2011-03-03 22:10:37.020 MyApp [2738:707] cocos2d:GL支持PVRTC:是
2011-03-03 22:10:37.026 MyApp [2738:707] cocos2d:GL支持BGRA8888纹理:是
2011-03-03 22:10:37.033 MyApp [2738:707] cocos2d:GL支持NPOT纹理:是
2011-03-03 22:10:37.039 MyApp [2738:707] cocos2d:GL支持discard_framebuffer:是
2011-03-03 22:10:37.060 MyApp [2738:707] cocos2d:使用NPOT支持编译:否
2011-03-03 22:10:37.066 MyApp [2738:707] cocos2d:在TextureAtlas中使用VBO支持编译:是
2011-03-03 22:10:37.072 MyApp [2738:707] cocos2d:在CCNode中使用仿射矩阵转换编译:是
2011-03-03 22:10:37.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
答案 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)
使用调试器查看您的world
和debugDraw
变量。看起来其中一个已损坏