Игра вылетает, когда я пытаюсь использовать возможности b2Body - почему? - PullRequest
0 голосов
/ 15 мая 2011

Мое приложение падает, когда я пытаюсь использовать функции b2Body из моего NSObject класса.

Вот интерфейс моего класса:

#import <Foundation/Foundation.h>

#import "Box2D.h"
#import "GLES-Render.h"
#import "cocos2d.h"
#import "HelloWorldScene.h"


@interface Magnet : NSObject {
    b2Body* body;
}
@property (readwrite,assign) b2Body* body;
@end

И вотВот как я объявляю это в HelloWorldScene.h:

#import "cocos2d.h"
#import "Box2D.h"
#import "GLES-Render.h"
#import <UIKit/UIKit.h>
#import "Magnet.h"

@class Magnet;

@interface HelloWorld : CCLayer {
    b2World* world;
    GLESDebugDraw *m_debugDraw;
    Magnet *magnet;
}

А вот как я получаю доступ к b2Body в magnet, в HelloWorldScene.mm:

b2BodyDef bodyDef2;
bodyDef2.type = b2_staticBody;

bodyDef2.position.Set(300/PTM_RATIO, 150/PTM_RATIO);
bodyDef2.userData = sprite2;
magnet.body = world->CreateBody(&bodyDef2);

// Define another box shape for our dynamic body.
//b2PolygonShape dynamicBox;
b2CircleShape dynamicBox2;

//dynamicBox.SetAsBox(1.0f, 1.0f);//These are mid points for our 1m box
dynamicBox2.m_radius = 0.49;
// Define the dynamic body fixture.
b2FixtureDef fixtureDef2;

fixtureDef2.shape = &dynamicBox2;   
fixtureDef2.density = 1.3f;
fixtureDef2.friction = 1.0f;

magnet.body->CreateFixture(&fixtureDef2);

Есть лиесть проблемы с моим кодом?

Я получаю SIGABRT в исходных файлах Box2D, в функции CreateFixture().Что мне делать?

Извините за беспорядок, вот обратный след:

    (gdb) bt
    #0  0x0002f35c in b2Body::CreateFixture (this=0x0, def=0xbfffd360) at b2Body.cpp:141
    #1  0x00004f7e in -[HelloWorld loadLevel:] (self=0x5544770, _cmd=0xfbc7c, level=1) at HelloWorldScene.mm:255
    #2  0x0000573d in -[HelloWorld init] (self=0x5544770, _cmd=0x4ffd774) at HelloWorldScene.mm:140
    #3  0x0009d7b1 in +[CCNode node] (self=0x147100, _cmd=0xfc558) at CCNode.m:231
    #4  0x0000377d in +[HelloWorld scene] (self=0x147100, _cmd=0xfb61c) at HelloWorldScene.mm:39
    #5  0x000036d7 in -[MagnetSpillAppDelegate applicationDidFinishLaunching:] (self=0x680b9f0, _cmd=0xca40a3, application=0x5511370) at MagnetSpillAppDelegate.mm:96
    #6  0x008b1ce2 in -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] ()
    #7  0x008b3d88 in -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] ()
    #8  0x008be617 in -[UIApplication handleEvent:withNewEvent:] ()
    #9  0x008b6abf in -[UIApplication sendEvent:] ()
    #10 0x008bbf2e in _UIApplicationHandleEvent ()
    #11 0x029ca992 in PurpleEventCallback ()
    #12 0x0147d944 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
    #13 0x013ddcf7 in __CFRunLoopDoSource1 ()
    #14 0x013daf83 in __CFRunLoopRun ()
    #15 0x013da840 in CFRunLoopRunSpecific ()
    #16 0x013da761 in CFRunLoopRunInMode ()
    #17 0x008b37d2 in -[UIApplication _run] ()
    #18 0x008bfc93 in UIApplicationMain ()
    #19 0x00002cc4 in main (argc=1, argv=0xbffff058) at main.m:13

1 Ответ

1 голос
/ 16 мая 2011

Без сбоев трудно сказать, что конкретно идет не так.

Однако этот код изобилует возможностью сбоя.

  • вы используете структуры, которые находятся в стеке, а не выделены. Если область действия этого кода исчезнет до того, как вы закончите работу с этими структурами, это приведет к сбоям и неопределенному поведению.

  • вы не инициализируете все поля в этих структурах; остальные значения будут в неопределенном состоянии. Поскольку невозможно отличить неинициализированный float32 от инициализированного float32, это неизбежно приведет к проблемам.

  • вы устанавливаете структуры в стеке, которые имеют ссылки на другие структуры в стеке; другая форма первой точки, но должна быть вызвана, потому что это позволяет вдвое легко просачивать указатели в стек.

<Ч />

Строка 141 из b2Body :: CreateFixture () является утверждением:

    b2Assert(m_world->IsLocked() == false);

Ваш мир заблокирован? Похоже, так не должно быть.

...