iOS - bodyWithPolygonFromPath : Body is the same as the path but collisions are not working properly

标签 ios objective-c path sprite-kit skspritenode

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

我正在尝试使用 SpriteKit 制作 Xonix、Bix 或 Jezzball 之类的游戏。无论如何,我有一个球在墙上弹跳,我试图在它不能去的地方制造障碍,这些障碍是由 CGPathref 制造的(用户通过它的 Action 制造它)

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

我正在向您复制创建 SKSpriteNode 的代码,但我怀疑它是否有用,我认为问题出在我的观点上,也许我需要更多关于 physicsbody 如何与多边形一起工作的解释

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

我还尝试在更新函数中检测球何时进入障碍物以手动使其反弹,但当然,它并没有真正起作用。再加上我的数学学习不太好哈哈

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

}

每当 CGPath 超过 4 个点时,我也考虑过制作几个 SKSpriteNode,但我真的不知道如何在数学上做到这一点..

无论如何,这是一篇很长的文章,我希望你们中的一些人能够阅读并理解它(对不起我的英语,我是法国人!)最重要的是,能够帮助我!!

非常感谢

最佳答案

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

物理多边形形状需要凸起才能正常工作。您可以执行以下两项操作之一:

  • 创建两个节点和两个主体,它们各自的形状是凸的,但它们一起形成凹的形状。这些物体可以是动态的。您可能希望将它们设置为静态或使用刚性距离接头将它们连接在一起,或者以其他方式确保它们不会分开。
  • 使用 bodyWithEdgeLoopF​​romPath:bodyWithEdgeChainFromPath: 可以创建凹形碰撞形状。这些物体不是动态的,也不能自行移动,但它们是静态运动场中任意碰撞形状的完美解决方案。

关于iOS - bodyWithPolygonFromPath : Body is the same as the path but collisions are not working properly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21143074/

相关文章:

variables - 将reducers输出目录路径保存到Hadoop中的变量

ios - 编程 slider 约束未更新

objective-c - 内存泄漏警告

ios 获得今天凌晨 12 点

ios - 重用 API 管理器类和存储数据以使其可重用的最佳方法是什么

iphone - 在iOS中创建声音

ios - Objective C 中的类方法和对象属性存在错误

objective-c - MKMapView 居中并将 View 缩放到注释,

postgresql - 如何在 Windows 10 上设置 Postgres 路径变量

Python 无法打开路径中包含非英文字符的文件