Sprite Kit 物理碰撞问题

2024-04-18

我遇到了一些碰撞问题。我有两个大小和质量相同的物体。当一个物体与另一个静止物体碰撞时,我会得到正确的行为(图像中的灰色区域)。当我有两个彼此相邻的对象时,行为不太正确。 Spritekit 结果在左侧。右侧是预期/需要的结果。

我想我知道发生了什么事,但不知道该怎么办。如果该对象是一个质量两倍的对象,那么 spritekit 的行为将是正确的,但它们是单独的对象,最上面的一个应该采用传入粒子的速度。看起来它把它们当作一个对象了。

我尝试过作弊并在两者接触后缩小半径以留出一个小间隙,但随后事情就变得一团糟。有人知道我在这里能做什么吗?谢谢。


简单的介绍

这绝对可以做到,并且不需要复杂的计算。 SpriteKit 完全有能力处理这种碰撞。我认为你误解了这里的物理原理。在物理学中,有一个你正在打破的简单规则需要牢记。这里用现实生活中的话来说:

没有两个物体可以占据空间中的同一点。这也适用于物体的一部分。任何两个物体的任何部分都不能占据空间中的同一点。考虑到这一点,我们可以说,无论两个物体有多近,它们之间总是存在一些空间。

换句话说,两个相邻物体之间的空间量必须大于零。无论这个空间多么无限小,它仍然必须存在。

问题

您的根本问题是蓝色圆圈之间的间距为零。假设圆的半径为 30,顶部圆的 y 位置为 400。

您对定位中间圆的数学计算可能是topCircle.position.y - (topCircle.height + middleCircle.height) / 2。由于您的圆的半径都相同(在我们的示例中为 30),因此您可能将其简化为topCircle.y - CIRCLE_DIAMETER。如果您绝对定位圆圈,这可能就是您在头脑中执行的计算。

无论使用哪个等式,当您代入数字时,第二个球的 y 位置都是 340。

第一个方程:400 - (60 + 60) / 2 = 340
第二个方程:400 - 60 = 340
(注意:第一个方程更灵活,允许您使用任何大小的圆圈而不是统一大小的圆圈)

问题就在这里。现在应该很清楚,顶部圆的底部与中间圆的顶部在空间中占据相同的点。

顶部圆圈:400 - 30 = 370
中圈:340 + 30 = 370
之间的空间:|370 - 370| = 0

这两个物理体试图占据空间中的同一点,因此已合并为一个体,从而呈现出您所看到的行为。

解决方案

话虽如此,如果您只需在圆圈之间添加一点(或更少)的空间,您就会得到您想要的行为。
(注意:还要确保将每个圆圈的物理体的恢复设置为 1)

这适用于任意数量的圆圈。下面是一个简单的示例场景,其中 1 个圆圈与其他 4 个圆圈联系,展示了这种行为。我在 iPhone 6 上运行了这个:

#import "GameScene.h"

@interface GameScene()

@property (strong, nonatomic) NSArray *nodes;

@end


@implementation GameScene

#pragma mark - View Lifecycle
-(void)didMoveToView:(SKView *)view
{
    self.backgroundColor = [SKColor blackColor];

    [self createNodes];
    [self positionNodes];
    [self addNodes];
}

#pragma mark - Setup
- (void)createNodes
{
    // You could use SKShapeNode as well
    self.nodes = @[[SKSpriteNode spriteNodeWithImageNamed:@"circle"],
                   [SKSpriteNode spriteNodeWithImageNamed:@"circle"],
                   [SKSpriteNode spriteNodeWithImageNamed:@"circle"],
                   [SKSpriteNode spriteNodeWithImageNamed:@"circle"],
                   [SKSpriteNode spriteNodeWithImageNamed:@"circle"]];

    // Use this if you don't have a 30-radius circle image at hand
//    self.nodes = @[[SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:CGSizeMake(60, 60)],
//                   [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:CGSizeMake(60, 60)],
//                   [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:CGSizeMake(60, 60)],
//                   [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:CGSizeMake(60, 60)],
//                   [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:CGSizeMake(60, 60)]];

    for(SKSpriteNode *node in self.nodes)
    {
        node.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:30];
        node.physicsBody.affectedByGravity = NO;
        node.physicsBody.restitution = 1;
    }
}

- (void)positionNodes
{
    SKSpriteNode *node = self.nodes.firstObject;
    node.position = CGPointMake(300, 400);

    for(NSInteger i = 1; i < self.nodes.count - 1; i++)
    {
        SKSpriteNode *prevNode = node;
        node = self.nodes[i];
        node.position = CGPointMake(300, prevNode.position.y - (prevNode.frame.size.height + node.frame.size.height) / 2 - 1);
    }

    node = self.nodes.lastObject;
    node.position = CGPointMake(300, 100);

    // Above created nodes at these positions:
    // (300, 400);
    // (300, 339);
    // (300, 278);
    // (300, 217);
    // (300, 100);
}

- (void)addNodes
{
    for(SKSpriteNode *node in self.nodes)
    {
        [self addChild:node];
    }
}

#pragma mark - Touch Events
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    SKSpriteNode *node = self.nodes.lastObject;
    [node.physicsBody applyImpulse:CGVectorMake(0, 20)];
}

@end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sprite Kit 物理碰撞问题 的相关文章

