有没有一种简单的方法可以暂时禁用 Swift 中精灵的物理体? (雪碧套件)

     2023-03-10     131

关键词:

【中文标题】有没有一种简单的方法可以暂时禁用 Swift 中精灵的物理体? (雪碧套件)【英文标题】:Is there a simple way to temporarily disable the physics bodies for a sprite in Swift? (SpriteKit) 【发布时间】:2019-12-05 23:54:56 【问题描述】:

我正在制作一个迷宫应用程序,它会在完成一个迷宫后生成一个新迷宫。显然,我可以通过执行我在代码wall[location].isHidden = true 中所做的操作来使墙壁(每个墙壁都有自己的物理和精灵存储在数组上的位置)不可见,但我找不到对物理身体绑定在墙上,创造了一个无形的墙。有没有一种简单的方法可以做到这一点而不将其设置为 nil?

澄清一下,并不是我不希望它是动态的,我只是希望在解决迷宫时整个事情都不存在。 另外,我不想将它设置为 nil 的唯一原因是因为我不知道如何以简单的方式恢复它的旧物理体。

【问题讨论】:

【参考方案1】:

首选方法是从节点树中物理移除墙。这将提高性能,因为系统不必检查不必要的节点。

只要确保您的墙在移除时被保留,以便您可以在需要时阅读它。

wall[location].removeFromParent()    

...

scene.addChild(wall[location])

【讨论】:

这正是我想要的,可惜我已经完成了任务。【参考方案2】:

当然

刚刚设置

isDynamic = false
wall.physicsBody?.collisionBitMask = 0
wall.physicsBody?.contactTestBitMask = 0

这几乎将 SKPhysicsBody 与系统的其余部分隔离开来。你有任何 SKJoints 连接到你的身体节点吗?如果你这样做,这可能会很尴尬。

或者你可以将它设置为 nil

wall.physicsBody? = nil

然后在你准备好的时候再做一个方法来设置它

 func addPhysics() 
    wall.physicsBody = SKPhysicsBody(circleOfRadius: 5)
    wall.isDynamic = true
    wall.physicsBody?.collisionBitMask = whatever
    wall.physicsBody?.collisionBitMask = whatever
    wall.physicsBody?.contactTestBitMask = whatever
  

如果您确实设置为 nil 然后恢复它,请确保您在游戏循环的开始或结束时执行此操作。

在 gameScene 中的任一覆盖方法中

override func update(_ currentTime: TimeInterval) 



override func didFinishUpdate() 


希望对你有帮助

【讨论】:

我想避免使用我在其他地方找到的“nil”选项,因为由于我的做法,将物理重置到我的墙壁上会非常困难。如果可行,我将尝试另一种方法并将其标记为“答案”。 在尝试了你的方法后,很遗憾没有奏效。仅供参考,根本没有发生碰撞,只是让我的玩家立方体撞到墙上而不是移动。 在没有找到其他方法后,我使用了你描述的“nil”,它有效,只是很多额外的代码。 出于兴趣,为什么仅仅禁用physicsBody的碰撞和接触还不够? 我猜他正在调整墙壁纹理的大小,当他完成时,物理体不再匹配形状。 ?不知道真的只是猜测【参考方案3】:

您已经有了答案,但另一种方法可能是使用一个名为 inactivePhysicsBody(或类似)的额外属性(即“SKPhysicsBody”)对 SKSpriteNode 进行子类化。

当您想“关闭”该节点的物理特性时,请将inactivePhysicsBody 属性设置为physicsBody,然后将physicsBody 设置为nil。然后,您可以在必要时轻松恢复物理体。

或者你可以在新类中添加方法来做同样的事情:

wall.activatePhysicsBody()
wall.inactPhysicsBody()

【讨论】:

嗯 - 这行不通,对吧,因为 PB 仍然存在;它只是不会连接到墙上。您可以扩展子类中的方法,以将不活动的 PB “移动”到安全位置或禁用碰撞和接触。 取决于您何时删除它。只要它不在物理阶段,这应该有效。身体是相对于节点的,所以没有节点,身体就不会出现在场景中。 另外,不需要子类。使用扩展 + userData【参考方案4】:

给拥有精灵的对象一个对精灵物理体的“额外”引用,例如:

init(sprite: SKSpriteNode) 
    self.sprite = sprite
    self.physicsBody = sprite.physicsBody
    super.init()

然后您可以将self.sprite.physicsBody 设置为self.physicsBodynil 以打开/关闭对象的物理。我个人会避免在这里继承子类,但 YMMV。

【讨论】:

暂时禁用 Spring Security (ldap auth)

...配置。必要时提供文件。出于演示/测试等目的,我需要一种方法来 查看详情

斯威夫特:有没有一种简单的方法来绘制形状并检测它们是不是相交? [复制]

】斯威夫特:有没有一种简单的方法来绘制形状并检测它们是不是相交?[复制]【英文标题】:Swift:Isthereaneasywaytodrawshapesanddetectwhethertheyintersect?[duplicate]斯威夫特:有没有一种简单的方法来绘制形状并检测它们是否相交?[复制]... 查看详情

IOS swift TableView有没有一种方法可以重用它们

】IOSswiftTableView有没有一种方法可以重用它们【英文标题】:IOSswiftTableViewisthereawayIcanreusethem【发布时间】:2017-03-2922:05:55【问题描述】:我是IOS开发新手,正在使用swift3.0。我有2个具有相同布局的自定义TableView。唯一的区别是... 查看详情

有没有一种方法可以使用 swift 在 alertview 内的文本字段中提供验证

