ios - 设置永久 SKSpritenode 图像方向

标签 ios sprite-kit skspritenode skphysicsbody

嗨,我有一堆圆形的 SKSpriteNodes,有一个圆形的 body 。现在,当这些球滚下一条路径时,我希望其中一些 SKSpritenodes 图像即使在滚动时也能保持直立。所以想一个向上的箭头。当球开始滚动时,箭头会转圈。但是对于某些球来说,即使球滚动,我也希望箭头保持向上。这样做的最佳方法是什么?

编辑

所以给出了一个答案,但从测试结果证明它不是正确的。不允许球旋转会影响它沿路径滚动的方式。所以我想我想要的是旋转,但图像总是出现在用户面前,就像它不旋转一样。谢谢。

最佳答案

这看起来像是 Superm 的工作 SKConstraint .在物理模拟在每一帧上运行之后评估和应用约束,因此您可以将它们用于诸如使节点指向某个方向的任务,而不管物理对其做了什么。为此,您需要 zRotation约束。

但除此之外还有更多。如果在球上设置零旋转约束:

// Swift
let constraint = SKConstraint.zRotation(SKRange(constantValue: 0))
ball.constraints = [constraint]

你会发现 SpriteKit 由于约束而在每一帧重置物理体的变换,所以它的行为只是有点像它在滚动。可能不是你想要的。 (为了更好地了解这里发生了什么,尝试在没有重力的世界中为矩形物理体添加零旋转约束,对其施加角冲量,并观察它尝试在 showsPhysics 转动的 View 中旋转你会看到 Sprite 和它的物理体不同步并且有点晃动——可能是由于物理引擎和约束引擎对抗时累积的舍入误差。)

相反,您可以在 0x141E 的答案中做一些事情,但使用约束来减少代码(并更有效地运行):
  • 给球节点一个圆形物理体。 (并且可能没有纹理,如果您想要的球的唯一艺术是非旋转 Sprite 。)
  • 添加箭头节点作为球节点的子节点。 (它不需要自己的物理体。)
  • 在箭头上放置一个零旋转约束。

  • 等等,这不起作用——我告诉箭头不要旋转,但它仍然在旋转?!请记住,子节点相对于其父节点定位(并旋转和缩放)。所以箭头不是相对于球旋转,而是球在旋转。别担心,你仍然可以通过约束来解决这个问题:
  • 告诉约束相对于包含球的节点(可能是场景)进行操作。

  • 现在约束将使箭头保持在原位,同时允许球旋转,但物理模拟希望它旋转。

    这里有一些测试代码来说明:
    // Step 1: A rectangular spinner so we can see the rotation 
    //         more easily than with a ball
    let spinner = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 300, height: 20))
    spinner.position.x = scene.frame.midX
    spinner.position.y = scene.frame.midY
    spinner.physicsBody = SKPhysicsBody(rectangleOfSize: spinner.size)
    scene.addChild(spinner)
    spinner.physicsBody?.applyAngularImpulse(0.1) // wheeeeee
    
    // Step 2: Make the arrow a child of the spinner
    let arrow = SKSpriteNode(color: SKColor.greenColor(), size: CGSize(width: 20, height: 50))
    spinner.addChild(arrow)
    
    // Step 3: Constrain the arrow's rotation...
    let constraint = SKConstraint.zRotation(SKRange(constantValue: 0))
    arrow.constraints = [constraint]
    
    // Step 4: ...relative to the scene, instead of to its parent
    constraint.referenceNode = scene
    

    关于ios - 设置永久 SKSpritenode 图像方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26809288/

    相关文章:

    swift - 运行完成 : after sequence or group of SKActions

    swift - 如何在 Swift 3 中创建 SKSpriteNode 的子类

    ios - swift 中作为参数的闭包和函数之间的区别

    ios - 如何将 UILabel 放在 UITextField 的最后一个字符旁边?

    ios - Stripes iOS App 中使用的界面类型 iOS 界面

    iphone - 在 Objective C 中调用 curl 命令

    objective-c - 使用 SpriteKit 的 TextureAtlas 并通过 Xcode 命令行构建时,iOS 应用程序崩溃

    arrays - 数组上的嵌套 for 循环

    ios - 有没有一种简单的方法可以从图像中绘制 SKnodes 障碍物的坐标?

    swift - 如何找到 SKSpriteNode 的速度作为 x 和 y 值?