我正在尝试构建一个SpriteKit游戏,它涉及到可以放大和缩小的物理物体的关卡。物理世界的行为并不像我预期的那样,当变焦级别改变时,会导致奇怪的事情发生。
具有物理实体的节点将按预期设置动画和行为。在关卡周围缩放是通过一个收缩手势来处理的,该手势调整包含所有游戏元素的单个“世界节点”的比例。这是一种方便的方法来处理它,因为缩放场景似乎做了可怕的事情,它将很容易为世界节点上的任何游戏界面元素添加单独的未缩放节点。
缩放的工作原理如下:
- (void) handlePinchGesture:(UIPinchGestureRecognizer *) gesture {
if (gesture.state == UIGestureRecognizerStateChanged) {
[self.worldNode runAction:[SKAction scaleBy:gesture.scale duration:0.0]];
gesture.scale = 1;
}
}当处于正常的缩放级别时,一切都工作得很好,而且在视觉上,在不同的缩放级别下,一切都看起来很好。问题是,当变焦改变时,物理物体继续以相同的速度移动,而不是相对于其他物体以相同的速度移动。结果是,当缩小以查看场景的更多部分时,所有内容的移动速度都会更快。
这似乎是这样一个事实的副作用,即物理世界只与场景连接,并不知道“世界节点”的调整比例。物理体不应该继续在它们的相对空间中以相同的速度移动节点吗?
有没有人能提供一些关于SpriteKit为什么会这样做的见解,或者如何解决这个问题?
发布于 2014-03-13 03:37:29
它这样做的原因是显而易见的。想象一下,你想要将一个球缩放到一个较小的尺寸,它应该仍然以相同的方式移动,对吗?
问题的出现是因为您同时扩展了“整个系统的球”。除了正在发生的事情之外,没有任何真正明智的结果。从字面上讲,SpriteKit需要猜测您正在尝试做什么,并根据它在多大程度上进行缩放以使其工作,或者使用它来缩放物理速度,或者不使用它。
解决方案是缩放整个场景,而不是子节点。
编辑:要缩放场景,请设置大小。需要将场景的scaleMode设置为SKSceneScaleModeAspectFill。
Edit2:子场景解决方案只有在您将它们添加到专用的第二个SKView中时才有效,我承认这是相当牵强的。您可能需要使用单个场景,放大和缩小该场景,相应地移动子节点并隐藏您的界面元素(或“反向缩放它们”)。
发布于 2015-01-12 08:10:10
这个答案是基于@TheisEgeberg在他的答案的评论中建议的方法。我做了这个回答,因为我认为它应该是一个答案,而不是一个评论。如果他用这种方法更新他的答案,我将删除这个答案。用这种方法来回答这个问题,会让人们省去很多麻烦。
1.创建一个包含物理节点的SKScene。
2.创建一个将充当SKScene的模拟器的SKNode
3.对于您创建并添加到SKScene的每个节点,创建另一个模拟节点-但没有physicsBody -并将其添加到模拟SKNode;
4.在SKScene中创建一个名为updateMimicNodes的方法,该方法遍历所有节点并更新相应节点的位置,即模拟节点中的zRotation。从update方法中调用该方法,这样它就会在每一帧中更新。
5.随心所欲地缩放模拟节点。
6.使用SKScene属性隐藏具有物理体的隐藏节点。如果您将所有节点放在添加到SKScene的SKNode层上,则只需将该SKNode的隐藏属性设置为YES即可;
为了便于管理,我在所有节点上创建了一个" mimic“属性,并将该属性设置为mimic节点上的相应节点。然后,您可以像这样更新更新中的每个节点:
node.mimic.position = node.position
node.mimic.zRotation = node.zRotation我稍后可能会发布一些此方法的示例代码,但如果您遵循这些步骤,您应该会达到理想的境界。
还要记住,任何接触都需要将位置转换为SKScene与物理体的坐标系。
https://stackoverflow.com/questions/22360479
复制相似问题