Ios 旋转spritekit中的子节点

Ios 旋转spritekit中的子节点,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我有一个节点,我需要旋转,但因为它是一个子节点,每当我旋转它改变大小。这是因为创建时y比例值为0.7693。我尝试创建一个基于z旋转操纵x和y比例的算法,但没有任何效果。他们真的要这么做吗 编辑:我发现静态更改x和y比例不起作用。下面是我的代码: var ScaleDir: CGFloat = 1 override func update(_ currentTime: TimeInterval) { // Called before each frame is rendered

我有一个节点,我需要旋转,但因为它是一个子节点,每当我旋转它改变大小。这是因为创建时y比例值为0.7693。我尝试创建一个基于z旋转操纵x和y比例的算法,但没有任何效果。他们真的要这么做吗

编辑:我发现静态更改x和y比例不起作用。下面是我的代码:

var ScaleDir: CGFloat = 1
override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
        let turnAngle:Double = 1
        startWheel.zRotation = startWheel.zRotation + CGFloat(turnAngle / (180/Double.pi))
        if startWheel.zRotation*(180/CGFloat.pi) >= 360{
            startWheel.zRotation = startWheel.zRotation - (360/(180/CGFloat.pi))
        }
        startWheel.yScale = startWheel.yScale + (CGFloat((1 - 0.7693) / Double(90/turnAngle)) * ScaleDir)
        startWheel.xScale = startWheel.xScale - (CGFloat((1 - 0.7693) / Double(90/turnAngle)) * ScaleDir)
        if startWheel.yScale >= 1 || startWheel.xScale >= 1{
            ScaleDir = ScaleDir * -1
        }
}
我已经意识到这个问题。自动指定的Yscale随旋转节点移动,但spriteKit缩放系统创建的胚珠形状不会移动,并且保持垂直

我的问题是这样的:


如果在旋转后应用了刻度,则需要在角度上使用
sin
来计算Y分量,并使用
cos
来计算X分量


但是,我会尝试给这个节点一个虚拟的父节点并旋转它。

如果在旋转之后应用了比例,那么您需要在角度上使用
sin
来计算Y分量,并使用
cos
来计算X


但是,我会尝试给这个节点一个虚拟的父节点并旋转它。

下面是一些我在操场上使用的简单代码,试图复制您在问题中描述的内容。我尝试在设置中操纵各种元素的yScale和旋转,但似乎没有任何东西能够重现不希望出现的行为。我是否合理地复制了您的设置,或者我遗漏了什么

import SpriteKit
import PlaygroundSupport

public class GameScene: SKScene {
    let node: SKNode

    init(nodeToRotate: SKNode) {
        self.node = nodeToRotate
        super.init(size: CGSize(width: 500, height: 400))
    }

    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    public override func update(_ currentTime: TimeInterval) {
        let turnAngle = 9.0
        node.zRotation = node.zRotation + CGFloat(turnAngle / (180.0/Double.pi))
    }
}

let square = SKShapeNode(rectOf: CGSize(width: 80, height: 80))
square.fillColor = .purple
square.strokeColor = .purple
square.position = CGPoint(x: 250, y: 200)

let circle = SKShapeNode(circleOfRadius: 30)
circle.fillColor = .orange
circle.strokeColor = .orange
circle.position = CGPoint(x: 0, y: 0)
circle.yScale = 0.7
square.addChild(circle)

let scene = GameScene(nodeToRotate: square)
scene.addChild(square)

let view = SKView(frame: CGRect(origin: .zero, size: CGSize(width: 500, height: 400)))
view.presentScene(scene)

PlaygroundPage.current.liveView = view

下面是我在一个操场上使用的一些简单代码,试图复制您在问题中描述的内容。我尝试在设置中操纵各种元素的yScale和旋转,但似乎没有任何东西能够重现不希望出现的行为。我是否合理地复制了您的设置,或者我遗漏了什么

