2014-04-09 107 views
0

我有一艘船附加物理机构。这艘船是静态物理机构。船从CCAnimateMoveTo移动从左到右。当我点击屏幕时,我的角色掉下来了。我很好地检测了碰撞。但是我想在碰撞后我的角色就​​会落在船上并继续前进。人物是动态的身体。链接样本视频:Sample videoCocos2d 3.0 + Chipmunk + CCAnimation:将动画物体移动到物体上。怎么样?

这里我创建了一个船:

- (void)createBoat 
{ 
    currentBoat = [CCSprite spriteWithImageNamed:@"Boat.png"]; 
    currentBoat.position = ccp(0 - currentBoat.boundingBox.size.width, winSize.height * 0.2); 
// currentBoat.physicsBody = [CCPhysicsBody bodyWithRect:(CGRect){0, 0, currentBoat.contentSize.width, currentBoat.contentSize.height * 0.5} cornerRadius:0]; 


    CGPoint shape[6]; 
    shape[0] = ccp(0, 30); 
    shape[1] = ccp(64, 10); 
    shape[2] = ccp(128, 30); 
    shape[3] = ccp(128, 0); 
    shape[4] = ccp(0, 0); 
    shape[5] = ccp(0, 30); 


    currentBoat.physicsBody = [CCPhysicsBody bodyWithPolylineFromPoints:shape count:6 cornerRadius:0 looped:NO]; 
    currentBoat.physicsBody.type = CCPhysicsBodyTypeStatic; 
    currentBoat.physicsBody.collisionGroup = @"BoatGroup"; 
    currentBoat.physicsBody.collisionType = @"BoatCollision"; 
    [physicsWorld addChild:currentBoat z:PHYSICS_Z+3]; 

    id actionMoveBoat = [[CCActionMoveTo alloc] initWithDuration:5.0f position:ccp(winSize.width + currentBoat.boundingBox.size.width, currentBoat.position.y)]; 
    id actionMethod = [CCActionCallFunc actionWithTarget:self selector:@selector(createBoat)]; 


    [currentBoat runAction:[CCActionSequence actions:actionMoveBoat, [[CCActionRemove alloc] init], actionMethod, nil]]; 
} 

角色创造:

- (void)createCharacter 
{ 
    if (needCharacter) 
    { 
     CCSprite *newCharacter = [CCSprite spriteWithImageNamed:@"Character.png"]; 
     newCharacter.opacity = 0; 
     newCharacter.position = ccp(winSize.width * 0.5, winSize.height * 0.76); 
     newCharacter.physicsBody = [CCPhysicsBody bodyWithRect:(CGRect){CGPointZero, newCharacter.contentSize} cornerRadius:0]; 
     newCharacter.physicsBody.affectedByGravity = NO; 
     newCharacter.physicsBody.allowsRotation = YES; 
     newCharacter.physicsBody.collisionGroup = @"playerGroup"; 
     newCharacter.physicsBody.collisionType = @"playerCollision"; 
     [physicsWorld addChild:newCharacter z:PHYSICS_Z+4]; 


     id actionFadeIn = [[CCActionFadeIn alloc] initWithDuration:0.5]; 
     [newCharacter runAction:actionFadeIn]; 


     [allCharacters addObject:newCharacter]; 


     needCharacter = false; 
     touchDone = false; 
    } 
} 

然后检测触摸和碰撞:

- (void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    CCNode *lastCharacter = [allCharacters lastObject]; 


    if (!touchDone) 
    { 
     [lastCharacter.physicsBody applyImpulse:ccp(0, 300)]; 
     lastCharacter.physicsBody.type = CCPhysicsBodyTypeDynamic; 
     lastCharacter.physicsBody.affectedByGravity = YES; 
     touchDone = true; 
    } 

} 

