【问题标题】:Choosing to spawn different SKSpriteNodes选择生成不同的 SKSpriteNode
【发布时间】:2016-11-16 18:31:16
【问题描述】:

我正在制作一个游戏,我有一些从屏幕顶部落到底部的物体。我想在对象之间产生选择并丢弃其中一个。我目前同时掉落。

 func ShapePicker() -> SKSpriteNode{
    let shapeArray = [purpleOctagon, coin, greenTriangle, orangeHexagon]

    let MaxValue = self.size.width / 2 - 200
    let MinValue = self.size.width / 3 * 0.95

    let rangeMax = UInt32(MaxValue)
    let rangeMin = UInt32(MinValue)

    purpleOctagon.position = CGPoint(x: CGFloat(arc4random_uniform(rangeMin) + rangeMax), y: self.size.height)
    self.addChild(purpleOctagon)

    greenTriangle.position = CGPoint(x: CGFloat(arc4random_uniform(rangeMin) + rangeMax), y: self.size.height)
    self.addChild(greenTriangle)

    coin.position = CGPoint(x: CGFloat(arc4random_uniform(rangeMin) + rangeMax), y: self.size.height)
    self.addChild(coin)
    return shapeArray[Int(arc4random_uniform(UInt32(shapeArray.count)))]

}

我希望程序随机.addChild,因为现在它只是将它们放在屏幕上。

【问题讨论】:

    标签: swift sprite-kit skspritenode


    【解决方案1】:

    您的代码暗示您希望所有这些都出现在屏幕上,然后随机掉落一个...所以您确实想继续.addChild。你想要的是让他们不要一次全部放弃。

    因此,您需要将 .physicsBody.pinned 更改为 true 以使它们保持在屏幕顶部。

    然后,在您的 update() 中,您可以检查已经过去了多少时间等,并且在一定的秒数之后,您可以执行 arc4random_uniform 并使用该结果来更改其中之一的 .pinned 属性节点(从而导致那个和那个只会掉落)。

    所以,如果硬币是 0,三角形是 1,八边形是 2,那么,在你的 .update 中记录经过的时间,说 3 秒后,随机检查 0-2,然后检查将执行:

    switch result {
      case 0: // coin
        coin.physicsBody?.pinned = false // makes it drop
      case 1: // triangle
      ...
    

    只需确保您的节点在正确的范围内,以便您可以执行 update() 中的逻辑

    如果我把你的 Q 读错了,而你只想生成然后丢弃一个,那么你仍然需要上面的 switch 语句,但不要更改 physicsBody 你会做 @改为 987654331@。

    所以你的函数内部会更像:

    // This can be global or inside of your GameScene:
    var myGlobalCurrentTime: CFTimeInterval 
    
    override func update(currentTime: CFTimeInterval) {
    
      myGlobalCurrentTime = myTimerUpdateTime(currentTime)
    
      func myDropFunc() {
    
        ... // Initialize your nodes
    
        let result = myRandomNumber(3)
    
        switch result {
          case 0:
            coin.position
            = CGPoint(x: CGFloat(arc4random_uniform(rangeMin) + rangeMax),
                      y: self.size.height)
            self.addChild(coin)
          case 1:
            ...
        }
      }
    
      // Execute the func:
      myDropFunc()
    }
    

    我仍然对您的代码和问题有些困惑,所以请在 cmets 中澄清,以便我可以在需要时更新此答案。

    【讨论】:

    • 对不起,如果我的问题不够清楚,但我不需要将对象固定到屏幕上然后放下它们;它们在屏幕稍上方创建,然后下降。问题是它们在您指出的同时下降。我想改变它们的掉落我已经有一个计时器,它会在 1 - 2.5 秒之间生成它们,但它们会一起掉落。我想从我制作的形状中随机选择一个形状,然后放下那个形状。
    • @uswer1242 我的回答的第二部分正好涵盖了这一点:) 只需将您的函数放在.update() 中,然后进行时间计算.. 加入if 语句(检查是否为 2秒过去了)然后运行你的函数,我在第二个块中提出的建议。
    • 哦,我明白了,感谢您的帮助,我真的很感激 :) 一个问题,尽管我会将案例陈述放在时间间隔方法中吗? @流动性
    • @uswer1242 好吧,退后一步想一想。在 update() 中你需要两件事。#1 是一种跟踪时间过去的方法(你的计时器)。 #2,你需要一个控制块(if 语句)来检查当前时间,然后在一定的时间间隔后做一些事情(放下精灵)。它有助于编写/绘制/键入您想要做的快速计划/布局,然后您可以用您的代码“填写”它 :) 所以不,您的实际计时器将与 drop 分开功能。您的开关/案例在该控制语句内(if check inside of update())
    • @uswer1242 我更新了第二个代码块来演示。它可能不是 100% 准确,但它为您提供了总体思路(我现在不在 Xcode)
    【解决方案2】:

    您可以将addChild 调用移出此函数,它会返回一个SKSpriteNode,然后您可以添加它。

    let sprite = ShapePicker()
    addChild(sprite)
    

    或者,只需添加随机选择的一个并返回它。你不需要addChild你不打算使用的节点

    【讨论】:

    • 什么都没有下降,我删除了 addChild 调用并按照您在我的 createScene 方法中建议的代码进行了操作,但没有任何下降。
    • @uswer1242 他的代码应该可以工作。当您在函数内部.addChild 时,它们都会丢失。您想要做的是限制.addChild(如果您只希望出现一个)或更改.physicsBody?.pinned,如果您希望全部出现,但只删除一个。 (见我的回答)
    猜你喜欢
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多