import SpriteKit
import PlaygroundSupport

public class GameScene: SKScene {
    let node: SKNode

    init(nodeToRotate: SKNode) {
        self.node = nodeToRotate
        super.init(size: CGSize(width: 500, height: 400))
    }

    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    public override func update(_ currentTime: TimeInterval) {
        let turnAngle = 9.0
        node.zRotation = node.zRotation + CGFloat(turnAngle / (180.0/Double.pi))
    }
}

let square = SKShapeNode(rectOf: CGSize(width: 80, height: 80))
square.fillColor = .purple
square.strokeColor = .purple
square.position = CGPoint(x: 250, y: 200)

let circle = SKShapeNode(circleOfRadius: 30)
circle.fillColor = .orange
circle.strokeColor = .orange
circle.position = CGPoint(x: 0, y: 0)
circle.yScale = 0.7
square.addChild(circle)

let scene = GameScene(nodeToRotate: square)
scene.addChild(square)

let view = SKView(frame: CGRect(origin: .zero, size: CGSize(width: 500, height: 400)))
view.presentScene(scene)

PlaygroundPage.current.liveView = view


问题是父节点具有y比例,这导致了所有问题,当我删除y比例并将其更改回1时,一切又开始工作。

问题是父节点具有y比例,这导致了所有问题,当我移除y刻度并将其更改回1时,一切又开始工作。

您是否尝试撤消y刻度,旋转然后重新应用yScale?这在这里不起作用,这是我尝试的
让转角:Double=1 startweel.yScale=1 startweel.xScale=1 startweel.zRotation=startweel.zRotation+CGFloat(转角/(180/Double.pi))startWheel.yScale=0.7693 startWheel.xScale=1
@Davewston还有别的办法吗?我现在不在电脑旁,但今晚晚些时候我可以玩这个。没有承诺您是否尝试过撤消yScale,旋转yScale,然后重新应用yScale?我尝试过的是旋转角度:Double=1 startWheel.yScale=1 startWheel.xScale=1 startWheel.zRotation=startWheel.zRotation+CGFloat(旋转角度/(180/Double.pi))startWheel.yScale=0.7693 startWheel.xScale=1@Davewston还有别的办法吗?我现在不在电脑旁,但今晚晚些时候我可以玩这个。没有承诺我尝试了我认为你所说的虚拟父节点,但是它有同样的效果。另一方面,你可以更具体地说明你如何用正反两方面来解决这个问题。谢谢。你能举个例子吗?你没有在虚拟父节点上设置缩放(只是旋转?)在父节点上设置旋转,在子节点上设置缩放我尝试了我认为你所说的虚拟父节点的意思,但是它有相同的效果。另一方面,你可以更具体地说明你如何用正反两方面来解决这个问题。谢谢。你能举个例子吗?你没有在虚拟父节点上设置缩放(只是旋转?)在父节点上设置旋转,在子节点上设置缩放我用问题的图片更新了我的问题。正如您所看到的,旋转色轮是我想要旋转的精灵,有关该精灵的更多信息:它是4个形状节点的父节点。它是精灵节点的子节点。在该精灵节点中创建任何对象时,都会自动将yScale指定为0.7693,使其看起来像一个圆(如果没有此y比例,则看起来像一个椭圆形)。我认为问题在于,当我旋转节点时,y比例会随之旋转,但SpriteKit比例系统创建的拉长边不会随着sprite旋转。我用问题的图片更新了我的问题。正如您所看到的,旋转色轮是我想要旋转的精灵,有关该精灵的更多信息:它是4个形状节点的父节点。它是精灵节点的子节点。在该精灵节点中创建任何对象时,都会自动将yScale指定为0.7693,使其看起来像一个圆(如果没有此y比例,则看起来像一个椭圆形)。我认为问题在于,当我旋转节点时,y比例会随之旋转,但SpriteKit比例系统创建的拉长边不会随着sprite旋转。