2014-09-23 109 views
0

我很抱歉发布此信息,我知道它之前已经被询问过,但我已经尝试了以前的解决方案,但似乎没有任何工作。联系人丢失

我遇到的问题是我同时使用了didBeginContact和didEndContact来确定我的精灵是否触及地面。

这个精灵有一个名为的BOOL,它接地,它决定了这个状态。基本上我想知道它是否在地面上触摸平台时。我得到的结果是与平台建立联系,然后立即失去联系之间的一场持续战斗,这非常令人沮丧。这是我到目前为止有:

-(Player *)createPlayer 
{ 
    ... 
    sprite.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.size]; 
    sprite.physicsBody.mass = 0.02; 
    sprite.physicsBody.restitution = 0; 
    sprite.physicsBody.categoryBitMask = playerCategory; 
    sprite.physicsBody.collisionBitMask = platformCategory; 
    sprite.physicsBody.contactTestBitMask = platformCategory; 
    sprite.physicsBody.usesPreciseCollisionDetection = YES; 
    return sprite; 
} 
-(SKSpriteNode *)createPlatform 
{ 
    SKSpriteNode *platform = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(100,25)]; 
    platform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.size]; 
    platform.dynamic = NO; 
    platform.physicsBody.categoryBitMask = platformCategory; 
    platform.physicsBody.collisionBitMask = playerCategory; 
    platform.physicsBody.contactTestBitMask = playerCategory; 
    return platform; 
} 

-(void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    SKPhysicsBody *firstBody, *secondBody; 

    if(contact.bodyA.categoryBitMask < contact.B.categoryBitMask) 
    { 
     firstBody = contact.bodyA; 
     secondBody = contact.bodyB; 
    } 
    else 
    { 
     firstBody = contact.bodyB; 
     secondBody = contact.bodyA; 
    } 
    if((firstBody.categoryBitMask & playerCategory) != 0) 
    { 
     Player *player = firstBody.node; 
     if((secondBody.categoyBitMask & platformCategoy) != 0) 
     { 
      NSLog(@"Connection Established"); 
      player.grounded = YES; 
     } 
    } 
} 

-(void)didEndContact:(SKPhysicsContact *)contact 
{ 
    SKPhysicsBody *firstBody, *secondBody; 

    if(contact.bodyA.categoryBitMask < contact.B.categoryBitMask) 
    { 
     firstBody = contact.bodyA; 
     secondBody = contact.bodyB; 
    } 
    else 
    { 
     firstBody = contact.bodyB; 
     secondBody = contact.bodyA; 
    } 
    if((firstBody.categoryBitMask & playerCategory) != 0) 
    { 
     Player *player = firstBody.node; 
     if((secondBody.categoyBitMask & platformCategoy) != 0) 
     { 
      NSLog(@"Connection Lost"); 
      player.grounded = NO; 
     } 
    } 
} 

基本上这样做的最终结果是这样的,当我检查日志:

  • 联系成立
  • 联系迷失
  • 联系方式建立
  • 联系人丢失

非常感谢您提供的任何帮助,我完全难住。

+0

也许让你的精灵重得多。另外,请尝试关闭精确的碰撞检测。 – meisenman 2014-09-24 03:34:22

+0

非常感谢您的回复。我只是尝试调整精灵的重量,但似乎没有任何工作。即使其恢复原状设置为0,这个精灵本身也会弹跳,这就是为什么我一直失去联系,有没有人知道如何确保物体在碰到平台时不会反弹? – Ryoku 2014-09-24 09:00:37

+0

当联系人开始将播放器的速度设置为(0,0)时,您可以尝试在didBeginContact [[player physicsBody] setVelocity:CGVectorMake(0,0.0f)]; 并更换平台顶部的播放器。全部在didBeginContact – Aaleks 2014-09-24 14:50:36

回答

-1
-(void)didEndContact:(SKPhysicsContact *)contact 
{ 

    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); 

    if (collision != (playerCategory | platformCategory)) { 
     SKNode *node = contact.bodyA.node; 
     if (contact.bodyB.categoryBitMask == platformCategory) { 
      node = contact.bodyB.node; 
     } 
NSLog(@"Connection Lost"); 
      player.grounded = NO; 
    } 
+3

解释你在这段代码中改变了什么,以及这将如何解决这个问题。只是在没有解释的情况下发布代码是没有用的 – LearnCocos2D 2014-09-23 19:54:45

+0

再次感谢你,我刚刚发现了上面的代码问题。我的代码现在更短了,我只需要将if(collision!=(playerCategory | platformCategory))'改为'if(collision ==(playerCategory | platformCategory))'来调整。说到这里,我仍然遇到和以前一样的问题,NSLog打印的内容是:**连接建立,连接丢失,连接建立,连接丢失**这当然意味着最终玩家没有接地。确认当我在帧更新过程中打电话给日志时,将其打印出来。 – Ryoku 2014-09-24 00:28:39