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

Posted

技术标签:

【中文标题】iOS - bodyWithPolygonFromPath : Body 与路径相同,但碰撞无法正常工作【英文标题】:iOS - bodyWithPolygonFromPath : Body is the same as the path but collisions are not working properly 【发布时间】:2014-01-15 16:36:47 【问题描述】:

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

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

我正在使用 bodyWithPolygonFromPath 创建 skspritenode 的物理体,它正在工作,但并非总是如此。我已经下载了 YMCPhysicsDebugger 来查看 body 的内容,在每种情况下都很好,但是我看到当我在 CGPath 上超过 4 个点时,球不会与整个 body 碰撞,它只与一个较小的区域发生碰撞..我已经尝试并搜索了很多但没有任何结果..我试图逆时针制作 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];

这是我的“比赛”的两张照片,第一张有效,球直接反弹回来。第二个没有正常工作,只检测到上部的碰撞。

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,但我真的不知道如何在数学中做到这一点..

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

非常感谢

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

天啊!非常感谢 !!!为什么我以前没有尝试过.. 浪费了这么多小时.. 但我通常在这样简单的事情上遇到麻烦.. 无论如何,非常感谢你:) PS:我的英语很糟糕,因为我认为凹形意味着“有一个里面的洞”,它之前误导了我! 我也经常混淆凸凹。 ;) 要记住的一种方法是,在末尾有一个“x”,其两条线标记 4 个角,形成一个矩形,一个矩形是凸形。 “凹进去”怎么样? 或大声说成“convectangle”,当错误地用作“concavtangle”时听起来很奇怪;) 好吧!感谢那些记住的方式..但我相信下次我会看到凹面或凸面,我会把它们混合起来^^

以上是关于iOS - bodyWithPolygonFromPath : Body 与路径相同,但碰撞无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别