在某个位置画一个十字以及节点旋转的工作原理

Posted

技术标签:

【中文标题】在某个位置画一个十字以及节点旋转的工作原理【英文标题】:Draw a cross in a position and how node rotation works 【发布时间】:2019-11-17 19:17:34 【问题描述】:

我正在使用 spriteKit 来创建一个小游戏,但在我触摸屏幕的地方试图画一个十字(比如和 X)时被阻止了。因为我想画一个 X,所以我想旋转两个矩形,一个是 Pi/4,另一个是 -Pi/4。

我有以下代码,我一直在玩节点位置,在两个轴上添加 10 或 20px。但我无法理解矩形如何在其中心相交以创建一个十字(如 X)。

这就是我的代码:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
    
        guard let touch = touches.first
            else
        
            return
        

    let location = touch.location(in: self)

    let touchedNode = nodes(at: location)
    _ = atPoint(location).name

    print("Posición touch: \(touchedNode)")

    // Draw the cross in the touched point
    let redSprite1 = SKShapeNode(rect: CGRect(x: 0, y: 0, width: 10, height: 40))
    redSprite1.fillColor = .green
    redSprite1.position = CGPoint(x: location.x - 10.0, y: location.y)
    redSprite1.zRotation = CGFloat(-Pi/4)
    addChild(redSprite1)
//      2
        let redSprite2 = SKShapeNode(rect: CGRect(x: 0, y: 0, width: 10, height: 40))
        redSprite2.fillColor = .red
        redSprite2.position = CGPoint(x: location.x + 10.0, y: location.y)
        redSprite2.zRotation = CGFloat(Pi/4)
        addChild(redSprite2)
    

我注意到旋转不是从形状的中心而是从底部进行的。 是否有任何选项可以从中心旋转形状或图块?

【问题讨论】:

您好,您可以添加您的 touchesBegan 和 touchesMoved 覆盖吗? 方法 touchesBegan 添加,touchedMoved 尚未定义。 您好,再次确定,所以为了清楚起见,您需要一条红色水平线,与一条绿色垂直线相交。在您按下/点击 ???? 的位置做一个十字架 不,我想要一个像 X 一样的十字架。这就是为什么我旋转一个矩形 Pi/4 和另一个 -Pi/4。抱歉,我在最初的问题中没有很好地解释它。 您的 SKShapeNode(rect:) 正在指定一个矩形,其角在节点的原点 (0,0)。如果您希望矩形以节点的原点为中心,请使用 SKShapeNode(rectOf:) 并仅指定宽度和高度。 developer.apple.com/documentation/spritekit/skshapenode/… 【参考方案1】:

感谢@bg2b 的解决方案。

查看链接到@bg2b 答案并应用的苹果文档,给出以下代码。

// 1
let redSprite1 = SKShapeNode(rectOf: CGSize(width: 10.0, height: 40.0))
redSprite1.fillColor = .green
redSprite1.position = CGPoint(x: location.x, y: location.y)
redSprite1.zRotation = CGFloat(-Pi/4)
redSprite1.name = "cruz1"
addChild(redSprite1)
// 2
let redSprite2 = SKShapeNode(rectOf: CGSize(width: 10.0, height: 40.0))
redSprite2.fillColor = .red
redSprite2.position = CGPoint(x: location.x, y: location.y)
redSprite2.zRotation = CGFloat(Pi/4)
redSprite2.name = "cruz2"
addChild(redSprite2)

【讨论】:

以上是关于在某个位置画一个十字以及节点旋转的工作原理的主要内容,如果未能解决你的问题,请参考以下文章

教你如何使用DXP画原理图

机械硬盘的工作原理详细解析,以及机械硬盘和固态硬盘的优缺点对比

Zookeeper的功能以及工作原理

[原理型] Zookeeper的功能以及工作原理

Zookeeper的功能以及工作原理(转)

Kafka消息队列大数据实战教程-第五篇(Broker工作原理以及节点服役)