我如何编码从顶部出现的SpriteKit Spawning球从侧面出现?

时间:2016-11-22 09:06:17

标签: swift sprite-kit

我正在为SpriteKit中的iPhone制作一个简单的游戏,并试图从屏幕顶部产生球。然而,球从侧面继续产卵,我不知道如何使它们从顶部出现....任何人都知道如何改变它? (见代码)。这也是随机产卵的好方法吗?或者我应该生成它们并让它们按重力规则落下?

//ENEMIES

func random() -> CGFloat {
    return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}

func random(min: CGFloat, max: CGFloat) -> CGFloat {
    return random() * (max - min) + min
}

// 1
func spawnEnemy() {
    // 2
    let enemy = SKSpriteNode(imageNamed: "ball")
    // 3
    enemy.name = "enemy"
    // 4
    enemy.position = CGPoint(x: frame.size.width + enemy.size.width/2,
                             y: frame.size.height * random(min: 0, max: 1))
    // 5
    addChild(enemy)

    enemy.run(
        SKAction.moveBy(x: -size.width - enemy.size.width, y: 0.0,
                         duration: TimeInterval(random(min: 1, max: 2))))

}

2 个答案:

答案 0 :(得分:3)

请记住,位置(0,0)位于屏幕的左下角,x值越来越大,从左到右穿过屏幕,y值逐渐从屏幕上下移动。

您的生成点始终是

(x: frame.size.width + enemy.size.width/2, y: frame.size.height * random(min: 0, max: 1)

位于屏幕的右侧,具有随机y值(即随机高度)。您的x值必须是随机的,并且您的y值必须为:

(x: frame.size.width * random(min: 0, max: 1), y: frame.size.height + enemy.size.height/2)

然后,正如梦想家所说,你的运动SKAction需要将敌人从当前的y值移动到0,同时保持其x值不变(假设你想让它直接沿着屏幕移动。

关于产卵和重力的问题 - 你想让你的物体以恒定的速度向下移动(这是你纠正的SKAction会做的)或看起来好像它们在重力作用下坠落,在这种情况下它们是&# 39; d出现,然后慢慢开始但不断加速。

编辑:正如KnightOfDragons所说 - (0,0)坐标的实际位置由一个称为anchorPoint的属性(它本身就是一个CGPoint,但它并没有关联)来控制到一个实际的坐标)。它曾经一直是(0,0),这意味着左下角,但现在它可能是(0.5,0.5),这意味着屏幕的中心,即放置在(0,0)的精灵将是在屏幕中间。增加x或y将分别向右或向上移动精灵,减小x或y将向左或向下移动精灵。

这意味着如果你的场景的anchorPoint为(0.5,0.5),那么屏幕的边缘将具有以下坐标:

  • 屏幕顶部 - y:frame.size.height / 2
  • 屏幕底部 - y:-frame.size.height / 2
  • 屏幕的右侧边缘 - x:frame.size.width / 2
  • 屏幕的左侧边缘 - x:-frame.size.height / 2

anchorPont是(0,0)还是(0.5,0.5)可能取决于你的场景来自.sks文件还是代码。

答案 1 :(得分:1)

而不是

enemy.run(
        SKAction.moveBy(x: -size.width - enemy.size.width, y: 0.0,
                         duration: TimeInterval(random(min: 1, max: 2))))

你需要通过-Y移动。 X是左右,Y是上下。所以它会......

enemy.run(
        SKAction.moveBy(x: 0.0 , y: -size.height - enemy.size.height,
                         duration: TimeInterval(random(min: 1, max: 2))))