2014-04-09 131 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

我認爲, 你可以在他失敗後增加人與船之間的摩擦我失望了並減少彈性。那麼船可以'拿走'男人一起去...

只是一個把戲。