didBeginContact:(SKPhysicsContact *)联系人未调用

Posted

技术标签:

【中文标题】didBeginContact:(SKPhysicsContact *)联系人未调用【英文标题】:didBeginContact:(SKPhysicsContact *)contact not invoked 【发布时间】:2013-10-30 07:11:22 【问题描述】:

我创建了SKScene 继承类。 问题在于物理体方法的接触

- (void)didBeginContact:(SKPhysicsContact *)contact 

没有被调用 解决方案可能很简单,但作为 sprite kit 的初学者,我对此感到困惑。

下面是代码

#import "MyScene.h"
@interface MyScene ()
@property BOOL contentCreated;
@end
@implementation MyScene
- (id)initWithSize:(CGSize)size 
    self = [super initWithSize:size];
    if (self) 
        self.physicsWorld.contactDelegate = self;
        self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
    
    return self;

- (void)didMoveToView:(SKView *)view

    if (!self.contentCreated) 
        [self buildWorld];
        self.physicsWorld.contactDelegate = self;
    


#pragma mark - World Building
- (void)buildWorld 
    NSLog(@"Building the world");
    SKSpriteNode * sprite1 = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(100,100)];
    sprite1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(100,100)];
    sprite1.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) +100);

    SKSpriteNode * sprite2 = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(100,100)];
    sprite2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(100,100)];
    sprite2.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) - 100);


    [self addChild:sprite1];
    [self addChild:sprite2];

- (void)didBeginContact:(SKPhysicsContact *)contact

    NSLog(@"contact");


@end

提前致谢。

【问题讨论】:

@Alexander 他们确实会摔倒互相碰触 【参考方案1】:

来自@987654321@ 文档:

当两个物理实体重叠并且其中一个物理实体重叠时,就会创建一个接触。 物理实体有一个 contactTestBitMask 属性,与 对方的categoryBitMask属性。

您必须为物理实体分配categoryBitMaskcontactTestBitMask。您想首先创建您的类别:

static const uint32_t sprite1Category = 0x1 << 0;
static const uint32_t sprite2Category = 0x1 << 1;

接下来,分配类别和接触测试位掩码:

sprite1.physicsBody.categoryBitMask = sprite1Category;
sprite1.physicsBody.contactTestBitMask = sprite2Category;

sprite2.physicsBody.categoryBitMask = sprite2Category;
sprite2.physicsBody.contactTestBitMask = sprite1Category;

@987654322@ 文档中的注释:

为了获得最佳性能,仅在联系人掩码中设置位 您感兴趣的互动。

【讨论】:

以上是关于didBeginContact:(SKPhysicsContact *)联系人未调用的主要内容,如果未能解决你的问题,请参考以下文章

didBeginContact 未调用 swift3 Xcode8

didBeginContact 委托方法未触发 ARKit 碰撞检测

无法修改 didBeginContact 中的contact.bodyA

同一个 SKPhysicsBody 多次调用 didBeginContact

-(void)didBeginContact 没有被调用。想法?

碰撞时,我的玩家以外的物理实体不会调用 didBeginContact