【问题标题】:Nodes Spawning off of screen in sprite kit swift节点在精灵套件中迅速从屏幕上生成
【发布时间】:2015-08-21 18:57:31
【问题描述】:

我正在使用 swift 构建一个 ios 游戏,但遇到了一些问题。我正在尝试从屏幕顶部生成球并让它们落向地面。它们应该具有随机的 x 值并以随机速率下降,但节点不是在屏幕上生成,而是在屏幕未包含的 x 值上生成。请帮助我,因为我认为我做的一切都是正确的。 这是我的 addball 函数的代码...

func addBall(){

        //create ball sprite
        var ball = SKSpriteNode(imageNamed: "ball.png")

        //create physics for ball
        ball.physicsBody = SKPhysicsBody(rectangleOfSize: ball.size) // 1
        ball.physicsBody?.dynamic = true // 2
        ball.physicsBody?.categoryBitMask = PhysicsCategory.Ball // 3
        ball.physicsBody?.contactTestBitMask = PhysicsCategory.Person & PhysicsCategory.Ground
        ball.physicsBody?.collisionBitMask = PhysicsCategory.None // 5

        //generate random postion along x axis for ball to spawn
        let actualX = random(min:ball.frame.size.width/2+1, max: self.frame.size.width - ball.frame.size.width/2-1)
        println(actualX)
        //set balls positon
        ball.position = CGPoint(x: actualX, y: size.height - ball.size.width/2)

        //add ball to scene
        addChild(ball)

        //determine speed of ball
        let actualDuration = random(min: CGFloat(3.0), max: CGFloat(5.0))

        //create movement actions
        let actionMove = SKAction.moveTo(CGPoint(x:actualX, y:  -ball.size.width/2), duration: NSTimeInterval(actualDuration))

        let actionMoveDone = SKAction.removeFromParent()


        ball.runAction(SKAction.sequence([actionMove, actionMoveDone]), withKey: "action")


    }

这是我的随机函数的代码

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

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

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    这里的问题是您的 SKScene 占用的空间可能比您设备的屏幕多得多。因此,当您使用整个场景计算随机值时,有时球会在您看不到的场景区域中生成。

    控制场景大小的两个主要属性是其sizescaleMode 属性。 scaleMode 属性与场景的映射方式有关。除非您自己初始化并呈现此场景,否则您可以在视图控制器中检查 scaleMode。它可能会设置为aspectFill,根据Apple 的意思是:

    计算每个维度的比例因子,并选择两者中较大的一个。场景的每个轴都按相同的比例因子进行缩放。这保证了视图的整个区域都被填充,但可能会导致部分场景被裁剪。

    如果你不喜欢这个,还有其他的 scaleModes。然而,在大多数情况下,这种模式实际上更可取,因为 SpriteKit 的内部缩放能够制作通用应用程序。如果这对您来说没问题,那么最简单的方法是为您的球节点的生成位置等设置硬编码值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多