for_2012 2013-05-31 02:15 采纳率: 0%
浏览 2304
已采纳

cocos2D的Box2d项目中弹球问题

做到第二个弹球时,弹球没有弹起来,穿过地板了。不知道怎么解决?第二个弹球和第一个弹球完全一样啊。请好心人帮忙看看。

代码:

#import "HelloWorldLayer.h"
@implementation HelloWorldLayer
+ (id)scene {
    CCScene *scene = [CCScene node];
    HelloWorldLayer *layer = [HelloWorldLayer node];
    [scene addChild:layer];
    return scene;
}
- (id)init {

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

        CGSize winSize = [CCDirector sharedDirector].winSize;

        // Create sprite and add it to the layer
        _ball = [CCSprite spriteWithFile:@"ball.png" rect:CGRectMake(0, 0, 52, 52)];
        _ball.position = ccp(100, 300);
        [self addChild:_ball];

        _ball2 = [CCSprite spriteWithFile:@"ball.png" rect:CGRectMake(0, 0, 52, 52)];
        _ball2.position = ccp(300, 300);
        [self addChild:_ball2];

        // Create a world
        b2Vec2 gravity = b2Vec2(0.0f, -8.0f);
        _world = new b2World(gravity);
        // Create BALL 1 body and shape
        b2BodyDef ballBodyDef;
        ballBodyDef.type = b2_dynamicBody;
        ballBodyDef.position.Set(100/PTM_RATIO, 300/PTM_RATIO);
        ballBodyDef.userData = _ball;
        _body = _world->CreateBody(&ballBodyDef);

        b2CircleShape circle;
        circle.m_radius = 26.0/PTM_RATIO;

        b2FixtureDef ballShapeDef;
        ballShapeDef.shape = &circle;
        ballShapeDef.density = 2.0f;
        ballShapeDef.friction = 0.1f;
        ballShapeDef.restitution = 0.4f;
        _body->CreateFixture(&ballShapeDef);
        [self schedule:@selector(tick:)];
        // Create BALL 2 body and shape
        b2BodyDef ballBodyDef2;
        ballBodyDef2.type = b2_dynamicBody;
        ballBodyDef2.position.Set(300/PTM_RATIO, 300/PTM_RATIO);
        ballBodyDef2.userData = _ball2;
        _body2 = _world->CreateBody(&ballBodyDef2);

        b2CircleShape circle2;
        circle2.m_radius = 26.0/PTM_RATIO;

        b2FixtureDef ballShapeDef2;
        ballShapeDef2.shape = &circle2;
        ballShapeDef2.density = 2.0f;
        ballShapeDef2.friction = 0.1f;
        ballShapeDef2.restitution = 0.4f;
        _body->CreateFixture(&ballShapeDef2);

        // Create edges around the entire screen
        b2BodyDef groundBodyDef;
        groundBodyDef.position.Set(0,0);

        b2Body *groundBody = _world->CreateBody(&groundBodyDef);
        b2EdgeShape groundEdge;
        b2FixtureDef boxShapeDef;
        boxShapeDef.shape = &groundEdge;

        //WALL DEFINITIONS
        //floor wall
        groundEdge.Set(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0));
        groundBody->CreateFixture(&boxShapeDef);
        //roof wall
        groundEdge.Set(b2Vec2(0,0), b2Vec2(0,winSize.height/PTM_RATIO));
        groundBody->CreateFixture(&boxShapeDef);
        //left wall
        groundEdge.Set(b2Vec2(0, winSize.height/PTM_RATIO),
                       b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO));
        groundBody->CreateFixture(&boxShapeDef);
        //right wall
        groundEdge.Set(b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO),
                       b2Vec2(winSize.width/PTM_RATIO, 0));
        groundBody->CreateFixture(&boxShapeDef);

         //Do the kick every 5 seconds
         //[self schedule:@selector(kick) interval:5.0];
        [self setTouchEnabled:YES];
    }
    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();
            ballData.position = ccp(b->GetPosition().x * PTM_RATIO,
                                    b->GetPosition().y * PTM_RATIO);
            ballData.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
        }
    }
}

- (void)dealloc {
    delete _world;
    _body = NULL;
    _world = NULL;
    [super dealloc];
}
@end
  • 写回答

2条回答

  • vikeyToy 2013-05-31 03:37
    关注

    将这行

    _body->CreateFixture(&ballShapeDef2);
    

    改为这行:

    _body2->CreateFixture(&ballShapeDef2);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?