- (BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair playerCollision:(CCNode *)currentCharacterC BoatCollision:(CCNode *)currentBoatC { 


    currentCharacterC.physicsBody.collisionType = @"tmpCollision"; 



    CCLOG(@"score++"); 
    if ([allCharacters containsObject:currentCharacterC]) 
    { 
     score++; 
     [scores setString:[NSString stringWithFormat:@"%d", score]]; 
     [allCharacters removeAllObjects]; 


     if (lives != 0) 
     { 
      needCharacter = true; 
      [self createCharacter]; 
     } 
    } 


    CCLOG(@"allCharacters = %@", allCharacters); 


    return YES; 
} 

回答

2

好吧,我也面临同样的问题,试图增加摩擦/表面速度等,它并没有真正工作。最后必须以我自己的方式来解决它,每当玩家登陆任何身体时,你都会保持一个指向该身体的指针,如玩家对象的_bodyUnderFeet。 现在,在更新循环中,将_bodyUnderFeet的速度添加到玩家计算出的速度。看到使用的zeroVel_x

示例代码是在这里:

void Player::update(float dt) 
{ 
    float zeroVel_x = 0; 
    if(_bodyUnderFeet != NULL) 
    { 
     zeroVel_x = _bodyUnderFeet->v.x; 
    } 
    cpBody *bd = getCPBody(); 
    assert(bd); 
    //log("Body angle %f", bd->a); 
    //check forward backward or at rest 
    float accel = _accelGround; 
    if(_onGroundBoost < UP_BOOST) 
    { 
     accel = _accelAir; 
    } 
    if(_touchPressedB) 
    { 
     if(!isFlippedX()) 
     { 
      setFlippedX(true); 
     } 
     //cpBodySetVel(bd, cpv(cpBodyGetVel(bd).x - accel*0.25, 0)); 
     cpVect bdv = cpBodyGetVel(bd); 
     bdv.x = bdv.x - zeroVel_x; 
     if(bdv.x > 0) bdv.x = 0; 
     if(bdv.x > -_maxVelocity.x) 
      cpBodySetVel(bd, cpv(zeroVel_x + bdv.x - accel*0.25, bdv.y)); 
    } 
    else if(_touchPressedF) 
    { 
     if(isFlippedX()) 
     { 
      setFlippedX(false); 
     } 
     //cpBodySetVel(bd, cpv(cpBodyGetVel(bd).x + accel*0.25, 0)); 
     cpVect bdv = cpBodyGetVel(bd); 
     bdv.x = bdv.x - zeroVel_x; 
     if(bdv.x < 0) bdv.x = 0; 
     if(bdv.x < _maxVelocity.x) 
      cpBodySetVel(bd, cpv(zeroVel_x+bdv.x + accel*0.25, bdv.y)); 
    } 
    else 
    { 
     cpFloat bd_x = cpBodyGetVel(bd).x; 
     bd_x = bd_x - zeroVel_x; 
     if(bd_x>0) 
     { 
      if(bd_x > accel*0.25) 
      { 
       cpBodySetVel(bd, cpv(zeroVel_x+bd_x - accel*0.25, cpBodyGetVel(bd).y)); 
      } 
      else 
      { 
       cpBodySetVel(bd, cpv(zeroVel_x+0, cpBodyGetVel(bd).y)); 
      } 
     } 
     else if(bd_x < 0) 
     { 
      if(bd_x < accel*0.25) 
      { 
       cpBodySetVel(bd, cpv(zeroVel_x+bd_x + accel*0.25, cpBodyGetVel(bd).y)); 
      } 
      else 
      { 
       cpBodySetVel(bd, cpv(zeroVel_x+0, cpBodyGetVel(bd).y)); 
      } 
     } 
    } 

    //check jump 
    if(_touchPressedJ) 
    { 
     if(_onGroundBoost) 
     { 
      cpVect bdv = cpBodyGetVel(bd); 
      if(bdv.y < 0) bdv.y = 0; 
      if((bdv.y + _accelUp) < _maxVelocity.y) 
      { 
       cpBodySetVel(bd, cpv(bdv.x, bdv.y + _accelUp)); 
       --_onGroundBoost; 
      } 
      else 
      { 
       cpBodySetVel(bd, cpv(bdv.x, _maxVelocity.y)); 
       _onGroundBoost = 0; 
      } 
     } 
    } 

    //check shots 
    if(_touchPressedS) 
    { 
     if(!_bulletFired) 
     { 

     } 
    } 

    //check home 
    if(_touchPressedH) 
    { 

    } 

    boundRotation(bd); 
} 
+0

感谢@Nitin,与速度计算解决方案为我工作。 –

+0

嗨@Nitin,在这里查询,我们如何能够增加身体下落的速度,例如目前身体需要2秒才能倒下。无论如何,我想要在0.5秒内完成该行动。它是如何实现的? –

0

我认为, 你可以在他失败后增加人与船之间的摩擦我失望了并减少弹性。那么船可以'拿走'男人一起去...

只是一个把戏。