Ios 失去联系

Ios 失去联系,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,我很抱歉发布这篇文章,我知道以前有人问过,但我已经尝试了以前的解决方案,似乎没有任何效果 我遇到的问题是,我使用didBeginContact和didbendcontact来确定我的精灵是否触地 精灵有一个名为grounded的布尔值,用于确定此状态。基本上我想知道当它接触平台时,它是否在地面上。我得到的结果是与平台建立联系,然后立即失去联系,这是一场持续的战斗,非常令人沮丧。以下是我目前掌握的情况: -(Player *)createPlayer { ... sprite.ph

我很抱歉发布这篇文章,我知道以前有人问过,但我已经尝试了以前的解决方案,似乎没有任何效果

我遇到的问题是,我使用didBeginContact和didbendcontact来确定我的精灵是否触地

精灵有一个名为grounded的布尔值,用于确定此状态。基本上我想知道当它接触平台时,它是否在地面上。我得到的结果是与平台建立联系,然后立即失去联系,这是一场持续的战斗,非常令人沮丧。以下是我目前掌握的情况:

-(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;
        }
    }
}
-(Player*)创建播放器
{
...
sprite.physicsBody=[SKPhysicsBody with rectangleofsize:player.size];
sprite.physicsBody.mass=0.02;
sprite.physicsBody.restoration=0;
sprite.physicsBody.categoryBitMask=玩家类别;
sprite.physicsBody.collisionBitMask=平台类别;
sprite.physicsBody.contactTestBitMask=平台类别;
sprite.physicsBody.usesprecisecollisondetection=YES;
返回精灵;
}
-(SKSpriteNode*)创建平台
{
SKSpriteNode*平台=[[SKSpriteNode alloc]initWithColor:[SKColor grayColor]大小:CGSizeMake(100,25)];
platform.physicsBody=[SKPhysicsBody-bodyWithRectangleOfSize:player.size];
platform.dynamic=否;
platform.physicsBody.categoryBitMask=平台类别;
platform.physicsBody.collisionBitMask=播放器类别;
platform.physicsBody.contactTestBitMask=播放器类别;
返回平台;
}
-(无效)didBeginContact:(SKPhysicsContact*)联系人
{
SKPhysicsBody*第一个Body,*第二个Body;
if(contact.bodyA.categoryBitMask
基本上,当我检查日志时,最终结果如下所示:

  • 已建立联系人
  • 失去联系
  • 已建立联系人
  • 失去联系

提前感谢您提供的任何帮助,我完全被难住了。

请解释您在此代码中更改了什么,以及这将如何解决问题。仅仅发布代码而不做解释是没有帮助的。再次感谢你,我刚刚发现了上面代码的问题。我的代码现在短了很多,唯一需要调整的是将
if(collision!=(playerCategory | platformCategory))
更改为
if(collision==(playerCategory | platformCategory))
。尽管如此,我仍然面临着与以前相同的问题,NSLog打印:连接已建立、连接已丢失、连接已建立、连接已丢失,这当然意味着球员最终没有被停飞。当我在帧更新期间调用日志并打印出来时确认。可能会使你的精灵更重。另外,请尝试关闭精确碰撞检测。非常感谢您的回复。我只是试着调整雪碧的重量,但似乎没有任何效果。每当精灵撞击平台时,它本身就会反弹,即使它的恢复设置为0,这就是为什么我一直失去联系,有人知道如何确保物体在撞击平台时不会反弹吗?你可以尝试在didBeginContact中,当接触开始将玩家的速度设置为(0,0)时[[player physicsBody]设置速度:CGVectorMake(0,0.0f)];并在平台顶部替换播放器。didBeginContact中的所有人以前都没有看到这一点。我会将平台恢复设置为0。我尝试在didBeginContact上手动将速度设置为
CGVectorMake(player.physicsBody.velocity.dx,0)
但它仍然反弹。我认为它可能试图纠正重叠问题,所以我尝试将位置设置为
CGPositionMake(player.position.x,platform.position.y+1)
但即使这样也不起作用。我很高兴地说,虽然最终将平台恢复设置为0起作用。尽管我不完全确定原因,但据我所知,这只会影响平台本身的弹性。再次非常感谢您的帮助。
-(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;
    }