基础System.Drawing.Color类在多次迭代后仅返回一种颜色

问题描述 投票:0回答:1

免责声明:我可能包含了太多信息,所以不要被包含的信息量所吓倒。

我想为c#控制台应用程序制作带有图形的简单2D游戏。为了学习如何处理图形的基础知识,我制作了一个小项目,在其中与基础Color类(以及库Colorful.Console一起使用,更多信息位于http://colorfulconsole.com/)。仅试图了解颜色表示和混合的基础。

但是,在绘制多种颜色时遇到了一个问题。经过15次迭代(出于某种原因总是15次)后,颜色将始终相同。

[刚开始时,我使用自定义颜色类存储值,然后使用Color.FromArgb()方法将其转换,效果很好。但是,当我开始将颜色值存储在“颜色”中时,我只能在每次返回相同颜色之前进行15次迭代(这可能与基本控制台颜色的数量有关,但是我不确定如何) 。

我的代码(简体)看起来像:


class Object{
    Color color; 
    //for simplicity, let's say that I previously had byte a, r, g, b defined here;
    public Object()
    {
        byte[] rgba = new byte[4];
        Random random = new Random();
        random.NextBytes(rgba);
        color = Color.FromArgb(rgba[0], rgba[1], rgba[2], rgba[3]);
        //previously I assigned a = rbga[0] and so on.
    }
}

class Program
{
    List<Object> objects = new List<Object>();
    static void Main(string[] args)
    {
        while(true)
        {
        objects.Add(new Object()); //I have some user input here, but essentially.
            foreach(Object o in objects) 
            {
                PrintColor(o.color);
                PaintColor(o.color);
            }
        }
    }

    void PrintColor(Color c)
    {
        Console.Write("R:" + c.R + ", G:" + c.G +", B:"+ c.B + ", A:" + c.A);
    }

    static void PaintColor(Color c)
    {
        Console.BackgroundColor = Color.FromArgb(c.R, c.G, c.B);
        Console.Write(" ");
        Console.BackgroundColor = Color.Black;
    }

}

我还试图制作一个程序,该程序应该绘制对角灰色渐变(后来在全rgb渐变上绘制),但是徒劳。

class Program
{
    static void Main(string[] args)
    {
        GraphicsEngine.GetWindowSize();
        while (true)
        {
            GraphicsEngine.FillWindowGradient();
            Console.Clear(); //I am going to replace this with moving the cursor to 0,0

            if (Console.KeyAvailable)
            {
                GraphicsEngine.GetWindowSize();
            }
        }
    }

    public static void FillWindowGradient()
    {
        int yMax = windowSize.GetLength(0);
        int xMax = windowSize.GetLength(1);
        for (int y = 0; y< yMax; y++)
            for (int x = 0; x < xMax; x++)
            {
                PaintGray((byte)((y/yMax + x/xMax)*127));
            }
    }

    public static void PaintGray(byte gray)
    {
        Console.BackgroundColor = Color.FromArgb(gray, gray, gray);
        Console.Write(" ");
        Console.BackgroundColor = Color.Black;
    }
}

此示例使用了它开始时使用的任何一种颜色,但无法处理渐变,我认为这与第一个示例中的相同问题有关。

PS:也很高兴知道是否有一种“便宜” /更快的方式为单元格着色:

Console.BackgroundColor = Color.Argb(a,r,g,b);

Console.Write(“”);

c# colors rgb system.drawing.color
1个回答
0
投票

您的问题是,每次生成类型为Random的新对象时,您都在创建一个新的Object对象。>

From MSDN:

仅在.NET Framework上,因为时钟具有有限的分辨率,使用无参数构造函数创建不同的Random对象连续创建随机数生成器相同的随机数序列。

可能的解决方案:

  1. 在Program类中创建一个Random对象,并使用当前时间戳对其进行初始化。

    Random _random = new Random((int)DateTime.UtcNow.Ticks);
    
  2. 将随机实例传递给Object类。

  3. 或,更干净->将实际的随机颜色传递给构造函数中的Object

  4. class Object
    {
        private Color color; 
    
        public Object(Color c)
        {        
            color = c;   
        }
    }
    
    var rgba = new byte[4];
    random.NextBytes(rgba);
    var obj = new Object(Color.FromArgb(rgba[0], rgba[1], rgba[2], rgba[3]));
    
© www.soinside.com 2019 - 2024. All rights reserved.