iOS - bodyWithPolygonFromPath:Body与路径相同但碰撞无法正常工作

use*_*930 5 path objective-c ios sprite-kit skspritenode

首先,我要感谢本网站上的每个用户,因为我总是在这里找到解决方案,这太有用了!

我正在尝试使用SpriteKit制作像Xonix,Bix或Jezzball这样的游戏.无论如何,我有一个球在墙壁上弹跳,我试图在无法前进的地方制造障碍物,这些障碍物是由CGPathref制造的(用户通过其动作制作它)

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

我正在复制你创建SKSpriteNode的代码,但我怀疑它会有用,我认为问题在于我的观点,也许我需要更多关于物理体如何与多边形一起工作的解释

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];
Run Code Online (Sandbox Code Playgroud)

这是我的"游戏"的两张照片,第一张照片正常,球反弹回来.第二个不能正常工作,只检测上部碰撞.

http://hpics.li/86a69e2

http://hpics.li/e16d18e

我还尝试检测球何时进入更新功能中的障碍物以手动使其反弹,但当然,它并没有真正起作用.加上我的数学研究不是那么好

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++;

}
Run Code Online (Sandbox Code Playgroud)

每次CGPath有超过4分时我也想过制作几个SKSpriteNode,但我真的不知道如何在数学中做到这一点.

无论如何,这是一个很长的帖子,我希望你们中的一些人能够全部阅读并理解这一切(对不起我的英语,我是法国人!)而且最重要的是,能够帮助我!

非常感谢你

Lea*_*s2D 10

第一个屏幕截图中的形状是凸形的,但第二个屏幕截图中的形状是凹形的.

物理多边形形状需要凸出才能使它们正常工作.你可以做以下两件事之一:

  • 创建两个节点和两个实体,其各自的形状是凸的,但它们一起形成凹形.这些机构可以是动态的.您可能希望将它们设置为静态或使用刚性距离接头将它们连接在一起,或者确保它们不会分开.
  • 使用bodyWithEdgeLoopFromPath:bodyWithEdgeChainFromPath:能够创建凹面碰撞形状.这些物体不会是动态的,也不会自行移动,但它们是任意碰撞形状与静态游戏场的完美解决方案.