】有没有一种方法可以使用swift在alertview内的文本字段中提供验证【英文标题】:Isthereawayofprovidingvalidationinthetextfieldwhichisinsidealertviewusingswift【发布时间】:2016-09-2607:05:14【问题描述】:我有一个警报视图,它显示一个用户必须... 查看详情

我似乎没有找到 App Transport Security,所以我可以暂时禁用它

】我似乎没有找到AppTransportSecurity,所以我可以暂时禁用它【英文标题】:IdontseemtofindAppTransportSecuritysothatImaydisableittemporarily【发布时间】:2020-05-1414:40:32【问题描述】:我是iOS应用开发的新手。我需要禁用AppTransport安全性,以... 查看详情

有没有一种方法可以在不使用 Xcode 11 在 iPhone 上构建 UI 的情况下测量 Swift 的性能? [关闭]

】有没有一种方法可以在不使用Xcode11在iPhone上构建UI的情况下测量Swift的性能?[关闭]【英文标题】:isthereawaytomeasureSwift\'sperformancewithoutbuildingUIoniPhonewithXcode11?[closed]【发布时间】:2020-03-1220:43:17【问题描述】:我需要测量不同sw... 查看详情

有没有一种简单的方法可以删除应用小部件中的文本?

】有没有一种简单的方法可以删除应用小部件中的文本?【英文标题】:Isthereaneasywaytostrikethroughtextinanappwidget?【发布时间】:2011-04-2208:18:48【问题描述】:我想知道是否有一种简单的方法可以在Android的应用小部件中删除文本。... 查看详情

有没有一种简单的方法可以在 C# 中创建序数?

】有没有一种简单的方法可以在C#中创建序数?【英文标题】:IsthereaneasywaytocreateordinalsinC#?【发布时间】:2010-09-0610:00:03【问题描述】:在C#中是否有一种简单的方法可以为数字创建Ordinals?例如:1返回第一个2返回第二个3返回... 查看详情

有没有一种简单的方法可以在节点模块中加载 json?

】有没有一种简单的方法可以在节点模块中加载json?【英文标题】:Isthereaneasywaytoloadjsoninanodemodule?【发布时间】:2021-10-3100:35:15【问题描述】:在您阅读下面我的冒险之前,我正在寻找一种在模块中加载json凭据的简单方法。我... 查看详情

有没有一种简单的方法可以在 Symfony 中获取 ServerName?

】有没有一种简单的方法可以在Symfony中获取ServerName?【英文标题】:IsthereaneasywaytogettheServerNameinSymfony?【发布时间】:2011-03-0213:31:11【问题描述】:我一直在寻找一种简单的方法来获取在Symfony中运行Symfony的机器的ServerName(以... 查看详情

有没有一种简单的方法可以查看 PHP 信息?

】有没有一种简单的方法可以查看PHP信息?【英文标题】:IsthereaneasywayofseeingPHPinfo?【发布时间】:2011-11-0315:24:42【问题描述】:每次我想看到phpinfo();我必须:创建info.php文件;在里面写上phpinfo();。转到浏览器并输入我的“thispr... 查看详情

有没有一种简单的方法可以为 Kivy 按钮添加边框

】有没有一种简单的方法可以为Kivy按钮添加边框【英文标题】:IsthereasimplewaytoaddabordertoKivyButtons【发布时间】:2019-02-1800:42:03【问题描述】:我正在使用python-2.7和kivy。有人可以告诉我如何为kivy按钮添加不同颜色的边框。test.pyf... 查看详情

有没有一种简单的方法可以使用 jQuery 淡入 css :hover 背景?

】有没有一种简单的方法可以使用jQuery淡入css:hover背景?【英文标题】:IsthereaneasywaytousejQuerytofadeinacss:hoverbackground?【发布时间】:2011-06-1608:11:26【问题描述】:我有一个带有CSS的IMG,它使用:hover来显示背景。有没有一种简单的... 查看详情

有没有一种简单的方法可以从本地 gradle 缓存中删除一个依赖项?

】有没有一种简单的方法可以从本地gradle缓存中删除一个依赖项?【英文标题】:Isthereasimplewaytoremoveonedependencyfromthelocalgradlecache?【发布时间】:2016-07-3003:51:34【问题描述】:本地gradle缓存存储maven/gradle依赖项的副本。Howtocleargra... 查看详情

有没有一种简单的方法可以找出问题何时关闭

】有没有一种简单的方法可以找出问题何时关闭【英文标题】:isthereaneasywaytofindoutwhenanissuewasclosed【发布时间】:2016-07-1913:09:05【问题描述】:我正在为我的公司研究是否应该迁移到gitlab(来自github)..github的问题api似乎非常rich... 查看详情

有没有一种简单的方法可以确定用户在哪个半球?

】有没有一种简单的方法可以确定用户在哪个半球?【英文标题】:Isthereaneasywaytodeterminewhichhemisphereauserisin?【发布时间】:2011-10-2002:00:52【问题描述】:我正在开展一个包含季节性内容的项目,我们正在考虑确定用户的位置,... 查看详情

有没有一种简单的方法可以让烧瓶中的会话超时?

】有没有一种简单的方法可以让烧瓶中的会话超时?【英文标题】:Isthereaneasywaytomakesessionstimeoutinflask?【发布时间】:2012-07-3118:03:55【问题描述】:我正在使用烧瓶建立一个网站,用户拥有帐户并能够登录。我正在使用烧瓶主体... 查看详情

有没有一种简单的方法可以将 C# 类转换为 PHP?

】有没有一种简单的方法可以将C#类转换为PHP?【英文标题】:IsthereaneasywaytoconvertC#classestoPHP?【发布时间】:2010-09-0600:46:48【问题描述】:我习惯于编写C#Windows应用程序。但是,我有一些免费的托管PHP网络空间,我想使用它们。... 查看详情