具有内边缘的 SpriteKit SKPhysicsBody

2024-04-18

我创建了一个SKSpriteNode比如说Map它有一个我定义的边缘路径(一些简单的多边形形状)。

我想弄清楚的是如何添加几个other将充当内部边缘的边缘路径Map。就好像整个“地图”实际上确实有holes。某种内部边界形状可以与Map整体:一条边路径(如下图)

enter image description here ©

我知道有一种方法可以创建SKPhysicsBody与主体(一些 NSArray),像这样

Map.physicsBody = [SKPhysicsBody bodyWithBodies:bodiesArray];

这种方法实际上会生成我在图像中显示的内容吗?假设bodiesArray包含 3SKSpriteNode每个都有使用此类方法的定义路径:

+ (SKPhysicsBody *)bodyWithEdgeChainFromPath:(CGPathRef)path

,创建这样的路径

        SKSpriteNode *innerNode1 = [SKSpriteNode spriteNodeWithImageNamed:@"map"];

        CGMutablePathRef innerNode1Path = CGPathCreateMutable();

        CGPathMoveToPoint(mapPath, NULL, 1110, 1110);
        CGPathAddLineToPoint(mapPath, NULL, <some x1>, <some y1>);
        CGPathAddLineToPoint(mapPath, NULL, <some x2>, <some y2>);
        CGPathAddLineToPoint(mapPath, NULL, <some x3>, <some y3>);
        . 
        .
        .
        CGPathCloseSubpath(mapPath);

        innerNode1.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:innerNode1Path];
        [bodiesArray addObject:innerNode1];

        // Repeat for other 2 nodes

我知道另一种方法是创建 3 个独立的节点,其中包含预期“孔”的位置和形状,但我努力避免创建超出我需要的节点。如果有人可以确认我正在尝试做的事情是正确的,或者可能提出我不知道的替代方案。

NOTE:如果我正在做的事情是正确的,但我错过了一些东西,如果有人能向我展示正确的方法来完成我想做的事情,我将不胜感激(即使是一个带有内部较小正方形的简单正方形示例也很棒)。谢谢!

EDIT 1: 下面是我用来尝试创建“内部边界”的代码片段。这里的问题是,当绘制并显示外部和内部矩形时,当我将内部矩形添加到地图时bodyWithBodies,它完全控制碰撞检测,从外部矩形外壳中删除所有接触控制。当我删除bodyWithBodies它恢复正常并显示两个矩形,外部有碰撞检测(不允许我通过),而内部没有任何东西......如此接近

// 1 Create large outer shell Map
CGRect mapWithRect = CGRectMake(map.frame.origin.x + offsetX, map.frame.origin.y + offsetY, map.frame.size.width * shrinkage, map.frame.size.height * shrinkage);

self.physicsWorld.gravity = CGVectorMake(0.0, 0.0);
self.physicsWorld.contactDelegate = self;

// 2 Create smaller inner boundary 
CGRect innerRect = CGRectMake(100, 100, 300, 300);
SKPhysicsBody *body = [SKPhysicsBody bodyWithEdgeLoopFromRect:innerRect];
body.categoryBitMask = wallCategory;
NSArray *bodyArray = [NSArray arrayWithObject:body];

// 3 Add bodies to main Map body
myWorld.physicsBody = [SKPhysicsBody bodyWithBodies:bodyArray]; 
myWorld.physicsBody.categoryBitMask = wallCategory;


if ( [[levelDict objectForKey:@"DebugBorder"] boolValue]  == YES) { 
    // This will draw the boundaries for visual reference during testing       
    [self debugPath:mapWithRect];
    [self debugPath:innerRect];
}

EDIT 2这种方法有效......只需添加一个与外部矩形具有相同属性的新节点:

SKPhysicsBody *innerRectBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:innerRect];
innerRectBody.collisionBitMask = playerCategory;
innerRectBody.categoryBitMask = wallCategory;
SKNode *innerBoundary = [SKNode node];
innerBoundary.physicsBody = innerRectBody;
[myWorld addChild: innerBoundary];

...但我非常想要一个不需要额外节点的更干净的解决方案..想法?


你在这里没有做错什么,我举了一个例子,我用两个物理体创建了两个边缘矩形体

//使用gcd一段时间后添加主体

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self addBodyA];
    });

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self addBodyB];
    });
