iOS – bodyWithPolygonFromPath:Body与path相同,但碰撞不能正常工作

首先,我要感谢这个网站上的每个用户,因为我总是在这里find解决scheme,而且非常有帮助!

我正在尝试使用SpriteKit制作像Xonix,Bix或Jezzball的游戏。 无论如何,我有一个弹跳在墙上的球,我试图阻止它不能走的障碍,这些障碍是由CGPathref(用户使它的运动)

我使用bodyWithPolygonFromPath创build了skspritenode的物理体,它正在工作,但并不总是如此。 我已经下载了YMCPhysicsDebugger来查看身体的内容,并且在任何情况下都是好的,但是我已经看到,当我在CGPath上有超过4分时,球不会与整个身体发生碰撞,它只碰撞一个较小的区域..我已经尝试过,没有任何结果search了很多..我试图使逆时针CGPath的点,它不工作,即使在另一边..

我拷贝了你创buildSKSpriteNode的代码,但我怀疑它会有用,我认为问题是与我的观点,也许我需要更多的解释如何物理工作与多边形

SKSpriteNode *zone = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(50, 50)]; zone.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path.CGPath]; // 1 zone.physicsBody.friction = 0.0f; zone.physicsBody.restitution = 0.0f; zone.physicsBody.linearDamping = 0.0f; zone.physicsBody.allowsRotation = NO; zone.physicsBody.categoryBitMask = wallsCategory; zone.physicsBody.dynamic = NO; // 2 [self addChild:zone]; 

这里有两张我的“游戏”的照片,第一张是作品,球反弹回来。 第二个是不应该的,只有上部被检测到碰撞。

http://hpics.li/86a69e2

http://hpics.li/e16d18e

我也尝试在更新函数中检测到球进入障碍时手动使其反弹,但当然,这不是真的工作。 加上我的math研究不是那么好大声笑

 for(SKSpriteNode *zone in zonesTab) { UIBezierPath *path = [zoneesTab objectAtIndex:i]; // Array of UIBezierPath for the obstacles if(CGPathContainsPoint(path.CGPath, NULL, ball.frame.origin, FALSE)) { ball.physicsBody.velocity=CGVectorMake(ball.physicsBody.velocity.dx*-1, ball.physicsBody.velocity.dy*-1); NSLog(@"Touches iT"); } i++; } 

我也想过每次创build几个SKSpriteNode一个CGPath超过4点,但我真的不知道如何在math中做到这一点。

无论如何,这是一个很长的文章,我希望你们中的一些人能够阅读并理解这一切(抱歉我的英文,我是法国人!),最重要的是能够帮助我!

非常感谢你

第一个截图的形状是凸的,但第二个截图的形状是凹的。

物理多边形的形状需要凸起才能正常工作。 你可以做两件事之一:

  • 创build两个节点和两个单独的形状为凸面但一起形成凹面形状的物体。 这些机构可以是dynamic的。 您可能需要将它们设置为静态或将它们与刚性距离关节连接在一起,否则确保它们不会分开。
  • 使用bodyWithEdgeLoopFromPath:bodyWithEdgeChainFromPath:可以创build凹面碰撞形状。 这些物体不会dynamic,不能自行移动,但它们是静态游戏场的任意碰撞形状的完美解决scheme。