问题标签 [skphysicsworld]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1414 浏览

swift - 为什么 SceneKit 的物理世界 didBeginContact 会为一次碰撞多次触发?

我正在使用 SceneKit 的physicsBody 系统来检测对象之间的碰撞,并得到一些非常奇怪的结果。为了说明,我有一个最小的例子,它产生了两个带有运动物理体的球体,并将它们沿直线移动,以便它们短暂重叠。

我希望看到physicsWorld(:didBeginContact:) 在球体第一次重叠时只被调用一次,而当它们停止重叠时physicsWorld(:didEndContact:) 被调用一次。相反,我看到每个函数被调用了 25 次!

下面是要重现的代码: 在 Xcode 8.0 中,使用“Game”模板创建一个全新的项目。将 GameViewController.swift 的内容替换为:

还有其他奇怪的事情正在发生。如果我稍微改变其中一个球体的初始位置,将 y 位置从 -0.9 移动到 -0.8:

现在我得到了预期的行为,一个呼叫开始,一个呼叫结束!稍微不同的碰撞角度会导致完全不同的行为。

这可能是 SceneKit 错误还是这实际上是预期的行为?

0 投票
1 回答
140 浏览

swift - 使用 SKPhysics 在 iPad Pro 12.9 上设置屏幕边界

我正在尝试为 iPad Pro 12.9 创建物理边界

这就是我的做法:

但是 Y 在横屏中的距离很远(远低于和高于实际屏幕),而在竖屏中则稍有偏差。但 X 在两者中都是正确的。

我不知道我做错了什么。

更新

我在上面添加了一个打印,它显示 self.frame 的 maxX 和 maxY 分别为 375 和 667。在横向模式下。据我所知,这些数字都不是应该的,但是 X 值正常工作,而 Y 远离屏幕的顶部和底部。

此 iPad 型号的屏幕分辨率为 2732x2048(以点为单位的一半),因此我看不出这些数字与报告的帧大小之间存在相关性。

0 投票
2 回答
412 浏览

swift - didBeginContact 没有被称为 Swift

我正在开发一个应用程序,当中心球的颜色与朝中心球颜色飞行的较小球匹配时,玩家得分。所以为了这个工作,我需要在“敌人”和“主球”发生碰撞时调用 didBeginContact 函数。唯一移动的是敌方球,因为它飞向静止的 mainBall 我相信我已经正确设置了位掩码,但是没有调用 didBeginContact 函数。有人可以帮忙吗?

这是我的代码

0 投票
1 回答
51 浏览

swift - didBeginContact 错误触发

在我的游戏中,我有从一个点向前发射的激光。我使用此代码拉伸激光精灵并移动它以模拟更新函数中的运动:

一切看起来都很好——激光从一个点射出,view.showPhysics 中的物理体轮廓完全符合。但是,当玩家没有接触到激光时,didBeginContact 有时会被错误触发。为什么会这样?

编辑:

激光物理体:

玩家物理身体:

所以它们被设置为当它们碰撞时调用 didBeginContact ,并且确实如此。我遇到的问题是,当玩家没有联系时,didBeginContact 有时也会被调用。我目前的假设是我的运动代码在不可见的瞬间或某事上错放了激光的物理体。

我在 didBeginContact 中设置了一个断点并截取了屏幕截图。碰撞的物体是船和穿过角落的激光。

0 投票
0 回答
148 浏览

swift - 如何更改 Sprite Kit 中粒子效果的物理世界速度?

我使用编辑器创建了粒子效果,但我的应用程序是用所有代码 (Swift) 完成的。当我改变物理世界的速度时,我所有的物理体都会减速。但是当我把我的粒子变成一个物理体时,它们不会受到速度变化的影响,即使它们应该是同一个物理世界的一部分。我使粒子是动态的并受重力影响,但仍然没有。我什至尝试给它们一个 bitMaskCategory ,它们实际上会受到我的重力节点的影响,但是它们仍然不受physicsWorld.speed 的影响。

任何人都知道如何做到这一点?我知道这是可能的,但我错过了一些东西。我真的不想为粒子制作单独的重力节点来模仿世界其他地方的速度。

0 投票
2 回答
100 浏览

ios - 调整 SKPhysicsBody 边缘的大小并将孩子留在里面

我有一个SKPhysicsBodySKPhysicsBody(edgeLoopFrom:...). 在那个物理体内是一堆弹跳的球。当出现通知时,我会从屏幕底部显示一个视图。我想调整SKPhysicsBody它的大小,以便球在屏幕上时从这个通知视图反弹。

我现在做的是

