2015-09-26 100 views
0

我想检测一个正方形SkShapeNode和一个圆圈SkShapeNode之间的碰撞。它基本上可以工作,但似乎hitbox /物理实体并不真正与节点形状对齐。它似乎是随机的10-20分。与SKShapeNode(SpriteKit)奇怪的碰撞检测

这是我的代码:

SKShapeNode* circle= [SKShapeNode shapeNodeWithCircleOfRadius:7.0]; 
circle.physicsBody= [SKPhysicsBody bodyWithCircleOfRadius:7.0]; 
circle.physicsBody.usesPreciseCollisionDetection= YES; 
circle.physicsBody.categoryBitMask= catCircle; 
circle.physicsBody.contactTestBitMask= catSquare; 

circle.position= CGPointMake(x, y); 
[self addChild:circle]; 

SKShapeNode* square= [SKShapeNode shapeNodeWithRect:rect]; 
square.position= position; 
square.physicsBody= [SKPhysicsBody bodyWithRectangleOfSize:rect.size]; 
square.physicsBody.categoryBitMask= catSquare; 
square.physicsBody.contactTestBitMask= catCircle; 
square.physicsBody.dynamic= YES; 
square.physicsBody.usesPreciseCollisionDetection= YES; 

[self addChild:square]; 

我通过移动正方形形状(圆形保持位置)触发碰撞:

[square runAction:[SKAction moveTo:somePoint duration:2]]; 

我在didBeginContact通过removeAllActions取消行动一旦检测到碰撞。

这是它的样子:

enter image description here

正如你可以看到,广场上确实停止一旦倒是圈,但在此之前/之后的几个问题。

我在做什么错?

回答

0

我不确定CD如何与IOS一起工作,但这可能是正常行为,通常在碰撞检测时发现碰撞发生时,您的对象将位于另一个对象内,如上所示。一旦发生碰撞,您需要将对象移回框架,直到碰撞未发生。

您可以通过每次存储前一帧的位置并在发生碰撞时将对象设回原来的位置来完成此操作。

+0

其实,这不是问题。例如,正如你在上面看到的那样,在触及圆圈之前(上方广场),击球也会发生,并且广场停止。 然后,我想要做的是用方块“拍”圆,但在某些情况下,方块在视觉上击中圆圈,但只是通过它而没有碰撞检测。 – user826955

+0

所以我认为这取决于你接近圆的地方,你会得到不同的行为,就好像圆圈的边界不是以它自己的对象为中心,或者更可能是广场不是中心。这可能指向你如何更新方块的位置 – Rob85

+0

我同意,它看起来像物理体* *不*代表节点形状。但是,我似乎无法在节点或物理主体类中找到适当的方法来调整它。 另外,我发现的碰撞检测教程都没有做任何事情,除了我所做的。 – user826955

0

我有完全相同的问题(Xcode 7,iOS 9),但在我的情况下,问题似乎只隔离到模拟器。当我在设备上运行相同的代码时,它按预期工作。

UPDATE

看来,我是遇到的问题是从你的不同。但是,我明白了为什么你正在经历物理学中的偏移。为了更好地了解在你的代码,添加以下行(最好是在视图控制器某处):

skView.showsPhysics = YES; 

上面的代码会显示你的物理身体的轮廓,这是你会看到(蓝色轮廓代表着物理学)。

enter image description here

您选择来实例方类方法是造成这种副作用,即:

SKShapeNode* square= [SKShapeNode shapeNodeWithRect:rect]; 

创建一个具有矩形路径的形状节点。(根据苹果的文档)

参数 矩形
矩形,相对节点原点

而是使用这种方法来创建你的平方和的东西会像预期的那样:

SKShapeNode* square= [SKShapeNode shapeNodeWithRectOfSize:rect.size]; 

创建一个带有矩形pa的形状节点以节点的原点为中心。

如果你仍然想用:

 SKShapeNode* square= [SKShapeNode shapeNodeWithRect:rect]; 

,那么你就必须确保你设置“矩形”根据以下几点:

rect = CGRectMake(-someWidth/2, -someHeight/2, someWidth, someHeight) 

以上将确保该物理体与该形状节点的路径对齐。

对于理解为什么会这样......当您使用的方形节点:

SKShapeNode *平方= [SKShapeNode shapeNodeWithRect:RECT]。

如果RECT = CGRectMake(50.0,50.0,100.0,100.0),那么要创建一个SKShapeNode并给予它的矩形形状,其具有定位在点(50.0,50.0)其左下角,相对到SKShapeNode。

当使用以后创建physicsBody:

square.physicsBody= [SKPhysicsBody bodyWithRectangleOfSize:rect.size]; 

的physicsBody的位置是由相对于默认设置为它的节点的原点(SKShapeNode)和NOT的形状(这是一个CGPathRef)。我知道这听起来有点令人困惑,但我希望它能说明一些问题。

节点的位置是相对于其父节点(在你的情况下,它是场景),而属于SKShapeNode的形状的位置是相对于其节点。通过实例化您的方形节点使用:

SKShapeNode* square= [SKShapeNode shapeNodeWithRectOfSize:rect.size] 

您确保您的形状与您的节点排成一列。

+0

不幸的是,在设备上的行为是完全一样的:( 你可以给你一些最基本的代码示例,你怎么做? – user826955