Cocos2d iphone 移动雪碧身体的麻烦

Cocos2d iphone 移动雪碧身体的麻烦,cocos2d-iphone,Cocos2d Iphone,当我运行此代码时,应用程序崩溃 #import "HelloWorldLayer.h" CCSprite *background,*ball; CGSize size; #define PTM_RATIO 32 @implementation HelloWorldLayer -(id) init { if( (self=[super init])) { size=[[CCDirector sharedDirector]winSize]; backgro

当我运行此代码时,应用程序崩溃

#import "HelloWorldLayer.h"
CCSprite *background,*ball;
CGSize size;
#define PTM_RATIO 32
@implementation HelloWorldLayer

-(id) init
{
    if( (self=[super init])) {

        size=[[CCDirector sharedDirector]winSize];
        background=[CCSprite spriteWithFile:@"Terrain.png"];
        background.position=ccp(size.width/2, size.height/2);
        [self addChild:background];

        b2Vec2 gravity=b2Vec2(0.0f,-10.0f);
        world=new b2World(gravity);

        b2BodyDef groundDef;
        groundDef.position.Set(0,0);
        groundBody=world->CreateBody(&groundDef);
        b2EdgeShape groundEdge;
        b2FixtureDef groundBodyFixtureDef;
        groundBodyFixtureDef.shape=&groundEdge;

        groundEdge.Set(b2Vec2(0,0), b2Vec2(size.width/PTM_RATIO,0));
        groundBody->CreateFixture(&groundBodyFixtureDef);

        groundEdge.Set(b2Vec2(0,size.height/PTM_RATIO), b2Vec2(size.width/PTM_RATIO,size.height/PTM_RATIO));
        groundBody->CreateFixture(&groundBodyFixtureDef);

        groundEdge.Set(b2Vec2(size.width/PTM_RATIO,0), b2Vec2(size.width/PTM_RATIO,size.height/PTM_RATIO));
        groundBody->CreateFixture(&groundBodyFixtureDef);

        groundEdge.Set(b2Vec2(0,0), b2Vec2(0,size.height/PTM_RATIO));
        groundBody->CreateFixture(&groundBodyFixtureDef);

        ball=[CCSprite spriteWithFile:@"ball1.png"];
        ball.position=ccp(200, 300);
        [self addChild:ball];

        b2BodyDef ballBodyDef;
        ballBodyDef.type=b2_dynamicBody;
        ballBodyDef.position.Set(200/PTM_RATIO, 300/PTM_RATIO);
        ballBodyDef.userData=&ball;
        ballBodyDef.fixedRotation=true;
        ballbody=world->CreateBody(&ballBodyDef);
        b2CircleShape ballShape;
        ballShape.m_radius=ball.contentSize.width/PTM_RATIO/2;
        b2FixtureDef ballBodyFixture;
        ballBodyFixture.shape=&ballShape;
        ballBodyFixture.density=20.0f;
        ballBodyFixture.friction=0.0f;
        ballBodyFixture.restitution=1.0f;
        ballbody->CreateFixture(&ballBodyFixture);

         [self schedule:@selector(tick:)];

    }
    return self;
}

-(void)tick:(ccTime)dt
{
    world->Step(dt, 10, 10);
    for(b2Body *b=world->GetBodyList();b;b=b->GetNext())
    {
        if(b->GetUserData()!=NULL)
        {
            CCSprite *balldata=(CCSprite *)b->GetUserData();
            NSLog(@"Inside if");

            balldata.position=ccp(b->GetPosition().x*PTM_RATIO, b->GetPosition().y*PTM_RATIO); // When control comes on this line that time application crash
            ball1.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());

        }
    }
}

-(void) dealloc
{

    [super dealloc];
}   


@end
我知道这段代码是真的,我曾多次使用这段代码,但在我当前的应用程序中,这段代码停止调试,并给出类似这样的错误

-(void) update: (ccTime) dt
{
    if( elapsed == - 1)
        elapsed = 0;
    else
        elapsed += dt;
    if( elapsed >= interval ) {
        impMethod(target, selector, elapsed); // EXC_BAD_ACCESS
        elapsed = 0;
    }
}
此代码在CCTime类中。 在我的代码中,我没有使用更新方法,所以为什么会发生此错误???? 请帮助我。这是一个愚蠢的错误,但我不明白他们为什么来


当您尝试获取与您身体相关的用户数据时,感谢您:

CCSprite *balldata=(CCSprite *)b->GetUserData();
balldata在这里很可能为null,这会导致下一条语句中的崩溃

为什么为空?因为,在前面设置userdata时,您将&ball(这将获得指向指针的指针!)而不是ball(已经是指向所需CCSprite对象的指针)传递到主体定义。因此,只需将该赋值更改为:

ballBodyDef.userData=ball; //not &ball

我第二次需要你的帮助,你能告诉我身体在角度向前跳跃的代码或逻辑吗?我知道如何获取角度或设置角度,但不知道如何应用于逻辑。ThanksI会对身体施加一种冲动。我认为你最好开始一个新的问题,向其他用户开放。。