随机推荐

  • Three.js 中几何图形的事件处理? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在寻找对 Three js 中的几何图形 相机 灯光 我们添加到场景中的东西 进行某种事件处理 我用谷歌搜索但找不到任何相关内容
  • REST API 错误消息是否应该国际化? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在设计 REST API 的错误时 遵循标准 HTTP 代码 4XX 和 5XX 并包含主体 XML JSON 似乎是一个很好的做法 简短的信息
  • Next Js服务器端Api读写JSON

    我正在尝试使用 Next js 为自己编写一个基本的本地 api 它是一个时间线生成器 而我却陷入了实际从 api 文件夹中读取文件的困境 我想要在本地应用程序中得到什么 1 一个简单的页面 我可以在其中输入事件 以及日期和描述 2 在某处
  • 如何在Python中使用多线程并加速代码

    我正在尝试在 python 3 中使用多线程 加快某些代码的执行速度 基本上我必须在可迭代上运行相同的函数 channels range 1 8 我已经制作了一个到目前为止我正在使用的工作示例 我正在针对正常执行对其进行测试 我没有看到任何
  • 使用 Nokogiri 替换时的编码问题

    我有这个代码 encoding utf 8 require nokogiri s a href path to file Caf Verona a encode UTF 8 puts Original string s doc Nokogi
  • 运行模拟器时出现“com.android.exchange.ExchangeService 已泄漏...”错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我将模拟
  • NHibernate.Exceptions.GenericADOException:无法执行查询

    我有一个遗留应用程序 vfp 8 我需要从中提取数据 无插入 我使用 Accnum 字段作为主键 它在表中定义为字符 11 出厂配置
  • 如何检查 Google VM 实例是否已具有 gcloud 凭据

    为了不每次都打电话 gcloud auth login 这会中断用户输入的脚本 我想查看用户是否已经通过身份验证 任何用户 并且只有在没有用户的情况下 才调用gcloud auth login 我想要一个比抓取输出更优雅 可靠的解决方案gc
  • 为什么 ActionScript 中没有记录 drawRoundRectComplex() ?

    在研究actionscript 3的图形类时 我遇到了未记录的drawRoundRectComplex 方法 它是一个变种drawRoundRect 但有 8 个参数 最后四个是每个角的直径 x y 宽度 高度 左上 右上 左下 右下 ex
  • 将集合添加到列表框

    我正在尝试让用户能够添加name and ingredient到列表框 下面简单介绍一下相关类 RecipeForm是形式 RecipeManager是一个集合管理器类Recipe Recipe是 内容 类 其中字段name and ing
  • ggplot2 - 具有堆栈和闪避的条形图

    我正在尝试使用创建条形图ggplot2我通过一个变量进行堆叠并通过另一个变量进行躲避 这是一个示例数据集 df data frame year rep c 2010 2011 each 4 treatment rep c Impact Co
  • Linux (Fedora 13) 与 OS X 中的 sigwait

    因此 我尝试使用 pthreads 创建一个可在 OS X 和 Linux 上运行的信号处理程序 下面的代码适用于 OS X 但不适用于 Fedora 13 该应用程序相当简单 它生成一个 pthread 注册 SIGHUP 并等待信号 生
  • 好的斯坦福 Javascript 加密库 (SJCL) 示例? (JS密码学)[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种在 Javascript 中进行客户端加密的方法 保持http www matasano
  • 3D 图形矩阵 4x4 中最后一行的 magic 4 的用途是什么?

    当我阅读有关WebGL的书时 我看到了下一个矩阵描述 有关于书中最后一行的信息 WebGL 初学者指南 初学者指南 Diego Cantor Brandon Jones 神秘的第四排 第四排没有任何特殊之处 意义 元素 m4 m8 m12
  • 丰富域模型与贫乏域模型[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在决定是否应该使用丰富域模型而不是贫乏域模型 并寻找两者的好例子 我一直在使用贫血领域模型构建 Web 应用程序 并由服务 gt 存储库 g
  • 我的服务应该返回什么接口? IQueryable、IList、IEnumerable?

    想象一下 我有一个 SearchService 层 它有一个方法来搜索以某个字符串开头的所有汽车 public static class Searcher public IAnInterface
  • 如何在 Safari 上提供 ES6 模块?

    我有一个关于 Safari 中 ES6 模块使用的问题 这让我抓狂 因为它阻止我与 Safari 用户共享我的网站 我的网络应用程序和即将推出的 MWE工作得很好在以下环境中 Windows Chrome Edge 和 Firefox 均通
  • 适用于 Objective C iPhone 的 XMLStreamReader?

    我在用XML编写器 http code google com p xswi 用于生成 xml 现在我想用一些阅读器库 框架来阅读这个 xml 是否有任何可用的补充框架 库 我目前正在寻找使用 TouchXML 库来读取此内容 但它无法按预期
  • “mov offset(%rip),%rax”有什么作用?

    Does rax获取偏移量加上这条指令的地址 还是下一条指令的地址 从微代码的角度来看 如果答案是下一条指令可能会更容易 下一个 这是 x86 上的一般规则 另请参阅分支 在 Intel 手册第 2 卷第 2 2 1 6 RIP 相对寻址部
  • Sprite Kit 物理碰撞问题

    我遇到了一些碰撞问题 我有两个大小和质量相同的物体 当一个物体与另一个静止物体碰撞时 我会得到正确的行为 图像中的灰色区域 当我有两个彼此相邻的对象时 行为不太正确 Spritekit 结果在左侧 右侧是预期 需要的结果 我想我知道发生了什