碰撞没有精灵碰撞

时间:2014-12-12 03:24:05

标签: sprite-kit collision-detection skspritenode

我有一些简单的代码,在块的最左边部分添加一个块精灵,如下所示:

block.position = CGPointMake((-self.size.width * 0.5), 0);
[self addChild:block];

由于锚点位于块精灵的中间。 self指的是实际的瓷砖。

这样可以正常工作,并且实际上会在tile精灵的左侧添加块。

现在我还有一个玩家精灵,如果它试图通过它可以与该块碰撞。这也很好。

问题发生在我试图让块精灵用另一个锚点显示在完全相同的位置时(我需要一个新的锚点来实现我想要创建的收缩效果 - 这看起来工作得很好btw)。 / p>

新代码变为:

block.position = CGPointMake(-(self.size.width * 0.5), -(self.size.width * 0.5));
block.anchorPoint = CGPointZero;
[self addChild:block];

新区块与第一个案例位置类似(尽管不完全相同)。 我不确定为什么位置不相同但我可以通过在x,y点加上/减去1或2来解决这个问题。

奇怪的问题是,如果我的玩家精灵现在试图在下面的棋子下面(这是一个没有任何棋子的开放式棋子)下面的那个棋盘下面,我会在玩家和棋盘之间找到一个联系人。

我甚至在SKShapeNode中添加了调试路径,以确保播放器和块精灵实际上不会发生碰撞。他们没有!但我仍然遇到碰撞事件。

玩家规模是(0.8,0.9),但我认为这不会起到很大作用。

我真的不明白为什么会发生这种情况。任何想法的家伙?

1 个答案:

答案 0 :(得分:1)

更改精灵的锚点对物理体没有影响。

在谈论CGRect时,矩形起点位于{0,0}点,

所以正在发生的事情是你现在有一个精灵,它的图像以锚点{0,0}为中心但是有一个物理体,从{0,0}开始并且是一个大小的精灵,意思是它以{0.5,0.5}为中心 因此,即使玩家不与精灵的图像发生碰撞,它也会与物理身体碰撞。

发生的事情是你有一个物理体,它与精灵具有相同的中心点,
但是,与之前相反的是,精灵锚点在中间,它将“适合”物理体,
现在精灵的锚点是{0,0},它导致物理体中心点实际上是精灵最左下角。

要解决此问题,您需要偏移物理实体,因此它将以新锚点为中心。

例如:

block.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:block.size center:CGPointZero];  

CGPoint newCenter = CGPointMake(block.size.width, block.size.height);
block.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:block.size centre:newCenter];  
祝你好运。

编辑 - 再想一想,我觉得我对偏移方向感到困惑 已进行编辑以更正它。