-(void)addBodyB
{
    SKSpriteNode *node=[SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(20, 20)];
    node.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:node.frame.size];
    node.position=CGPointMake(550, 420);
    node.physicsBody.restitution=1;
    [self addChild:node];

}
-(void)addBodyA
{
    SKSpriteNode *node=[SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(20, 20)];
    node.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:node.frame.size];
    node.position=CGPointMake(400, 420);
    node.physicsBody.restitution=1;
    [self addChild:node];

}
-(void)addEdgesBodies
{
    SKAction *r=[SKAction rotateByAngle:1.0/60 duration:1.0/60];

    SKSpriteNode *rect=[SKSpriteNode spriteNodeWithColor:[SKColor clearColor] size:CGSizeMake(300,300)];
    rect.physicsBody=[SKPhysicsBody bodyWithEdgeLoopFromRect:rect.frame];
    rect.position=CGPointMake(500, 400);
    [self addChild:rect];


    //
    SKSpriteNode *rect1=[SKSpriteNode spriteNodeWithColor:[SKColor clearColor] size:CGSizeMake(100,100)];
    rect1.physicsBody=[SKPhysicsBody bodyWithEdgeLoopFromRect:rect1.frame];
    rect1.position=CGPointMake(550, 450);
    [self addChild:rect1];


    [rect1 runAction:[SKAction repeatActionForever:r]];

}
 [self addEdgesBodies];

请记住,边体的 CPU 开销较低,因此不必担心性能,直到您的多边形没有那么多边。

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

具有内边缘的 SpriteKit SKPhysicsBody 的相关文章

  • 如何将音乐从我的应用程序切换到 iPod

    我在用MusicPlayerController我的应用程序中的对象来播放音乐 我知道当 iPhone ipod 应用程序终止时 可以继续播放我的应用程序音乐 我该怎么做 这涉及到一些事情 您必须在两种音乐播放器之间进行选择 应用程序音乐播
  • 在 Instruments 中查找内存泄漏行

    我是 iOS 中的仪器新手 我正在尝试使用 Xcode 4 5 2 并按照本教程查找仪器中的内存泄漏 http soulwithmobiletechnology blogspot sg 2011 04 how to check memory
  • iOS7 中“-webkit-overflow-scrolling: touch” 最初的屏幕外元素被破坏

    既然转基因种子已经发布了 我们现在可以谈谈了 看起来 iOS7 中的 webkit overflow scrolling touch 已损坏 最初不在屏幕上的元素的触摸事件不会触发 或者在某些情况下只是不可靠 这是一个例子
  • 应用程序未通过协同设计验证?

    我在提交 iPhone 申请时遇到问题 我看到了一些类似的问题 但没有找到答案 当我存档项目并单击 验证 时 收到错误消息 应用程序未通过协同设计验证 签名无效 或者未使用 Apple 提交证书进行签名 我假设我在协同设计部分做错了什么 我
  • 我应该在哪个方法中设置 UITextField 的委托?

    在 viewDidLoad 或 init 方法中设置 UITextField 的委托是一个好习惯吗 我尝试在 init 方法中将委托设置为 self 但它没有调用相应的委托方法 当我将代码移动到 viewDidLoad 中时 它注册为将 s
  • NSPredicate 的 onFormat 字符串

    我想用 id 键对数据进行排序 我如何理解格式字符串的用途NSPredicate格式 我有一个100号的帖子 我的代码 let objectIDs posts map 0 id let predicate NSPredicate forma
  • 退出导航控制器

    我试图离开初始视图控制器 并进入空白视图控制器 这很好 但是这会使空白视图控制器也成为导航控制器的一部分 这不是我想要的 我想脱离视图控制器 在视图控制器中 我尝试退出 它会自行弹出 当我尝试视图中的方法时 将出现目标视图控制器 self
  • 显示键盘时如何在 TextView 下方添加更多填充

    当我在 ScrollView 中有 TextField 并点击它时 键盘会按预期显示 但似乎 TextField 已向上移动到足以显示输入区域 但我希望移动到足够的位置 以便整体可见 否则它看起来像是被剪裁了的 我找不到改变这种行为的方法
  • 在 UIMenuItem 上设置accessibilityLabel

    我正在尝试设置accessibilityLabel of a UIMenuItem而且似乎没有效果 无论如何 VoiceOver 只是读取项目的标题 let foo UIMenuItem title foo action selector
  • ResponseSerializer“无法使用 Swift 3 调用非函数类型“NSHTTPURLResponse”的值?

    我一直在使用以下代码 没有出现任何问题 直到更新到 Xcode 8 beta 6 它类似于这个例子 https github com Alamofire Alamofire generic response object serializa
  • [UIScreen mainScreen].bounds.size 在 iOS8 中变得依赖于方向吗?

    我在 iOS 7 和 iOS 8 中运行了以下代码 UIInterfaceOrientation orientation UIApplication sharedApplication statusBarOrientation BOOL l
  • CALayer 抗锯齿不如 UIView 抗锯齿

    我一直在尝试使用 CALayer 制作圆形绘图的动画 一切都运行良好 但问题是 绘制的圆不够抗锯齿 它的边界有点太粗糙 或者如果使用光栅化则模糊 抗锯齿已启用 还尝试过 边缘抗锯齿遮罩 kCALayerLeftEdge kCALayerRi
  • iOS崩溃核心位置CFBasicHashCreateCopy?

    我已经通过 Crashlytics 报告了这个问题 尽管我无法在本地复制它 所以除了下面的堆栈跟踪之外我没有什么可做的 不确定堆栈跟踪中是否引用了 CoreLocation与它有任何关系 但我不确定可能是什么原因 我的项目使用的是ARC 有
  • Firestore 读取包含子集合的文档的计费

    我正在制作一个应用程序 它存储用户使用我的应用程序学习了多少分钟 我的 Firestore 数据库以 用户 集合开始 每个用户都有自己的文档 该文档由其在 Auth 中生成的 userID 命名 我的问题是 如果我读取了他们的 userID
  • Facebook iOS SDK:登录 Facebook 时无需总是询问应用程序的权限

    我在我的应用程序中使用 Facebook iOS SDK 我有两个类似的问题 有没有办法知道当前是否有用户登录 我现在使用的是在成功登录时存储访问令牌和到期日期 并在应用程序启动时加载它们 我的问题是 如果会话无效 我可以为用户提供登录选项
  • iOS 11 浏览器图像错误

    在 iOS 11 中滚动页面时出现以下错误 在 Firefox Safari 和 Chrome 中 在 Android 设备中 不会发生该错误 这些是背景图像 我不知道这是否是导致错误的原因 图 2 显示了图像在 Android 中的用途和
  • 每次 UIScrollView 释放时都会发生内存泄漏

    在我的应用程序中 我有一个滚动视图和四个表格视图 每次拖动然后释放时 我都会泄漏 48 字节 这确实很重要 正如您所看到的 两组泄漏都有相同的来源 有人见过这样的泄漏吗 Edit 1 当我单击泄漏旁边的箭头时 我会得到泄漏的以下信息 您所看
  • 将文本拆分为数组,同时保留 Swift 中的标点符号

    我想将文本拆分为一个数组 保持标点符号与其余单词分隔开 因此字符串如下 Hello I am Albert Einstein 应该变成这样的数组 Hello I am Albert Einstein 我尝试过sting components
  • 如何判断handleOpenURL是在应用程序启动时调用还是在应用程序运行时调用?

    由于事件的顺序略有不同 具体取决于这两个场景中的哪一个正在进行 我希望能够区分出区别 有什么建议么 你不应该使用handleOpenURL因为它已被弃用 相反 使用application openURL sourceApplication
  • 通过 Apple 批量购买计划分发自定义 B2B iOS 应用程序?

    我们的要求是为组织内超过 1000 名用户分发 iOS 应用程序 我的问题 我们可以做吗使用 iOS Developer Provisioning Profile 分发 iPA 因为我们有 99 美元的 Apple 帐户 而不是企业帐户 并

