【问题标题】:Comparing two sprites colors based on random colorization?基于随机着色比较两种精灵颜色?
【发布时间】:2016-06-17 05:43:13
【问题描述】:

这段代码为我的球着色。

var colorize1 = SKAction.colorizeWithColor(.redColor(), colorBlendFactor: 1.0, duration: 0.3)

        var colorize2 = SKAction.colorizeWithColor(.greenColor(), colorBlendFactor: 1.0, duration: 0.3)

        var colorize3 = SKAction.colorizeWithColor(.blueColor(), colorBlendFactor: 1.0, duration: 0.3)

        var actions = [colorize1, colorize2, colorize3]

        var randomIndex = Int(arc4random_uniform(3))

        var action = actions[randomIndex]

        let seconds = 0.14
        let delay = seconds * Double(NSEC_PER_SEC)  // nanoseconds per seconds
        let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

        dispatch_after(dispatchTime, dispatch_get_main_queue(), {


            self.Ball.runAction(action)


        })

    }

这段代码为我的墙壁着色。

var colorBucket = [UIColor]()

func randomColor() -> UIColor {

    if colorBucket.isEmpty {
        fillBucket()
    }

    let randomIndex = Int(arc4random_uniform(UInt32(colorBucket.count)))
    let randomColor = colorBucket[randomIndex]
    colorBucket.removeAtIndex(randomIndex)
    return randomColor

}

func fillBucket() {
    colorBucket = [UIColor.redColor(), UIColor.greenColor(), UIColor.blueColor()]
}

当我与位于我的墙之间的 spritekitnode() 发生碰撞时,我需要编写一个 if 语句来检测球和墙的颜色是否相同。

我试过这些:

if Wall1.color == UIColor.redColor() && Wall2.color == UIColor.redColor() && Ball.color != UIColor.redColor {

died = true

}

我的主要问题是编写判断球和墙是否相同颜色的 if 语句。我有碰撞部分。 非常感谢您的帮助。

func didBeginContact(contact: SKPhysicsContact) {


    let firstBody = contact.bodyA
    let secondBody = contact.bodyB




    let ballWasContacted = firstBody.categoryBitMask == PhysicsCat.Ball || secondBody.categoryBitMask == PhysicsCat.Ball
    var wallWasContacted = firstBody.categoryBitMask == PhysicsCat.Wall || secondBody.categoryBitMask == PhysicsCat.Wall
    let scoreWasContacted = firstBody.categoryBitMask == PhysicsCat.Score || secondBody.categoryBitMask == PhysicsCat.Score
    let colorWasContacted = firstBody.categoryBitMask == PhysicsCat.Color || secondBody.categoryBitMask == PhysicsCat.Ball

    if ballWasContacted {
        if scoreWasContacted {
            score += 1
            scoreLbl.text = "\(score)"
            let scoreNode = firstBody.categoryBitMask == PhysicsCat.Score ? firstBody.node : secondBody.node
            scoreNode!.removeFromParent()
        } else if wallWasContacted {
            enumerateChildNodesWithName("wallPair", usingBlock: ({
                (node, error) in
                node.speed = 0
                self.removeAllActions()

                                }))


            if died == false {
                died = true
                createBTN()
                fallDie()
            }
        }
    }

    else if colorWasContacted {


    }

}

colorWasContacted 现在并没有真正被使用,但其他一切都在使用。

改变墙壁颜色的代码。

action = SKAction.colorizeWithColor(randomColor(), colorBlendFactor: 1.0, duration: 0.3)

Wall1.runAction(动作)

这就是我添加断点时发生的情况。

Breakpoints

