IOS SpriteKit 碰撞检测:重置对象的位置

2023-12-08

我正在研究碰撞检测,希望当 Object1 向下移动屏幕并最终击中 Object2 时,它会触发 didBeginContact 方法,进而触发 Object1 上的 ResetPosition,这将使 Object1 返回屏幕顶部。我使用 NSLogs 进行测试,以确保程序是否到达 didBeginContact 方法,并且确实如此。最重要的是,该程序还通过调用的方法(resetPosition)来工作。唯一的问题是,它不会改变 Object1 的位置。我尝试看看是否可以在touchesBegan方法中调用resetPosition方法,并且它有效。 Object1 的位置实际上被重置。在 didBeginContact 方法中可以执行的操作是否有限制?如果是这样,实现我的预期目标的最佳方法是什么?

这是我的 didBeginContact 方法的示例:

-(void)didBeginContact: (SKPhyicsContacts *)contact { 
SKPhysicsBody *firstBody, *secondBody;
if(contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask){
    firstBody = contact.bodyA;
    secondBody = contact.bodyB;
} else {
    firstBody = contact.bodyB; 
    secondBody = contact.bodyA;
}

if(firstBody.categoryBitMask == Category1 && secondBody.categoryBitMask == Category2){
    NSLog(@"Collision Detected!");
    [Object1 resetPosition];
}

为了澄清任何混淆,Category1 对应于 Object1,Category2 对应于 Object2。

以下是 Object1 类中的 ResetPosition 方法的示例:

-(void)resetPosition{
    self.position = CGPointMake(0, 200);
    NSLog(@"Reached Method!");
}

你应该看看run loop。在完成物理模拟之前不会绘制任何内容。所以我想像你所做的那样改变位置会被物理模拟覆盖。

这是运行循环的顺序:

  • 更新被称为
  • 场景评估动作
  • didEvaluateActions 被调用
  • 物理模拟在这里
  • didSimulatePhysics 被调用
  • 场景应用约束
  • didApplyConstraints 被调用
  • didFinishUpdate 被调用
  • 渲染帧

我敢打赌,如果您在 didSimulatePhysics 中移动节点的重新定位,而不是在 didBeginContact 中进行,那么一切都会正常。我猜发生这种情况是因为您试图在模拟完成之前更改节点的位置。您可以尝试以下代码(查看 didSimulatePhysics 部分):

#import "GameScene.h"

typedef enum uint_8{
    ColliderWall = 1,
    ColliderPlayer = 2,
    ColliderBrick =  4
}CollisionCategory;


@interface Object1 : SKSpriteNode

@end

@implementation Object1

-(instancetype)initWithColor:(UIColor *)color size:(CGSize)size{

    if(self = [super initWithColor:color size:size]){


        self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:size];

        self.physicsBody.categoryBitMask = ColliderPlayer;
        self.physicsBody.contactTestBitMask = ColliderBrick;
        self.physicsBody.collisionBitMask = ColliderBrick | ColliderWall;
        self.physicsBody.dynamic = YES;
        self.physicsBody.affectedByGravity = YES;
        self.physicsBody.allowsRotation = NO;

    }
    return self;
}



@end

@interface GameScene  ()<SKPhysicsContactDelegate>

@property (nonatomic, strong) Object1 *player;
@property (nonatomic, strong) SKSpriteNode *brick;

@property (nonatomic, assign) BOOL shouldMove;

@end

@implementation GameScene

-(void)didMoveToView:(SKView *)view {
    /* Setup your scene here */

    _shouldMove = NO;

    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
    self.physicsBody.contactTestBitMask = 0;
    self.physicsBody.collisionBitMask =  ColliderPlayer;
    self.physicsBody.categoryBitMask = ColliderWall;

    self.physicsWorld.contactDelegate = self;

    _player = [[Object1 alloc] initWithColor:[SKColor greenColor] size:CGSizeMake(50,30)];
    _player.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMaxY(self.frame)- _player.size.height-30);
    [self addChild:_player];

    _brick = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(330,80)];
    _brick.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_brick.size];
    _brick.position = CGPointMake(CGRectGetMidX(self.frame),100);
    _brick.physicsBody.contactTestBitMask = ColliderPlayer;
    _brick.physicsBody.collisionBitMask = ColliderPlayer;
    _brick.physicsBody.categoryBitMask = ColliderBrick;
    _brick.physicsBody.affectedByGravity = NO;
    _brick.physicsBody.dynamic = NO;

    [self addChild:_brick];


}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */

    for (UITouch *touch in touches) {

        [self.player.physicsBody applyImpulse:CGVectorMake(0,55)];

    }
}

