没有检测SpriteKit中边界框架和SKNode之间的碰撞

时间:2017-02-08 04:30:38

标签: ios objective-c sprite-kit

这是我GameScene中的代码。我有一个简单的精灵,它在重力和屏幕边缘以及粒子发射器的反弹下跌落。我所需要的是我应该能够检测SKNode和物理体之间的碰撞,即框架。

使用的代码

#import "GameScene.h"
@interface GameScene () <SKPhysicsContactDelegate>
@property (strong) UITouch *rightTouch;
@property (strong) UITouch *leftTouch;
@property (strong) SKNode *spinnyNode;
@property (assign, nonatomic) int count;
@end
@implementation GameScene {
}
    static const uint32_t birdCategory = 1 << 0;
    static const uint32_t worldCategory = 1 << 1;
- (void)didMoveToView:(SKView *)view {
    self.backgroundColor = [UIColor colorWithRed:134/255.0 green:50/255.0 blue:148/255.0 alpha:1.0];
    self.scaleMode = SKSceneScaleModeAspectFit;
    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
    self.physicsBody.categoryBitMask = worldCategory;
    NSString *burstPath = [[NSBundle mainBundle] pathForResource:@"fire" ofType:@"sks"];
    SKEmitterNode *burstNode = [NSKeyedUnarchiver unarchiveObjectWithFile:burstPath];
    burstNode.position = CGPointMake(0, 0);
    [self addChild:burstNode];
    self.spinnyNode = [self childNodeWithName:@"ball"];
    self.spinnyNode.physicsBody.angularVelocity = 10.0;
    self.spinnyNode.hidden = YES;
    self.spinnyNode.physicsBody.categoryBitMask = birdCategory;
    self.spinnyNode.physicsBody.contactTestBitMask = 0x0;
//    self.spinnyNode = ball;
    SKNode *leftPaddle = [self childNodeWithName:@"bottom"];
    leftPaddle.physicsBody.angularVelocity = 10.0;
}
- (void)touchDownAtPoint:(CGPoint)pos {
    self.count = self.count+1;
    CGPoint p = pos;
    NSLog(@"/n %f %f %f %f", p.x, p.y, self.frame.size.height, self.frame.size.width);
    if (self.count == 1)
    {
        self.spinnyNode.position = p;
        self.spinnyNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:40];
        self.spinnyNode.physicsBody.velocity=CGVectorMake(203, 10);
        self.spinnyNode.hidden = NO;
        self.spinnyNode.physicsBody.restitution = 0.8;
        self.spinnyNode.physicsBody.linearDamping = 0.0;
        self.spinnyNode.physicsBody.angularDamping = 0.3;
        self.spinnyNode.physicsBody.friction = 0.1;
        self.spinnyNode.physicsBody.angularVelocity = -100.0;
    }
}
-(void)didBeginContact:(SKPhysicsContact *)contact
{
    NSLog(@"contact detected");
    NSString *nameA = contact.bodyA.node.name;
    NSString *nameB = contact.bodyB.node.name;
    SKPhysicsBody *firstBody;
    SKPhysicsBody *secondBody;   
    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        firstBody = contact.bodyA;
        secondBody = contact.bodyB;
    }
    else
    {
        firstBody = contact.bodyB;
        secondBody = contact.bodyA;
    }
    //Your first body is the block, secondbody is the player.
    //Implement relevant code here.

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *t in touches) {[self touchDownAtPoint:[t locationInNode:self]];
}
}
-(void)update:(CFTimeInterval)currentTime {
    // Called before each frame is rendered
}
@end

这是我第一次使用SpriteKit。所以请耐心等待,帮助我。

1 个答案:

答案 0 :(得分:1)

如果你想在触摸时获得didBeginContact的回调,你需要像这样设置联系位掩码:

self.spinnyNode.physicsBody.contactTestBitMask = worldCategory;

目前您将其设置为0x0,这意味着不向代表报告任何联系人。您还需要在场景中设置委托:

self.physicsWorld.contactDelegate = self;

<强>更新

您还需要输入以下行:

self.spinnyNode.physicsBody.contactTestBitMask = worldCategory;
self.spinnyNode.physicsBody.categoryBitMask = birdCategory;
之后中使用touchDownAtPoint方法创建物理实体:

self.spinnyNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:40];

否则在创建physicsBody时会重置它们。