0


このことは私を夢中にさせています!
私は Cocos2d (0.99.5) と Box2D を試しており、レイヤーと 2 つのボディ (実際には跳ねるボール) を持つシーンを作成することに成功しました。ここで、何が起こっているかを正確に確認できるように、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) (Sat Jan 8 00:31:48 UTC 2011) Copyright 2004 Free Software Foundation, Inc.

GDB は、GNU 一般公衆利用許諾契約書の対象となるフリー ソフトウェアであり、特定の条件の下で変更および/またはコピーの配布を歓迎します。

条件を表示するには、「showcopy」と入力します。

GDB の保証は一切ありません。詳細については、「保証を表示」と入力してください。

この GDB は、「--host=x86_64-apple-darwin --target=arm-apple-darwin」.tty /dev/ttys000 ターゲット remote-mobile /tmp/.XcodeGDBRemote-191-40 として構成されました。

リモート macosx プロトコルへの切り替え

メモリ 0x1000 0x3fffffff キャッシュ

メモリ 0x40000000 0xffffffff なし

メモリ 0x00000000 0x0fff なし

[スレッド 11779 に切り替えます]

[スレッド 11779 に切り替えます]

共有ライブラリの適用-ロード-ルールすべて

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: OS バージョン: 4.3 (0x04030000)

2011-03-03 22:10:36.943 MyApp[2738:707] cocos2d: GL_VENDOR: イマジネーション テクノロジー

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: 割り当て解除

"MenuBackGround.png",

"Star.png",

"fps_images.png"

)>

現在の言語: auto; 現在C++

(gdb)

グーグルを試してみましたが、このエラーについて多くのことがわかりましたが、まだ解決できません。シミュレーターと iPhone の両方で発生します。別の議論の誰か (申し訳ありませんが、リンクを失いました) は、それがコンパイラまたは最適化に関連している可能性があると指摘したため、LLVM から GCC、LLVM-GCC に切り替えてさまざまなレベルで最適化を設定するさまざまな組み合わせを試しましたが、成功しませんでした。

誰かが私を正しい方向に向けることができますか? さらに情報が必要な場合はお知らせください。

みなさん、ありがとう、
ダニエレ・サラッティ

4

2 に答える 2

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

更新:別の違いを見つけました。draw メソッドで [super draw] を呼び出しています。Box2D テンプレート プロジェクトはそれを行いません。繰り返しますが、違いはありませんが、わかりません。それでもクラッシュする場合は、プロジェクトを Box2D テンプレートと比較して、他の (おそらく微妙な) 違いを見つけることをお勧めします。すべてのコンパイラの問題を除外するという通常の推奨事項に加えて、すべてのターゲットのクリーニング、ビルド フォルダーの削除、Xcode (およびマシン全体) の再起動、シミュレーター/デバイスからのアプリの削除 (およびデバイスの再起動) を行います。

PS: _world のようにアンダースコア プレフィックスを使用しているようです。アンダースコアの接頭辞は、一部の C スタイル関数と同様に、独自の内部使用のために予約されているため、Apple はこれを行わないことをお勧めします。ObjC では、何らかのスキームに従ってメンバー変数に名前を付ける必要がある場合は、world_->SetDebugDraw() のようにアンダースコアのサフィックスを使用することをお勧めします

個人的には、これらのワールド、ワールド、または m_world の命名スキームを完全に回避しようとしていますが、伝統と競合する関数パラメーター名以外には意味がありません。必要に応じて、関数のパラメーター名を変更して、末尾にアンダースコアを付けます。

于 2011-03-04T08:58:58.007 に答える
1

デバッガーで変数worldと変数を見てください。debugDrawそれらの1つが破損しているように見えます

于 2011-03-04T08:34:36.897 に答える