-(void)didBeginContact:(SKPhysicsContact *)contact{

    NSLog(@"Contact");

    self.shouldMove = YES;

}

-(void)didSimulatePhysics{

    if(self.shouldMove){


        self.player.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMaxY(self.frame)- _player.size.height-30);


        self.shouldMove = NO;
    }
}


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

IOS SpriteKit 碰撞检测:重置对象的位置 的相关文章

  • 自动生成的 Swift 桥接标头中“找不到接口声明”

    我当前的项目包含 Swift 和 Objective C 代码 两种类型的源文件都使用另一种语言的代码 当我进行完全清理并重新编译时 几乎每个 Swift 类声明都出现错误Module Swift h 形式为 Cannot find int
  • 从应用程序内发送电子邮件中的图像和文本

    如何从我的应用程序内通过电子邮件发送图像和文本 表格数据形式 请大家帮忙并提出建议 谢谢 void sendMailWithImage UIImage image if MFMailComposeViewController canSend
  • Objective-C 头解析

    我需要解析一些 Objective C 标头 我尝试过使用Doxygen并解析 XML 输出 但它不完全支持没有注释的 Objective C 标头 它会阻塞属性中定义的宏 请检查Doxygen 无法正确识别属性 https stackov
  • 尝试使用 Xcode 的新 UI 测试运行多个测试失败

    当我尝试在新的 Xcode beta 中同时运行多个 UI 测试时 它在第一次测试后失败 并在第一次测试后的每个测试中出现错误 UI 测试失败 应用程序状态仍未终止 有人解决这个问题了吗 我也遇到过同样的问题 看来 至少就我而言 应用程序从
  • iOS通过AVAssetWriter反转音频

    我正在尝试使用 AVAsset 和 AVAssetWriter 在 iOS 中反转音频 以下代码可以正常工作 但输出文件比输入文件短 例如 输入文件的持续时间为 1 59 但输出文件的持续时间为 1 50 且音频内容相同 void reve
  • 我可以在滚动时固定表格的 tableHeaderView 位置吗?

    我有一个表视图 并在其 tableHeaderView 上附加了一个 UISegmentedControl 如何使 tableHeaderView 固定 以便即使在滚动表视图时也始终可以在同一位置查看 UISegmentedControl
  • 三.js、PointerLock和碰撞检测

    我正在开发一个 3D 虚拟家庭项目 除了碰撞检测之外 一切正常 我使用 PointerLockControls 来控制相机和移动 但我不确定如何检测每个可能方向的碰撞 为简单起见 我从与 0 0 0 上的简单立方体的向前和向后碰撞开始 ra
  • Objective-C 语法是什么,椭圆式点表示法? “……”

    我在 Joe Hewitt 的 Three20 源代码中注意到了这一点 而且我以前从未在 Objective C 中见过这种特殊的语法 甚至不知道如何在适当的谷歌搜索中引用它 来自 UITableViewDataSource TTSecti
  • 如何使用 UISlider 以及如何将滑块设置为特定值?

    我是第一次使用 UIslider 首先我想知道如果值的范围是 0 到 10 如何获取滑块位置的值 其次 我希望我的滑块设置为 5 个不同的值 如 1 2 3 4 5 slider should not set between the lab
  • 播放声音无延迟 iOS

    我找不到如何以低延迟播放真实声音的方法 我尝试使用 AVFoundation 音频播放器 巨大的延迟大约 500 毫秒 所以我尝试创建系统声音 如果运气不好 延迟大约为 200 毫秒 虽然不多 但对我来说没有用 我最多需要 50 毫秒 确保
  • Sprite Kit - 确定轻弹精灵的滑动手势矢量

    我有一个游戏 圆形物体从屏幕底部射出 我希望能够滑动它们以将它们朝我滑动的方向轻弹 我的问题是 我不知道如何计算滑动的矢量 方向 以便使圆形物体以适当的速度向正确的方向轻拂 我使用的静态矢量 5 5 需要通过滑动速度和滑动方向来计算 另外
  • 允许用户从 UILabel 选择文本进行复制[重复]

    这个问题在这里已经有答案了 我有一个 UILabel 但如何允许用户选择其文本的一部分 我不希望用户能够编辑文本 也不希望标签 文本字段具有边框 这是不可能的UILabel 你应该使用UITextView为了那个原因 只需使用禁用编辑即可t
  • 设置使用 iPhone 相机拍摄的图像的类型

    如果我们使用 iPhone 相机拍摄照片 图像将默认以 JPEG 格式保存 我想以其他格式 例如 PNG 保存捕获的图像 是否可以 当我们从应用程序调用 iPhone 相机时 是否可以通过代码执行此操作 我们可以设置捕获图片后必须保存的图像
  • UITextField 字体大小在开始或停止输入字符时发生变化

    我见过很多线程 但没有找到解决这个问题的任何具体解决方案 我使用 XIB 创建了 UITextfield 尚未以编程方式对该字段执行任何操作 一旦我开始打字 文本字段的字体就会改变 一旦我将焦点移出文本字段 并且随着键盘消失 字体大小就会减
  • 使用 NSSet/NSMutableSet 来过滤对象?

    我已经看到一些有关使用 NSSet NSMutableSet 过滤对象的问题 答案 这些情况使用简单类型的对象 例如NSString or int 以下是用于过滤的代码示例NSString对象 NSSet smallArray NSSet
  • 我可以在 NS_SWIFT_NAME 中使用保留关键字吗?

    我正在尝试使 Objective C 委托协议更漂亮以便在 Swift 中使用 但我在弄清楚如何使用时遇到了一些麻烦NS SWIFT NAME 是否可以使用NS SWIFT NAME指定 Swift 名称中与 Objective C 关键字
  • Objective-C 实例变量?

    我确信我在这里的困惑只是因为陷入 Java 思维方式 并且不理解 Obj C 在这种情况下有何不同 在Java中 我可以在类中声明一个变量 就像这样 并且每个instance该类的 将会有它自己的 MyClass String myVar
  • 如何等待 webViewDidFinishLoad 完成

    我有一个初始化 webView 的布尔条件 并在 webViewDidFinishLoad 中加载另一个委托 以便在完成完成后触发 但是 由于布尔值在条件 webViewDidFinishLoad 之前返回 因此页面永远不会完全加载 如何确
  • 如何使用 ZBar 读取器的 scanCrop 属性?

    我正在使用 iPhone 的 ZBar SDK 来扫描条形码 我希望阅读器仅扫描特定的矩形而不是整个视图 为此需要将阅读器的 scanCrop 属性设置为所需的矩形 我很难理解必须设置的矩形参数 有人可以告诉我如果在纵向视图上它的坐标是 我
  • 增加 NSData 的长度

    基本上 我有一个 46 个字符的 NSString 我将其转换为 NSData 我需要将字符串填充到 48 个字符 仅在 NSString 末尾添加 是行不通的 所以 我只是使用以下方法增加了 NSData 的长度 NSString str

