得分+10时颜色随机

时间:2018-08-09 03:02:33

标签: ios swift

我的游戏中颜色很少:

class GameScene: SKScene {
let colors = [SKColor.green, SKColor.red, SKColor.blue, SKColor.magenta, SKColor.yellow, SKColor.brown]

我想让我的游戏中的事物每次得分+10时都改变颜色(从上述之一)。

如何使其变得简单?

score += 10
thing.fillColor = .random

3 个答案:

答案 0 :(得分:2)

  

我想让我的游戏中的事物每次得分+10时都改变颜色(从上述之一)。

当您不知道该怎么做时,请尝试将其分解为较小的问题。您想在分数变化时更改为随机颜色,这需要做一些较小的事情:

  • 选择随机颜色
  • 设置颜色
  • 当分数增加一定幅度时做些什么

因此,让我们仅介绍第一部分并将其进一步分解。要从您的阵列中选择随机颜色,我们需要:

  • 弄清楚数组中有多少种颜色
  • 选择一个介于零和数组大小之间的随机数
  • 获取与该数字相对应的颜色

当您将其分解成非常小的步骤时,即使必须在线搜索一些答案,也不难弄清楚如何编写每一行。完成上述操作的代码如下:

let colors = [SKColor.green, SKColor.red, SKColor.blue, SKColor.magenta, SKColor.yellow, SKColor.brown]
let numberOfColors = colors.count
let colorIndex = Int.random(in:0 ..< numberOfColors)
let newColor = colors[colorIndex]

如果您使用的是较早版本的Swift,则需要使用其他函数来选择随机数,这需要进行一些强制转换,但这仍然非常简单:

let colors = [SKColor.green, SKColor.red, SKColor.blue, SKColor.magenta, SKColor.yellow, SKColor.brown]
let numberOfColors = colors.count
let colorIndex = Int(arc4random_uniform(UInt32(numberOfColors)))
let newColor = colors[colorIndex]

您可以结合使用其中的一些步骤,以使您不需要那么多的中间变量,但是较小的步骤将有助于使问题保持​​较小且易于理解。

一旦您选择了一种随机颜色,就需要弄清楚如何使用它来设置背景颜色。 SpriteKit场景是SKScene,并且场景显示在SKView中。如果查看SKScene的文档,您会发现该场景对显示该视图的引用,而该视图(因为它是UIView的子类)具有一个{{ 1}}可以设置的属性。幸运的是,backgroundColor想要一个backgroundColor,而UIColorSKColor的别名。因此,假设您有一个名为UIColor的场景,并且已经选择了上面的新颜色...

gameScene

或者只是:

let view = gameScene.view
view.backgroundColor = newColor

您说您希望分数增加10时发生这种颜色变化。首先要考虑的是分数增加一定量时该怎么做?分数如何变化?希望您的代码中只有一部分负责更新得分。如果是这样,那将是插入执行分数更改时应该发生的事情的代码的好地方。如果像棒球一样每次得分总是一次改变一个点,那么您可以保持它非常简单,并且当得分是10的倍数(或您选择的任意增量)时,只需更改背景颜色即可:

gameScene.view.backgroundColor = newColor

但是,如果一次得分可以增加一个以上的分数(如在足球比赛中那样),那么该简单的策略将行不通,因为单个更改可能会跳过使颜色发生更改的条件。处理该问题的一种方法是跟踪上次更改颜色的分数:

if game.score % 10 == 0 {
    game.changeColors()
}

我希望能有所帮助。只需将问题分解为更小的步骤即可。

答案 1 :(得分:0)

public func randomColorWithOpacity(opacity: CGFloat) -> UIColor {

    let r: UInt32 = arc4random_uniform(255)
    let g: UInt32 = arc4random_uniform(255)
    let b: UInt32 = arc4random_uniform(255)

    return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: opacity)
}

thing.fillColor = randomColorWithOpacity(opacity: 1.0)

对颜色尝试此功能

答案 2 :(得分:0)

尝试此一项可能会对您有所帮助。

功能定义

func confirmColorChange(score:Int,oldScore:Int)->Bool{
    if (score - oldScore) % 10 == 0{
           return true
    }
    return false
}

调用方法,其中包含用于循环增量的示例。 Swift 4.1及更低版本

var score = 2
var oldScore = score
let colors = [SKColor.green, SKColor.red, SKColor.blue, SKColor.magenta, SKColor.yellow, SKColor.brown]
//Sample Increased for Loop
for i in 0 ..< 100 {
   score = score + i
   if self.confirmColorChange(score: score, oldScore: oldScore){
        let randomIndex = Int(arc4random_uniform(UInt32(colors.count)))
         let radomColor = colors[randomIndex] //Set a color where you want 
   }
   oldScore = score
}

调用方法,其中包含用于循环增量的示例。 Swift 4.2及更高版本

var score = 2
var oldScore = score
let colors = [SKColor.green, SKColor.red, SKColor.blue, SKColor.magenta, SKColor.yellow, SKColor.brown]
//Sample Increased for Loop
for i in 0 ..< 100 {
   score = score + i
   if self.confirmColorChange(score: score, oldScore: oldScore){
        let radomColor = colors.randomElement() //Set a color where you want 
   }
   oldScore = score
}