我目前正在使用 Metal 创建一个带有浮动气球的游戏板;每个气球都是一个带有气球图像的 SKSpriteNode。用户触摸气球并将其拖动到第二个气球,将两个气球合并。它们的具体合并方式取决于用户的输入。我有一个 UISegmentedControl 弹出,用户选择四个响应之一并发生合并。目前,UISegmentedControl 会在游戏板的中间弹出;但是,我希望它覆盖在第一个气球的顶部。
一旦两个气球相互接触,我就尝试过这个:
bubble1.physicsBody!.velocity = CGVector(dx: 0, dy: 0) // Stopping the balloon
requestView.frame.origin.x = bubble1.position.x
requestView.frame.origin.y = bubble1.position.y
其中requestView是一个带有各种子视图(包括UISegmentedControl)的UIView(与气球具有相同的尺寸),bubble1是SKSpriteNode(气球)。 但是,当我将 requestView 添加为游戏板的子视图时,它不会覆盖在 SKSpriteNode (bubble1) 的顶部。事实上,每次我尝试时,它似乎都没有出现在相对于气泡1的位置的同一空间中。 对我可能做错了什么有什么想法吗? 谢谢!
UIKit
使用 screen 坐标,而 Metal
使用 clip-spaced 坐标。
以下是将
UIKit
坐标转换为 Metal
的函数:
您需要执行相反操作才能将
Metal
转换为 UIKit
。像这样的东西:
func convertToScreenCoordinates(clipPos: CGPoint, viewSize: CGSize) -> CGPoint {
let screenX = (clipPos.x + 1.0) * 0.5 * viewSize.width
let screenY = (-clipPos.y + 1.0) * 0.5 * viewSize.height
return CGPoint(x: screenX, y: screenY)
}
这也可能有帮助:NSView 和 MTL 可绘制坐标之间的转换