Cocos2d iphone 如何在iphone的box2d中制作弹性体(触发器)并对其应用物理特性?

Cocos2d iphone 如何在iphone的box2d中制作弹性体(触发器)并对其应用物理特性?,cocos2d-iphone,box2d,coronasdk,game-physics,box2d-iphone,Cocos2d Iphone,Box2d,Coronasdk,Game Physics,Box2d Iphone,我想做一个扳机,这样用户可以拉伸扳机并给出方向,然后扳机击中球,球就会相应地移动 球的速度和方向将取决于触发器 我是box2d的新手 请检查我想要的链接 我不能触发,也不能在触发图像上应用物理。如何在触发体上应用物理学?以及球体将如何根据触发器移动?我实现了以下操作: HelloWorldLayer.h #import "cocos2d.h" #import "Box2D.h" #define PTM_RATIO 32.0 @interface HelloWorldLayer : CCLay

我想做一个扳机,这样用户可以拉伸扳机并给出方向,然后扳机击中球,球就会相应地移动

球的速度和方向将取决于触发器

我是box2d的新手

请检查我想要的链接


我不能触发,也不能在触发图像上应用物理。如何在触发体上应用物理学?以及球体将如何根据触发器移动?

我实现了以下操作:

HelloWorldLayer.h

#import "cocos2d.h"
#import "Box2D.h"
#define PTM_RATIO 32.0

@interface HelloWorldLayer : CCLayer {
    b2World *_world;
    b2Body *_body;
    CCSprite *_ball;
    CGPoint firstlocation;
    CGPoint lastlocation;
    b2Vec2 pre_velocity;

}

+ (id) scene;
- (void)kick;
@end
HelloWorldLayer.m

#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;
        _ball = [CCSprite spriteWithFile:@"ball.png" rect:CGRectMake(0, 0, 52, 52)];
        _ball.position = ccp(100, 100);
        [self addChild:_ball];

        //create world
        b2Vec2 gravity = b2Vec2(0.0f, -8.0f);
        _world = new b2World(gravity);

        // Create ball body and shape
        b2BodyDef ballBodyDef;
        ballBodyDef.type = b2_dynamicBody;
        ballBodyDef.position.Set(26/PTM_RATIO, 26/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 = 1.0f;
        ballShapeDef.friction = 0.2f;
        ballShapeDef.restitution = 0.8f;
        _body->CreateFixture(&ballShapeDef);

        //ground edge
        b2BodyDef groundBodyDef;
        groundBodyDef.position.Set(0,0);

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

        //wall definitions
        groundEdge.Set(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0));
        groundBody->CreateFixture(&boxShapeDef);
        groundEdge.Set(b2Vec2(0,0), b2Vec2(0,winSize.height/PTM_RATIO));
        groundBody->CreateFixture(&boxShapeDef);

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

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

        [self schedule:@selector(tick:)];
       // [self schedule:@selector(kick) interval:3.0];
        self.isTouchEnabled = YES;
        self.isAccelerometerEnabled = YES;
    }
    return self;
}
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{
    b2Vec2 gravity(acceleration.y * 30, -acceleration.x * 30);
    _world->SetGravity(gravity);
}
- (void)tick:(ccTime) dt {

    _world->Step(dt, 10, 1);
    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)kick {
    b2Vec2 force = b2Vec2(-30, 30);
    _body->ApplyLinearImpulse(force,_body->GetPosition());
}

- (void)ccTouchesBegan:(NSSet *)touch withEvent:(UIEvent *)event {
   /* b2Vec2 force = b2Vec2(-30, -30);
    _body->ApplyLinearImpulse(force, _body->GetPosition());*/
    UITouch *touchpoint = [touch anyObject];
    firstlocation = [touchpoint locationInView:[touchpoint view]];
    firstlocation = [[CCDirector sharedDirector] convertToGL:firstlocation];

}
-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touchpoint = [touches anyObject];
    lastlocation = [touchpoint locationInView:[touchpoint view]];
    lastlocation = [[CCDirector sharedDirector] convertToGL:lastlocation];
    //NSLog(@"start location %2f %2f",firstlocation.x,firstlocation.y);
    //NSLog(@"last location %2f %2f",lastlocation.x,lastlocation.y);
    GLfloat y = firstlocation.y - lastlocation.y;
    GLfloat x = firstlocation.x - lastlocation.x;

    GLfloat lengthOfFlick = sqrt(x*x + y*y);   
    NSLog(@"%2f",lengthOfFlick);
