【问题标题】:Objects positioning in SpriteKitSceneSpriteKitScene 中的对象定位
【发布时间】:2025-12-29 07:30:11
【问题描述】:

我正在制作这款基本的太空射击游戏,但我无法正确获取敌人的 x 坐标。有时,它们会离开屏幕 - 或者在边缘保持一半在里面。无论应用在哪台 iPhone 上运行,我如何才能永久修复此问题?

这是我定位的代码:(注意,egg 是我的敌人的名字。它是我为每次调用它而创建的函数)

    func egg() {
        var egg = SKSpriteNode(imageNamed: list[Int(arc4random_uniform(6))])
        var min = self.size.width / 8
        var max = self.size.width 
        var point = UInt32(max - min)


        egg.position = CGPoint(x: CGFloat(arc4random_uniform(point)), y: self.size.height)
        let action = SKAction.moveToY(-100, duration: 2)
        let actionDone = SKAction.removeFromParent()

        egg.runAction(SKAction.sequence([action, actionDone]))

  }

【问题讨论】:

    标签: ios swift sprite-kit sprite skspritenode


    【解决方案1】:

    有几个地方可以横向发展。

    • 首先,您似乎假设场景锚点的位置在 (0,0)。如果不是(例如,默认的 .sks 文件现在在 (0.5,0.5) 有一个锚点),这可以解释为什么你的敌人永远不会出现。我要做的第一件事是仔细检查场景的锚点。

    • 如果您将这些鸡蛋添加到场景本身之外的某个其他节点,那么这些鸡蛋将“继承”其父节点所具有的任何平移、旋转和缩放。换句话说,如果您将 (20,20) 处的鸡蛋添加到 (30,30) 处的节点,它将出现在 (50,50) 处。确保鸡蛋的“上下文”是您所期望的。

    • 您的“最小值”和“最大值”值似乎有点奇怪。 “min”看起来像是要在左侧“缩进”屏幕尺寸的 1/8,但您并没有在右侧缩进它。也许这就是您的意图,但是如果您希望它们具有对称的行为,那么您也需要将“max”降低八分之一。此外,当您确定位置时,您不会将第 8 个值加回 x 值,因此这可能会将鸡蛋粘在 x=0 处。这可以解释为什么您的精灵有时会“在边缘内一半”。

    • 场景的大小不一定是屏幕尺寸。这在很大程度上取决于您的 SKScene 的“scaleMode”。查看文档以获取更多信息,但简而言之,scaleMode 告诉 SpriteKit 如何渲染与其视图的大小或纵横比不匹配的场景。它伸展吗?会收割吗?是信箱吗?如果您在 1024x768 屏幕设备上运行 400x400 方形场景,它必须有某种方式知道您的意思。它会在屏幕中间绘制 400x400 并让东西在“外面”看到吗?还是将其放大以填充屏幕,从顶部和底部裁剪?或者它是否将其放大以适应屏幕,允许上方和下方的空间在技术上超出场景大小?或者它是否放大并挤压场景以完全适合?如果您的场景与您设备的屏幕不完全匹配,这可以解释为什么事情表现不佳并保持在可见范围内。

    【讨论】: