この素晴らしいLinuxコマンドのような非フリッカリーアニメーションを表示したいと思います。 sl
http://www.youtube.com/watch?v=9GyMZKWjcY
私は言う...ハエの小さくて愚かな例をいただければ幸いです。
ありがとう!
カーソルを特定の位置に移動するにはConsole.SetCursorPosition
を使用し、次にConsole.Write
文字を使用します。各フレームの前に、スペースで上書きして前のフレームを削除する必要があります。これが私が今作った小さな例です:
class Program
{
static void Main(string[] args)
{
char[] chars = new char[] { '.', '-', '+', '^', '°', '*' };
for (int i = 0; ; i++)
{
if (i != 0)
{
// Delete the previous char by setting it to a space
Console.SetCursorPosition(6 - (i-1) % 6 - 1, Console.CursorTop);
Console.Write(" ");
}
// Write the new char
Console.SetCursorPosition(6 - i % 6 - 1, Console.CursorTop);
Console.Write(chars[i % 6]);
System.Threading.Thread.Sleep(100);
}
}
}
たとえば、アニメーションGIFを取得し、そこからすべての単一フレーム/画像を抽出し(その方法を参照 ここ )、ASCII変換を適用する(方法)それは ここ などで説明されており、上記のコード例のようにフレームごとにこれらを印刷します。
更新
楽しみのために、今説明したことを実装しました。 @"C:\some_animated_gif.gif"
をいくつかの(大きくはない)アニメーションGIFへのパスに置き換えてみてください。たとえば、AJAX loader gif from here 。
class Program
{
static void Main(string[] args)
{
Image image = Image.FromFile(@"C:\some_animated_gif.gif");
FrameDimension dimension = new FrameDimension(
image.FrameDimensionsList[0]);
int frameCount = image.GetFrameCount(dimension);
StringBuilder sb;
// Remember cursor position
int left = Console.WindowLeft, top = Console.WindowTop;
char[] chars = { '#', '#', '@', '%', '=', '+',
'*', ':', '-', '.', ' ' };
for (int i = 0; ; i = (i + 1) % frameCount)
{
sb = new StringBuilder();
image.SelectActiveFrame(dimension, i);
for (int h = 0; h < image.Height; h++)
{
for (int w = 0; w < image.Width; w++)
{
Color cl = ((Bitmap)image).GetPixel(w, h);
int gray = (cl.R + cl.G + cl.B) / 3;
int index = (gray * (chars.Length - 1)) / 255;
sb.Append(chars[index]);
}
sb.Append('\n');
}
Console.SetCursorPosition(left, top);
Console.Write(sb.ToString());
System.Threading.Thread.Sleep(100);
}
}
}
楽しみのためだけに:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
class Program
{
static void ConsoleDraw(IEnumerable<string> lines, int x, int y)
{
if (x > Console.WindowWidth) return;
if (y > Console.WindowHeight) return;
var trimLeft = x < 0 ? -x : 0;
int index = y;
x = x < 0 ? 0 : x;
y = y < 0 ? 0 : y;
var linesToPrint =
from line in lines
let currentIndex = index++
where currentIndex > 0 && currentIndex < Console.WindowHeight
select new {
Text = new String(line.Skip(trimLeft).Take(Math.Min(Console.WindowWidth - x, line.Length - trimLeft)).ToArray()),
X = x,
Y = y++
};
Console.Clear();
foreach (var line in linesToPrint)
{
Console.SetCursorPosition(line.X, line.Y);
Console.Write(line.Text);
}
}
static void Main(string[] args)
{
Console.CursorVisible = false;
var arr = new[]
{
@" ________________. ___ .______ ",
@" / | / \ | _ \",
@" | (-----| |----`/ ^ \ | |_) |",
@" \ \ | | / /_\ \ | /",
@" .-----) | | | / _____ \ | |\ \-------.",
@" |________/ |__| /__/ \__\| _| `.________|",
@" ____ __ ____ ___ .______ ________.",
@" \ \ / \ / / / \ | _ \ / |",
@" \ \/ \/ / / ^ \ | |_) || (-----`",
@" \ / / /_\ \ | / \ \",
@" \ /\ / / _____ \ | |\ \---) |",
@" \__/ \__/ /__/ \__\|__| `._______/",
};
var maxLength = arr.Aggregate(0, (max, line) => Math.Max(max, line.Length));
var x = Console.BufferWidth/2 - maxLength/2;
for (int y = -arr.Length; y < Console.WindowHeight + arr.Length; y++)
{
ConsoleDraw(arr, x, y);
Thread.Sleep(100);
}
}
}