【问题讨论】:

    标签: swift if-statement collision-detection uicolor color-detection


    【解决方案1】:

    一次只能与两个元素发生联系,因此您可以在 didBeginContact 中执行类似的操作(根据您的实际代码进行编辑):

    ...
    else if wallWasContacted {
        let sprite1 = firstBody.node as! SKSpriteNode
        let sprite2 = secondBody.node as! SKSpriteNode
        if sprite1.color.isEqual(sprite2.color) {
            // Whatever your heart desires...
        } else {
           // Something else you'd like to have done...
        }
    
        enumerateChildNodesWithName("wallPair", usingBlock: ({
            (node, error) in
            node.speed = 0
            self.removeAllActions()
        }))
    
        if died == false {
            died = true
            createBTN()
            fallDie()
        }
    }
    

    由于这可能有助于解决这个孤立的问题,我相信(通过查看您的其他线程)您需要重新考虑整个逻辑,以发现在 墙壁之间传递... p>

    【讨论】:

    • 我收到了这个错误。 “'SKNode 类型的值?'没有成员“颜色””
    • 是的,但是您真的需要开始不要期望每个答案都是 100% 完成的事情,您可以复制和粘贴...在这种情况下,您需要先将节点转换为 SKSpriteNodes。但据我所知,您可能有一个子类,您需要在 S.O.知道...
    • 感谢您的帮助。我知道与像我这样的初学者打交道可能会加重。我需要做什么?当我的球与它发生碰撞时,我的 scoreNode 会增加我的分数。我没有子类。我有可以着色的墙壁,可以着色的球,以及当我的球击中墙壁时的碰撞属性。
    • 不要担心成为初学者。我们都去过那里。当人们回复时,请不要放弃您自己的问题。您能否告诉我您的 didBeginContact,因为我相信在我更改上述内容之前可能会有一些东西可以连接到那里,这会很有意义......
    • 检测我的球的颜色和两个墙壁的颜色是否相同的唯一方法是在球之间发生碰撞,然后当我碰撞时询问是否球和墙是相同颜色的,如果是,那么就忽略碰撞,但如果它们不同,碰撞?
    【解决方案2】:

    当您混合问题并重新提出问题时(措辞略有不同),我也会在这里尝试处理您的着色问题,因为这很可能是您失败的地方。我说最有可能是因为您提供的代码并没有告诉我们您完全为墙壁着色

    它告诉我们:

    1. 你有适当的逻辑来改变球的颜色。
    2. 您有逻辑从 colorBucket 中挑选出随机颜色。
    3. 当所有颜色都被填满时,你有逻辑重新填充桶 用过。

    它确实向我们展示了您实际上更改了墙壁的颜色信息。您能否提供这部分代码(如果存在)。

    【讨论】:

    • 有一个问题您或许可以解释。我不想解决这个问题,只是一个解释。所以当我写 print(Wall5.color) 我收到这个: UIDeviceRGBColorSpace 1 1 1 0。但是墙壁的颜色正在改变。然而,每次生成一组新墙时,它都会重复该打印语句。但是如果我说 Wall5.color = UIColor.redColor() 它显然会连续打印 UIDeviceRGBColorSpace 1 0 0 1。我想我需要以某种方式存储它每次调用时从 randomColor() 中选择的颜色。
    • 不,我们的想法是你可以使用你已经可用的东西。 SpriteNodes 有一个属性color。当您更改颜色时,属性也会更改。您是否尝试过设置这些断点以查看是否获得了预期的行为?
    • 我上传了一张我添加断点时发生的事情的图片。在问题部分更新了它。
    • 我们是否可以通过某种方式将此讨论移出 Slack(这实际上不是讨论的场所)。无论如何:您需要学习如何调试代码:在断点处,您可以在右侧面板中键入以下内容,波纹管(lldb)po sprite1.color 并按回车键,然后按po sprite2.color 并按回车键。这应该打印出接触时两个节点的颜色值。
    • 我的邮箱是tippytech@gmail.com,当Wall1是红色的时候sprite1是红色的。 Sprite2 是 UIDeviceRGBColorSpace 1 2.98023e-08 2.98023e-08 1... 我认为这是我球的颜色。我认为当它两次将我的球染成相同颜色时,就会出现这些大数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2013-10-07
    相关资源
    最近更新 更多