随机推荐

  • MYSQL 截断了不正确的 DOUBLE 值

    当执行下面的 SQL 查询时 UPDATE shop category SET name Secolul XVI XVIII AND name eng 16th to 18th centuries WHERE category id 476
  • Apache 无法确定 docker 容器上的服务器名称

    我正在尝试为现有站点设置自定义的 Docker 容器 为此 我想提供我自己的定制vhost配置与ServerName 但是当我尝试添加自定义vhost configuration并重新启动 apache 我收到警告 Apache 无法确定全
  • Android 设备 GPS 以编程方式打开/关闭

    我正在使用以下代码来打开 关闭 GPS Enable GPS Intent intent new Intent android location GPS ENABLED CHANGE intent putExtra enabled true
  • 你能改进 F# 中的“代码行算法”吗?

    我编写了一个小脚本来迭代文件夹中的文件以计算代码行数 该脚本的核心是这个函数 用于计算空白 注释和代码的行数 请注意 目前它是针对 C 定制的 不支持多行注释 它对我来说看起来不太好 有人有更干净的版本吗 from list of stri
  • UTC 和 GMT 有什么区别?

    我对时区有一些疑问 可以单独以 UTC 捕获时间吗 UTC 6 和 GMT 6 是否相同 这是否意味着它是美国当地时间 比如说 我的 UTC 时间为 02 01 2018 00 03 这是否意味着我的美国当地时间是 01 01 2018 1
  • 抽象类可以代替接口吗? [复制]

    这个问题在这里已经有答案了 在 Java 中 您可以创建仅包含抽象方法的抽象类 另一方面 您可以创建一个声明相同方法的接口 既然如此 能不能用抽象类来代替接口呢 不总是 一个类可以扩展only one class 一个类可以实现超过一个界面
  • 使用@View注解与在@Component注解中指定参数

    在 Angular io 文档中 它说 每个 Angular 组件都需要一个 Component 和至少一个 View 注释 LINK但即使是它的示例 也没有使用 View 注释 我的问题是 使用 View或在 Component注解中指定
  • 为什么 setnames() 会影响复制的表?

    我想创建 data table 的副本并更改新表中的列名称 当我更改 y V1 的名称时 x V1 的名称也会更改 为什么会这样 我该如何避免这种行为 Example x lt data table c 1 2 3 c 1 2 3 y lt
  • 无法打开 .accdb 文件,因为 Access 正在查找硬编码路径

    我收到了几个 accdb来自客户端的文件 我正在尝试打开它们Microsoft Access 2013 这些文件似乎可以正确打开 但每当我单击左侧的任何表或查询时 我都会收到以下错误消息 C hard coded path on clien
  • 请求 READ_SMS 权限后,包安装程序在 Android M 中崩溃

    我有一个尝试访问的登录片段 TelephonyManager getActivity getSystemService Context TELEPHONY SERVICE 这适用于 Lollipop 5 1 及以上版本的设备 当我在 Mar
  • Elasticsearch:“术语”、“匹配短语”和“查询字符串”之间的区别

    Elasticsearch 新手 尝试更好地理解这些查询之间的差异 据我所知 term匹配单个术语 需要小写才能匹配 并且两者match phrase and query string匹配一个文本字符串 term查询按原样匹配单个术语 值为
  • 如何使用jquery文件上传调整图像客户端大小

    我在用blueimp jquery 文件上传在 Rails 3 2 应用程序中 通过jquery 文件上传 rails gem 我试图在上传之前在客户端调整图像大小 但在遵循文档时遇到问题 我的代码如下 目前上传工作正常 但图像大小未调整
  • 在 Woocommerce 产品排序依据中添加按修改日期排序

    在 woocommerce 中 我想添加在商店和档案页面中按 修改日期 对产品进行排序的可能性 如何在 woocommerce 产品排序下拉列表中添加 按修改日期排序 任何帮助表示赞赏 这可以通过以下代码轻松完成 该代码将添加按修改日期排序
  • 生成随机数的问题[重复]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 亲爱的朋友们 我想生成 1 55 之间的 4 个随机数 但问题是大多数时候我收到 2 个相同的数字 例如生成的数字是 2 2 5 9 或 11 11 22
  • `scanf("%*[^\n]%*c")` 是什么意思?

    我想在 C 中创建一个循环 当程序要求输入整数并且用户输入非数字字符时 程序会再次要求输入整数 我刚刚找到下面的代码 但我不明白这意味着什么scanf n c 什么是 n意思是 什么是 before n and c mean This pr
  • 灯光 USB OpenDMX FTD2XX DMXking

    几个简单的问题 我有一个 DMX king USB 照明控制器 我正在尝试控制它 它基于 Open DMX 协议 来自 Entec 该协议提供了一个 C 类 我已将设备插入 RGB 罐 如果我使用其驱动程序测试 USB 设备 它会连接到 C
  • C++ 中的继承构造函数

    我正在尝试练习继承构造函数在C 中 我已经在 gcc 中编译并运行了以下程序 并且运行良好 include
  • 参数拦截器错误:捕获意外异常,设置表达式错误

    我在表单中有一个表格 其中包含下拉菜单和隐藏的input JSP
  • 如何创建 Maven uber jar,其中包含提供范围的依赖项

  • IOS SpriteKit 碰撞检测:重置对象的位置

    我正在研究碰撞检测 希望当 Object1 向下移动屏幕并最终击中 Object2 时 它会触发 didBeginContact 方法 进而触发 Object1 上的 ResetPosition 这将使 Object1 返回屏幕顶部 我使用