球与球员接触,但他们甚至没有接近

时间:2014-07-20 16:40:09

标签: sprite-kit collision

我在这里缺少什么?每次碰到框架边框或甚至地面物体(如果添加)时,日志会说“球击中球员”。

(我是Sprite Kit的新手,这是我第一次使用碰撞。这让我很疯狂:D)

#import "MyScene.h"

static const int starHitCategory = 1;
static const int playerHitCategory = 2;
static const int ballHitCategory = 3;

@interface MyScene ()

@end

@implementation MyScene{

    SKSpriteNode *player;
    SKSpriteNode *redball;
    SKSpriteNode *star;
}

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        /* Setup your scene here */
        self.physicsWorld.contactDelegate = self;

        self.physicsWorld.gravity = CGVectorMake(0.0f, -3.0f);
        SKPhysicsBody* borderBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
        self.physicsBody = borderBody;
        self.physicsBody.friction = 0.0f;

        //initalizing player node
        player = [SKSpriteNode spriteNodeWithImageNamed:@"player.png"];

        player.physicsBody.categoryBitMask = playerHitCategory;
        player.physicsBody.contactTestBitMask = playerHitCategory;
        player.physicsBody.collisionBitMask =  playerHitCategory;

        player.position = CGPointMake(75,101);
        player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.size];
        player.physicsBody.friction = 0.0f;
        player.physicsBody.linearDamping = 0.5f;
        player.physicsBody.mass = 10;
        player.physicsBody.dynamic = YES;
        player.physicsBody.usesPreciseCollisionDetection = YES;
        player.physicsBody.allowsRotation = NO;
        player.name = @"player";
        [self addChild:player];

        //initalizing Redball node
        redball = [SKSpriteNode spriteNodeWithImageNamed:@"redbdall.png"];
        redball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:redball.frame.size.width/2];
        redball.position = CGPointMake(290,200);
        redball.physicsBody.usesPreciseCollisionDetection = YES;
        redball.physicsBody.categoryBitMask = ballHitCategory;
        redball.physicsBody.contactTestBitMask = ballHitCategory;
        redball.physicsBody.collisionBitMask =  ballHitCategory;
        redball.physicsBody.friction = 2.0f;
        redball.physicsBody.restitution = 1.0f;
        redball.physicsBody.linearDamping = 0.0f;
        redball.physicsBody.allowsRotation = NO;
        [self addChild:redball];

    //initalizing Star node
    star = [SKSpriteNode spriteNodeWithImageNamed:@"star.png"];
    star.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:star.size];
    star.physicsBody.categoryBitMask = starHitCategory;
    star.physicsBody.contactTestBitMask = starHitCategory;
    star.physicsBody.collisionBitMask =  starHitCategory;
    star.position = CGPointMake(205,125);
    [self addChild:star];

    }
    return self;
}


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

    firstBody = contact.bodyA;
    secondBody = contact.bodyB;


    if(firstBody.categoryBitMask == playerHitCategory || secondBody.categoryBitMask == ballHitCategory)
    {
        NSLog(@"ball hits player");
    }
}

@end

提前致谢

1 个答案:

答案 0 :(得分:0)

如果玩家/球对象将与可能碰撞的任何对象发生碰撞,则会满足您的if语句,因为您还没有检查其他对象是否属于所需类别。

如果声明更严格,你应该改变你,因为你也不知道这两个对象是球还是球员或场地:

    if((firstBody.categoryBitMask == playerHitCategory && secondBody.categoryBitMask == ballHitCategory) || 
       (firstBody.categoryBitMask == ballHitCategory && secondBody.categoryBitMask == playerHitCategory))
        {
            NSLog(@"ball hits player");
        }

这样你就可以分开对象之间的碰撞。对你想要检测碰撞的其他物体做同样的事情。

请注意,您还要为每个物理主体对象设置错误的位掩码。阅读here 寻找部分:"碰撞和接触示例:太空火箭"

了解每个掩码属性用于正确检测冲突非常重要。 (否则你确实可以坚持下去;))