我正在使用SpriteKit
和Swift 3
创建一个简单的游戏。
我有一系列戒指/圈子:
mRings = [mRingOne, mRingTwo, mRingThree, mRingFour, mRingFive]
数组中的每个对象都有不同的颜色,在游戏中的某些点我想改变每个环的颜色,但我有两个条件: 1.戒指不应该具有之前一次迭代的颜色。 2.每个戒指的颜色应与其他戒指颜色不同。
对于我做的第一个条件:
func changeRingsColor(){
var previousColor: UIColor?
for ring in mRings {
previousColor = ring.fillColor
repeat{
ring.fillColor = hexStringToUIColor(hex: mColors[Int(arc4random_uniform(UInt32(5)))])
}while(ring.fillColor.isEqual(previousColor))
}
}
并且它正在工作,但是,我无法找到回答第二个条件的方法。
在Java
我可能会做这样的事情:
for (int i=0; i<mRings.length; i++){
for( int j=1; j<mRings.length; j++){
if (ring[i].fillColor == ring[j].fillColor){
generate another color for 'j' ring.
}
}
}
但我没有尝试过任何工作。 希望你们能帮助我,提前致谢!
btw,mColors
是一个由5种不同颜色组成的数组,从那里我选择颜色。
答案 0 :(得分:1)
我将忽略一些实施细节,并专注于问题的核心,即:
如果我误解了上述内容,请告诉我。但我会这样做:
for (index, ring) in mRings.enumerated() {
let remainingRings = mRings[index+1..<mRings.count]
for otherRing in remainingRings {
print("Now comparing \(ring) to \(otherRing)")
}
}
首先,enumerated()
在第一个for循环的每次迭代中为您提供当前环和索引。然后,我们将数组从当前索引切片到末尾(remainingRings
),并循环遍历这些。
答案 1 :(得分:0)
可以用这种方式重写Java代码:
let mRings = ["mRingOne", "mRingTwo", "mRingThree", "mRingFour", "mRingFive"]
for (index, item) in mRings.enumerated() {
for item in index + 1..<mRings.count {
}
}
答案 2 :(得分:0)
这样的事情会起作用:
func changeRingsColor(){
// extract the previous colors
let colors = rings.map { $0.fillColor }
// the order in which the rings will pass color to each other
let passOrder = mRings.indices.shuffled()
for i in mRings.indices {
let previous = i == 0 ? mRings.count - 1 : i - 1
mRings[passOrder[i]].fillColor = colors[passOrder[previous]]
}
}
使用shuffled
它是如何运作的?
我不是随机选择每个戒指的颜色,而是随机生成戒指交换颜色的顺序(passOrder
)。由于每个戒指都会按顺序将其颜色传递给不同的戒指,因此您可以确保没有颜色保持不变。