/*    GLfloat basAngle = atan2(-x, -y);
    GLfloat radians = (basAngle + (180/3.14));
    //GLfloat angle = 180 + radians;*/

    //GLfloat theta = atan2(y,x)* 180 / 3.14;

    //NSLog(@"theta: %2f",theta);
    float ratio = lengthOfFlick/90;
    NSLog(@"%f",ratio);
    if(ratio > 1){
        ratio = 1;
    }
    NSLog(@"%f",ratio);
    if(firstlocation.x > lastlocation.x){
        if(firstlocation.y > lastlocation.y){
            b2Vec2 force = b2Vec2((int)(45 * ratio),(int)(45 * ratio));

            _body->ApplyLinearImpulse(force, _body->GetPosition());
        }else{
            b2Vec2 force = b2Vec2((int)( -1 * 45 * ratio),  (int)(45 * ratio));
            _body->ApplyLinearImpulse(force, _body->GetPosition());
        }
    }else{
        if(firstlocation.y > lastlocation.y){

            b2Vec2 force = b2Vec2((int)( -1 * 45 * ratio),(int)(45 * ratio));
            _body->ApplyLinearImpulse(force, _body->GetPosition());
        }else{

            b2Vec2 force = b2Vec2((int)(-1* 45 * ratio),(int)(-1 * 45 * ratio));

            _body->ApplyLinearImpulse(force, _body->GetPosition());
        }
    }

}
-(void)dealloc{
    delete _world;
    _body = NULL;
    _world = NULL;
    [super dealloc];
}


@end
或者您可以从以下位置下载此代码:4shared.com/zip/PRv8c1Pz/BOX2D.html

#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;
        _ball = [CCSprite spriteWithFile:@"ball.png" rect:CGRectMake(0, 0, 52, 52)];
        _ball.position = ccp(100, 100);
        [self addChild:_ball];

        //create world
        b2Vec2 gravity = b2Vec2(0.0f, -8.0f);
        _world = new b2World(gravity);

        // Create ball body and shape
        b2BodyDef ballBodyDef;
        ballBodyDef.type = b2_dynamicBody;
        ballBodyDef.position.Set(26/PTM_RATIO, 26/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 = 1.0f;
        ballShapeDef.friction = 0.2f;
        ballShapeDef.restitution = 0.8f;
        _body->CreateFixture(&ballShapeDef);

        //ground edge
        b2BodyDef groundBodyDef;
        groundBodyDef.position.Set(0,0);

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

        //wall definitions
        groundEdge.Set(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0));
        groundBody->CreateFixture(&boxShapeDef);
        groundEdge.Set(b2Vec2(0,0), b2Vec2(0,winSize.height/PTM_RATIO));
        groundBody->CreateFixture(&boxShapeDef);

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

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

        [self schedule:@selector(tick:)];
       // [self schedule:@selector(kick) interval:3.0];
        self.isTouchEnabled = YES;
        self.isAccelerometerEnabled = YES;
    }
    return self;
}
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{
    b2Vec2 gravity(acceleration.y * 30, -acceleration.x * 30);
    _world->SetGravity(gravity);
}
- (void)tick:(ccTime) dt {

    _world->Step(dt, 10, 1);
    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)kick {
    b2Vec2 force = b2Vec2(-30, 30);
    _body->ApplyLinearImpulse(force,_body->GetPosition());
}

- (void)ccTouchesBegan:(NSSet *)touch withEvent:(UIEvent *)event {
   /* b2Vec2 force = b2Vec2(-30, -30);
    _body->ApplyLinearImpulse(force, _body->GetPosition());*/
    UITouch *touchpoint = [touch anyObject];
    firstlocation = [touchpoint locationInView:[touchpoint view]];
    firstlocation = [[CCDirector sharedDirector] convertToGL:firstlocation];

}
-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touchpoint = [touches anyObject];
    lastlocation = [touchpoint locationInView:[touchpoint view]];
    lastlocation = [[CCDirector sharedDirector] convertToGL:lastlocation];
    //NSLog(@"start location %2f %2f",firstlocation.x,firstlocation.y);
    //NSLog(@"last location %2f %2f",lastlocation.x,lastlocation.y);
    GLfloat y = firstlocation.y - lastlocation.y;
    GLfloat x = firstlocation.x - lastlocation.x;

    GLfloat lengthOfFlick = sqrt(x*x + y*y);   
    NSLog(@"%2f",lengthOfFlick);
/*    GLfloat basAngle = atan2(-x, -y);
    GLfloat radians = (basAngle + (180/3.14));
    //GLfloat angle = 180 + radians;*/

    //GLfloat theta = atan2(y,x)* 180 / 3.14;

    //NSLog(@"theta: %2f",theta);
    float ratio = lengthOfFlick/90;
    NSLog(@"%f",ratio);
    if(ratio > 1){
        ratio = 1;
    }
    NSLog(@"%f",ratio);
    if(firstlocation.x > lastlocation.x){
        if(firstlocation.y > lastlocation.y){
            b2Vec2 force = b2Vec2((int)(45 * ratio),(int)(45 * ratio));

            _body->ApplyLinearImpulse(force, _body->GetPosition());
        }else{
            b2Vec2 force = b2Vec2((int)( -1 * 45 * ratio),  (int)(45 * ratio));
            _body->ApplyLinearImpulse(force, _body->GetPosition());
        }
    }else{
        if(firstlocation.y > lastlocation.y){

            b2Vec2 force = b2Vec2((int)( -1 * 45 * ratio),(int)(45 * ratio));
            _body->ApplyLinearImpulse(force, _body->GetPosition());
        }else{

            b2Vec2 force = b2Vec2((int)(-1* 45 * ratio),(int)(-1 * 45 * ratio));

            _body->ApplyLinearImpulse(force, _body->GetPosition());
        }
    }

}
-(void)dealloc{
    delete _world;
    _body = NULL;
    _world = NULL;
    [super dealloc];
}


@end