【问题标题】:Error spawning sprites in Swift/SpriteKit在 Swift/SpriteKit 中生成精灵时出错
【发布时间】:2015-07-31 06:57:07
【问题描述】:

我的代码有问题。当我的障碍物永远消失时,广场应该经过的“路径”有时会离开屏幕,而不是放在我想要的位置。我希望路径在屏幕宽度的 1/4 之间。我认为错误出现在宽度和 randomXPos 常量中。我怎样才能解决这个问题? (如果你想进一步解释,我可以解释更多。)

func addObstacles2() {

    let obstacle2A = SKSpriteNode(imageNamed: "Obstacle")
    let obstacle2B = SKSpriteNode(imageNamed: "Obstacle")

    let width = UInt32(self.frame.size.width / 5)
    let randomXPos = CGFloat(arc4random_uniform(UInt32(width)))
    let gapWidth = square.size.width * 2

    let moveDown2A = SKAction.moveByX(0, y: -self.size.width, duration: 2.5)
    let repeatAction2A = SKAction.repeatActionForever(moveDown2A)
    let removeObstacle2A = SKAction.removeFromParent()
    let moveAndRemove2A = SKAction.sequence([repeatAction2A, removeObstacle2A])

    obstacle2A.size = CGSize(width: self.frame.size.width, height: 300)
    obstacle2A.position = CGPointMake(CGRectGetMidX(self.frame) + obstacle2A.size.width / 2 + gapWidth / 2 + randomXPos, self.frame.size.height * 2)
    obstacle2A.zPosition = 40
    obstacle2A.runAction(moveAndRemove2A)
    self.addChild(obstacle2A)


    let moveDown2B = SKAction.moveByX(0, y: -self.size.width, duration: 2.5)
    let repeatAction2B = SKAction.repeatActionForever(moveDown2B)
    let removeObstacle2B = SKAction.removeFromParent()
    let moveAndRemove2B = SKAction.sequence([repeatAction2B, removeObstacle2B])

    obstacle2B.size = CGSize(width: self.frame.size.width, height: 300)
    obstacle2B.position = CGPointMake(CGRectGetMidX(self.frame) - obstacle2B.size.width / 2 - gapWidth / 2 + randomXPos, self.frame.size.height * 2)
    obstacle2B.zPosition = 40
    obstacle2B.runAction(moveAndRemove2B)
    self.addChild(obstacle2B)

}

(请注意:我有一个功能已经让障碍物永远产生。)

【问题讨论】:

  • 换句话说,我想要在宽度常量中的前导和尾随位置

标签: swift sprite-kit


【解决方案1】:

好吧,看来您从 Object2B 的 x 位置减去了太多。

首先要意识到self.frame.size.width 不会返回用户在其设备上看到的宽度。实际上,它会返回一些额外的东西,因为 sprite kit 默认配置为具有设置的坐标系,以允许开发人员在坐标中硬编码并在每个设备上看到相同的东西。 (这是场景默认的缩放模式 - SKSceneScaleModeResizeFill)。

所以,如果我们从数学上看一下你在做什么,我们会发现你从视图的中间开始,(我相信 x 坐标 512)。然后,减去该值的一半,将您置于 x 坐标 256(已经接近离开屏幕)。然后你减去更多,从而导致一些节点不在屏幕上。

您的随机值没有问题。就是在您的默认坐标系下,您看不到其中的一些。尝试对

中的值进行硬编码

【讨论】:

  • 你能给我一些关于如何做到这一点的例子吗? (我是初学者)
  • 是的,所以不要使用self.frame.size 放置节点,而是使用实际数值。我不确定 gapWidth 变量等于什么,所以我不能给你任何精确的计算(你最好自己处理这些事情以获得更好的感觉)。您可以自己进行一些测试,以找出方块在什么时候退出屏幕......
  • 好的。给我你的 gapWidth 变量的值(square.size.width/2)。我会告诉你计算
  • 它会因每个设备而异,但宽度约为 150 像素。
  • hmm.... 所以你没有固定的尺寸? SpriteKit 旨在使用常量值,然后通过自己的算法将其转换为像素。通常我们不以像素为单位指定,而是使用设备像素规定的比例相对于彼此的“点”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多