【问题标题】:Calculating Possible Color Combinations - Unity3D计算可能的颜色组合 - Unity3D
【发布时间】:2019-10-31 18:45:46
【问题描述】:

我正在制作一款手机游戏,玩家可以在其中获得四种(不重复的)颜色,他们可以一起滑动并创建一种新颜色。游戏将在屏幕上显示 1-4 个框,玩家必须一起滑动颜色并猜出正确的组合才能进入下一轮。我已经计算了玩家可以滑动的所有可能组合,并将该组合的颜色存储在一个名为“ColorDictionary.cs”的脚本中。这是一个静态脚本,包含 100 多个 Color32 变量,我的其他脚本可以根据玩家滑动的内容进行抓取。这里有几个屏幕截图,可以更好地了解发生了什么。

这个很简单,得到的颜色是浅红色,需要玩家一起刷红圈和白圈

现在假设玩家不是很聪明,用蓝色滑动红色,下图演示了 UI 如何相应地更改颜色以显示玩家输入的颜色组合的输出。

这是通过检查玩家提交的颜色然后从 ColorDictionary 脚本中获取正确的组合来完成的。这是 ColorManager 的一个非常小的 sn-p 进行检查以计算并从字典中获取正确的颜色:

            // YELLOW - RED
        if (redActive) {

            if (magentaActive) {

                if (blackActive) { currentColor = ColorDictionary.tallPoppy; } 
                else if (whiteActive) { currentColor = ColorDictionary.salmon; } 
                else { currentColor = ColorDictionary.sunsetOrange; }

            } else if (blueActive) {

                if (blackActive) { currentColor = ColorDictionary.nutmeg; } 
                else if (whiteActive) { currentColor = ColorDictionary.muddyWaters; } 
                else { currentColor = ColorDictionary.brownRust; }

            } else if (cyanActive) {

                if (blackActive) { currentColor = ColorDictionary.yellowMetal; } 
                else if (whiteActive) { currentColor = ColorDictionary.indianKhaki; }
                else { currentColor = ColorDictionary.teak; }

            } else if (greenActive) {

                if (blackActive) { currentColor = ColorDictionary.verdunGreen; } 
                else if (whiteActive) { currentColor = ColorDictionary.roti; } 
                else { currentColor = ColorDictionary.pirateGold; }

            } else {

                if (blackActive) { currentColor = ColorDictionary.chelseaGem; } 
                else if (whiteActive) { currentColor = ColorDictionary.texasRose; } 
                else { currentColor = ColorDictionary.flushOrange; }
            }
        } 

这个 if 语句阶梯会持续一段时间(虽然只检查组合是否有活动颜色),并且只有当玩家点击一种颜色时才会激活它。

【问题讨论】:

    标签: c# unity3d colors


    【解决方案1】:

    您使用一堆 if 语句的方式非常混乱。而不是这样做,将这些框存储为enum

    [Flags]
    public enum ColorBox 
    {
        Red = 1, Blue = 2, White = 4, Yellow = 8
    }
    

    并创建一个颜色组合的查找字典,如下所示:

    public static Dictionary<ColorBox, ColorDictionary> CreateComboTable() 
    {
       var table = new Dictionary<ColorBox, ColorDictionary>();
       table[ColorBox.Red | ColorBox.Blue | ColorBox.White] =
         ColorDictionary.muddyWater;
       table[ColorBox.Red | ColorBox.Blue | ColorBox.Yellow] =
         ColorDictionary.brownRust;
       // And so on...
       return table;
    }
    

    更好的是使用 JSON 等来存储颜色组合,但这只是一个开始。

    然后,一旦玩家选择了两种颜色,在字典中查找合适的组合(使用ContainsKey[] 语法)。

    【讨论】:

    • @RufusL:已编辑。
    • 我以前从未使用过这样的东西,我是否为每个组合创建一个新表?还是将所有组合存储在单个表中?
    • 所有组合都在此表中。
    • 我想我开始了解这个数据结构是如何工作的,我会研究一下。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2012-06-28
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多