随机推荐

  • 使用 libgit2sharp 获取提交与其父级之间的更改

    我正在使用 libgit2sharp libgit2 的 C 包装器 并且遇到了问题 因为它没有很多我希望的功能 希望我能尽快为它做出贡献 这似乎是一个非常有用的项目 我现在想做的事情是获取从特定提交及其父级更改的文件列表 我不会试图弄清楚
  • 高效使用 Interface Builder

    我是 iPhone 和 Objective c 的新手 我花了很多时间阅读文档并试图理解事情是如何运作的 我有 RTFM 或者至少正在这个过程中 我的主要问题是我想了解如何指定事件传递到的位置 而我能够做到这一点的唯一方法是指定委托 但我确
  • JSON.NET:如何序列化 DataTable 对象中的一行而不将其放入数组中?

    我有一个数据库类 它调用数据库并检索数据 数据被加载到DataTable对象与SqlDataAdapter 然后 我只想获取第一行数据 事实上 数据库无论如何都只会返回一行 并将其转换为 JSON 字符串 问题是这样的 如果我只是通过Dat
  • 如何使用 JavaScript 获取文件扩展名?

    参见代码 var file1 50 xsl var file2 30 doc getFileExtension file1 returns xsl getFileExtension file2 returns doc function ge
  • 将 Iso8601TimeSpanConverter 添加到 JsonConverter 列表会引发 ArrayTypeMismatch 异常

    我正在使用 AutoRest 从 Swagger 定义文件自动生成 REST API 的 C 类 问题在于 当执行客户端类的initialize方法时 会抛出ArrayTypeMismatchException 代码如下 Serializa
  • Gunicorn 日志配置 access_log_format

    我希望 Gunicorn 在我的 docker 容器中记录 JSON 我想在配置文件中使用 access logformat 尝试添加format or access log format or access logformat不配置记录器
  • 将 Mercurial 存储库转换为 svn 存储库

    我知道你可以将 svn 存储库转换为 Mercurial 存储库 或使用 Mercurial 作为 svn 存储库的客户端 但我想要的是将 Mercurial 存储库转换为 svn 存储库 我们有一些使用 SVNKit 的工具 我们想继续使
  • 如何在android中将AutoCompleteTextView与RecyclerView.Adapter一起使用但不与ArrayAdapter一起使用

    我有一个需要实施自动建议的情况 为此 我一直在尝试使用自定义的 RecyclerView Adapter 但问题是 AutoCompleteTextView 似乎是为 BaseAdapter 及其子类制作的 因此 适配器不被接受 还有其他方
  • Asp.net Web API - 从actionfilter返回数据

    我想从 Web api 操作过滤器返回一个 json 对象 我怎样才能实现这个目标 我可以从操作返回对象 但我需要在某些条件下从操作过滤器返回一些数据 提前致谢 编辑 1 当我更改如下代码时 浏览器仍在加载而没有任何响应 并以超时错误结束
  • 验证用户输入/为 .NET 控件提供状态 OK 或 NOK

    我正在考虑验证用户输入的最佳方法 让我们想象一下一些文本框 复选框或您喜欢的任何 NET 控件 其中必须将用户输入验证为 OK 或 NOK 一旦用户填写了所有必填字段 他就通过按钮提交 现在我必须知道哪些字段之前被确认为 OK 哪些字段被确
  • ReactJS - 如何让 onFocus 和 onBlur 工作

    据我了解 onFocus单击输入框时应调用 并且onBlur当其他事情成为焦点时应该调用 我的意图 我想调用一个函数 当通过单击激活时 它将 concat焦点输入框的消息字符串 但我无法获取onFocus or onBlur上班 从我周围搜
  • 通过按键和scrollTo插件向下滚动到下一个元素 - jQuery

    我正在使用 jQuery 的scrollTo http flesler blogspot com 2007 10 jqueryscrollto html插件使用向上箭头和向下箭头向上和向下滚动我的页面 我有一堆带有 screen 类的 di
  • 如何使用 Eclipse 的 google 插件使用经过精心编译的 HTML 来部署 GWT 应用程序

    我使用 eclipse 的 google 插件来部署我的 GWT 应用程序 到目前为止它运行良好 部署操作首先使用 混淆 输出样式编译我的 GWT 项目 现在我希望它更改为 漂亮 因为我必须调试客户端在运行中 我只是看不到混淆的堆栈 Tha
  • PHP MySQLi 权限被拒绝,但可以从 MySQL CLI 运行

    我收到错误 Failed to connect to MySQL Permission denied 当从 PHP 与 MySQL MySQLi 和 PDO 连接到远程 MySQL 主机时 但是 如果我从同一主机在命令行上使用相同的凭据通过
  • Android - StaggeredGrid错误项目处理

    我的 Recycler 视图和 StaggeredGrid 有问题 它将宽度减少了 2 我使用 Picasso 将图像加载到项目中 当我第一次加载图像时 它们在回收器视图中的处理方式很奇怪 重新加载后 一切似乎都很好 我认为问题来自图像加载
  • 调用 sdp_record_register() 时出现分段错误

    我正在尝试使用 BlueZ 在 SDP 中注册我的蓝牙服务 我跟随this http people csail mit edu albert bluez intro x604 html教程 代码编译成功 但当我运行它时 出现分段错误 即使是
  • 如何从 d3 导入子模块以轻松创建图例?

    我对 JavaScript 和 D3 比较陌生 所以请记住这一点 我创建了一个可视化来显示仓库中特定位置的访问频率 并希望使用连续色标添加图例 我看过几个街区 可能会想出一些离题的东西 但是我遇到了this https observable
  • /usr/local/lib 中未找到共享库

    我不明白 我通常安装第三方软件 usr 本地因此库被安装到 usr local lib 中并且链接到这些库从来没有出现问题 但现在它突然不再起作用 gcc lkaytils o test test c usr bin ld gold rea
  • Django 和通用访问卡 (CAC)

    计划用 Python 编写 Web 应用程序 Django 是框架的领先竞争者 一项要求是 CAC 访问 无需手动输入用户名和密码 据我所知 CAC 访问不是 Django 包含的 电池 的一部分 作为一个整体框架 不一定是坏属性 Djan
  • 具有内边缘的 SpriteKit SKPhysicsBody

    我创建了一个SKSpriteNode比如说Map它有一个我定义的边缘路径 一些简单的多边形形状 我想弄清楚的是如何添加几个other将充当内部边缘的边缘路径Map 就好像整个 地图 实际上确实有holes 某种内部边界形状可以与Map整体