免责声明:我可能包含了太多信息,所以不要被包含的信息量所吓倒。
我想为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(“”);
您的问题是,每次生成类型为Random
的新对象时,您都在创建一个新的Object
对象。>
仅在.NET Framework上,因为时钟具有有限的分辨率,使用无参数构造函数创建不同的Random对象连续创建随机数生成器相同的随机数序列。
可能的解决方案:
在Program类中创建一个Random对象,并使用当前时间戳对其进行初始化。
Random _random = new Random((int)DateTime.UtcNow.Ticks);
将随机实例传递给Object类。
或,更干净->将实际的随机颜色传递给构造函数中的Object
。
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]));