如何围绕对象外部的点旋转节点(即不围绕对象的中心点旋转)

Posted

技术标签:

【中文标题】如何围绕对象外部的点旋转节点(即不围绕对象的中心点旋转)【英文标题】:How to rotate a node around a point outside of the object (i.e don't rotate around the center point of the object) 【发布时间】:2020-02-18 23:21:36 【问题描述】:

我现在拥有的东西,我的游戏在 Xcode 上的模拟器上加载正常,但是当我点击屏幕时,“基本顶部”没有旋转。基本顶部是组成正方形的四个三角形之一。

我想要什么为了让那个正方形旋转,我必须让所有四个三角形都旋转。现在,即使我点击屏幕,基本顶部也不会旋转。一旦我得到基本的顶部旋转,我可以复制其他三角形的代码,以制作一个旋转的正方形。我需要这四个三角形都围绕某个点旋转。

代码

class GameScene: SKScene  
var brickSwitch: SKSpriteNode!
var basicTop = SKSpriteNode(imageNamed: "Top Side");
var basicBottom: SKSpriteNode!
var basicLeft: SKSpriteNode!
var basicRight: SKSpriteNode!   
override func didMove(to view: SKView) 
layoutScene()     


func turnBasicTop() 
  basicTop.isUserInteractionEnabled = true
  basicTop.run(SKAction.rotate(byAngle: .pi/2, duration: 0.25))


override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
    turnBasicTop()


func spawnBasicTop() 
let basicTop = SKSpriteNode(imageNamed: "basic top")
basicTop.size = CGSize(width: 400, height: 400)
basicTop.position = CGPoint(x: 230, y: 200)
basicTop.zPosition = 1

basicTop.physicsBody = SKPhysicsBody(rectangleOf: basicTop.size)
basicTop.physicsBody?.categoryBitMask = PhysicsCategories.basicTopCategory
basicTop.physicsBody?.isDynamic = false
basicTop.physicsBody?.allowsRotation = true

addChild(basicTop)

【问题讨论】:

【参考方案1】:

spawnBasicTop() 中定义的basicTop 指的是方法中定义的局部变量,因为与具有更大范围的另一个变量同名的局部变量优先引用。因此,当您尝试在turnBasicTop() 方法中对basicTop 运行动画时,该操作将在完全独立的SKSpriteNode 实例上运行。我想您没有看到任何事情发生,因为场景的 basicTop 属性引用的节点不在视图中;其isHidden 属性为真;或不能分配给图像"Top Side",因为它不存在,因此大小为零。添加

self.basicTop = basicTop

spawnBasicTop() 方法可以解决问题,不过我建议您更多地了解 Swift 以及如何声明、捕获变量等。

【讨论】:

以上是关于如何围绕对象外部的点旋转节点(即不围绕对象的中心点旋转)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 glm::rotate 围绕原点以外的点旋转对象?

Unity - 围绕 2D 中的点旋转对象

如何在 OpenGL 中围绕 Z 轴中心旋转对象?

如何在three.js中围绕对象的中心旋转?

围绕世界 0,0,0 而不是对象中心旋转

最初按中心旋转时围绕点旋转对象