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

Posted

技术标签:

【中文标题】-(void)didBeginContact 没有被调用。想法?【英文标题】:-(void)didBeginContact is not being called. Thoughts? 【发布时间】:2014-01-29 15:07:07 【问题描述】:
#import "collisionTestMyScene.h"
const static int nodeBitMask = 0x1 << 0;
const static int node1BitMask = 0x1 << 1;;

@implementation collisionTestMyScene

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


            
    return self;

-(void) didBeginContact:(SKPhysicsContact *)contact 
    NSLog(@"Contact Begin");

    if (contact.bodyA.categoryBitMask == nodeBitMask) 
        NSLog(@"Node is Body A");
    
    if (contact.bodyA.categoryBitMask == node1BitMask) 
        NSLog(@"Node is Body B");
    

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    /* Called when a touch begins */

    for (UITouch *touch in touches) 
        CGPoint location = [touch locationInNode:self];
        node = [SKSpriteNode spriteNodeWithImageNamed:@"block.jpg"];
        node.position = location;
        [node setScale:0.07];
        node.physicsBody.contactTestBitMask = node1BitMask;
        node.physicsBody.categoryBitMask = nodeBitMask;
        node.physicsBody.collisionBitMask = nodeBitMask;
        //node.physicsBody.collisionBitMask = 0;
        node1 = [SKSpriteNode spriteNodeWithImageNamed:@"block2.jpg"];
        node1.position = CGPointMake(200, 200);
        node1.physicsBody.categoryBitMask = node1BitMask;
        node1.physicsBody.contactTestBitMask = nodeBitMask;
        node1.physicsBody.collisionBitMask = node1BitMask;
        //node1.physicsBody.collisionBitMask = 0;
        [node1 setScale:0.07];


        [self addChild:node];
        [self addChild:node1];
        node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(node.size.width, node.size.height)];
        node1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(node1.size.width, node1.size.height)];
        SKAction *moveUp = [SKAction moveToX:100 duration:3];
        node1.physicsBody.affectedByGravity = NO;
        node.physicsBody.affectedByGravity = NO;
        [node1 runAction:moveUp];
        w = 1;

    




它永远不是 NSLogging 任何东西。我尝试过更改位掩码等等。 CGRectIntersects 函数可以工作,但它不够准确。此外,这两个节点是完美的盒子形状。我可能做错了什么?提前谢谢!

【问题讨论】:

你确定调用了 initWithSize 吗?尝试在该方法中放置一个断点并确保已设置委托。 是的,我刚刚查过了,它被称为 您从哪里调用/调用 didBeginContact?您是否缺少插座连接? 等什么?我只是在场景的.m文件中调用了它 @BriOnH 在 Spritekit 中物理模拟应该调用这个方法 【参考方案1】:

这里的问题是位掩码。这两个节点属于不同的类别、接触和碰撞组(位掩码)。因此它们不会接触也不会碰撞,因为位掩码会与AND 进行比较,并且只有当结果非零时才会发生接触/碰撞。

简而言之,至少将它们放在同一个联系人位掩码中,以便接收didBeginContact 消息。

【讨论】:

谢谢,但是即使所有位掩码都相同,它似乎仍然不起作用。 哦,我刚刚注意到,在您分配位掩码时,物理主体仍然为零,因为您仅在更改位掩码后才创建主体,因此它们将具有默认值。 哇。这很有意义!我会尝试并尽快通知您! 好的,很好,现在它正在记录碰撞,但是两个精灵在屏幕周围出现故障,并且没有移动到正确的位置。有什么想法吗? 抱歉我的错误信息。如果帖子回答了您的问题,请单击此答案左侧上下箭头下方的绿色复选标记,将问题标记为答案。很高兴有人能帮助你!

以上是关于-(void)didBeginContact 没有被调用。想法?的主要内容,如果未能解决你的问题,请参考以下文章

didBeginContact 未调用 swift3 Xcode8

无法修改 didBeginContact 中的contact.bodyA

同一个 SKPhysicsBody 多次调用 didBeginContact

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

Sprite Kit 的“didBeginContact”函数不是很准确。我该怎么办?

SKSpriteKit - 在调用 didBeginContact 时重新定位移动对象