2010-04-27 13 views
14

मैं इसे इस भयानक लिनक्स कमांड की तरह गैर-झटके वाली एनीमेशन प्रदर्शित करना चाहता हूं; slसी # का उपयोग कर विंडोज कंसोल एप्लिकेशन में ASCII एनीमेशन कैसे बनाएं?

http://www.youtube.com/watch?v=9GyMZKWjcYU

मैं कहना की ... एक मक्खी एक छोटे से & बेवकूफ उदाहरण की सराहना करेंगे।

धन्यवाद!

+0

बस मेरे जवाब अपडेट किया गया। मज़े करें :) –

+0

हम्म, यह झिलमिलाहट की बहुत परिभाषा है, एक भी "पिक्सेल" एक फ्रेम से अगले तक समान नहीं है। इसे तेजी से ले जाएं। –

उत्तर

21

कर्सर को किसी निश्चित स्थिति में ले जाने के लिए बस 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 ले सभी एकल फ्रेम निकाल सकते/यह से छवियों (देखें कि here कैसे करना है), एक ASCII परिवर्तन (कैसे करना है जो लागू हों उदाहरण के लिए here वर्णित है) और इन फ्रेम को उपरोक्त कोड उदाहरण की तरह फ्रेम द्वारा प्रिंट करें।

अद्यतन

बस मस्ती के लिए, मैं क्या मैं सिर्फ वर्णित लागू किया। कुछ (बड़े नहीं) एनिमेटेड gif के पथ के साथ बस @"C:\some_animated_gif.gif" को प्रतिस्थापित करने का प्रयास करें। उदाहरण के लिए here से AJAX लोडर gif लें।

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); 
     } 
    } 
} 
+1

कल्पना कीजिए कि अगर हमारे पास बैकबफर्ड सीएमडी विंडो = डी –

+0

@ जोनासबी - बैकबफर द्वारा आपका क्या मतलब है? –

+0

वाह, यह बहुत अच्छा है! मैं इसका उपयोग करने की योजना बना रहा हूं (पाठ्यक्रम के डीबग मोड में)। –

11
बस मस्ती के लिए

:

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); 
     } 
    } 
} 
+2

यह एक मजेदार धागा है ... मुझे यह पसंद है। –