换句话说,我只是用具有新维度的新物理体替换旧物理体。这是可行的,除了如果任何球在旧维度和新维度之间的区域内,它们就会被困住并从墙外反弹并掉出世界。

是否有一种优雅的方式来为新旧墙边界之间的过渡设置动画,这样位于底部的任何球都被“扫”到新的尺寸中,并保证留在墙内?您不能SKPhysicsBody直接缩放.

0 投票
0 回答
302 浏览

sprite-kit - 尽管设置了碰撞位掩码,SpriteKit 物理实体仍会相互移动

我正在制作一个使用 Doodle Jump 的游戏,比如跳跃,如果你向上移动,你可以通过平台,但如果你向下移动,则不能,除非有一个地面平台始终存在。你永远无法进入这个地面平台。然而,如果玩家移动得足够快,玩家就会像图片中那样穿过地面平台:

在此处输入图像描述

更令人困惑的是,这种情况只发生在跳跃的五分之一左右,而且只发生在地面平台上,与更高的平台相同。另一件不寻常的事情是,如果玩家在地下,即使图像完全在地下,它仍然可以正确检测到击中敌人,就好像它在地上一样,这让我觉得物理体和图像不知何故不是' t 同步。

我使用 staticSKPhysicsBody来代表平台和地面,并使用 dynamicSKPhysicsBody来代表玩家。我有platform.physicsBody?.collisionBitMask = PhysicsCategory.Player平台和player.physicsBody?.collisionBitMask = PhysicsCategory.Platforms播放器的。我也有physicsBody?.usesPreciseCollisionDetection = true。两者都使用矩形来实现它们的物理体,平台的厚度为 2。

我已经尝试了一切,似乎没有什么能够解决这个问题。我什至尝试检查这是didSimulatePhysics().

didSimulatePhysics()正确检测到何时发生这种情况,但是当我尝试调整 player.position.y 时,它根本不会更新它并且仍然被困在地下!

关于这里发生了什么的任何想法?我无计可施。先感谢您!

0 投票
2 回答
40 浏览

swift3 - 如何使用 if 语句增加重力

我已经设置了我的重力,所以在我的游戏开始时,物体下落的速度很慢,当玩家收集这些物品时,我希望重力增加。

我已经像这样设置了重力,但我不确定如何使用 if 语句对其进行编辑。例如,如果分数 = 20,重力会增加。对于如何正确执行此操作,任何帮助都会非常有用

0 投票
1 回答
45 浏览

ios - 线程分配不一致 iOS11 / Spritekit / Physicsbody 意味着低 FPS

我一直在使用 iOS11 / Swift4 下的 PhysicsWorld(一个基本的粒子系统)运行一个简单的多体(800)2x2 像素 SpriteKit 模拟。

它包含一个简单的径向重力节点,有 800 个物体围绕它运行,没有使用碰撞或接触检测。

在我的测试硬件上,iPhone6S——60FPS 和超级流畅的模拟给我留下了深刻的印象——这为更多探索开辟了道路。

我遇到的唯一问题是性能确实不一致。

如果我将重力节点的场强切换到运行中的高值(意味着对象移动得更快) - 在大约 25% 的运行中,模拟可以得到 60FPS 没有问题,但在 4 次运行中的其他 3 次运行中,帧率下降到 3-4FPS

如果我恢复到低场强(较慢的运动),那么它总是再次获得 60FPS。

我在 XCode 中进行了分析 - 并且可以看到有时为应用程序提供了 3 或 4 个线程,提供 60FPS,但其他时候只为任务提供了一个线程 - 这意味着性能不佳

我已经尝试过 Grand Central Dispatch 和线程优先级 - 无济于事 - 无论如何,运行每一帧的唯一代码是 PhysicsWorld,我没有逐帧做任何事情。

有什么想法可以让我获得一致的 60FPS - 显然硬件能够做到 - 但就在感觉像它的时候!

附加说明:如果设备插入开发 Mac/充电/USB/运行 XCode 等 - 使用所有线程时性能通常更好。但是尝试完全相同的应用程序,比如说第二天,在设备上独立运行(不连接到开发机器)——几乎总是性能很差——主要问题!

0 投票
0 回答
23 浏览

ios - 是否可以在 iOS 的 GameScene 中模拟运动/碰撞?

我有一个 iOS 游戏的想法,但我需要能够模拟各种物理世界的可能性才能使游戏正常工作。

我可能可以手动执行此操作,但我不确定实时执行此操作是否现实(我需要在新游戏设置之前即时执行计算)。我想知道iOS是否有内置的东西。