elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Hacer lo mismo de esta "cosa" de la película ochentera
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Hacer lo mismo de esta "cosa" de la película ochentera  (Leído 2,835 veces)
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Hacer lo mismo de esta "cosa" de la película ochentera
« en: 4 Mayo 2019, 21:52 pm »

Hola:

Quiero hacer los dibujos exactamente lo mismo como en este ordenador ochentero de esta película exactamente indicado en el minuto 6:56 de este vídeo.

Lo que he hecho hasta ahora son solo textos, en el cual no se el motivo, no me sale el rellenado de la parte derecha de la pantalla con el │ ASCII 179.



Código
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace The_Thing_La_Cosa_Consola_01_cs
  5. {
  6.    class Program
  7.    {
  8.        static void Main(string[] args)
  9.        {
  10.            Console.Title = "The Thing - La Cosa - C#";
  11.            Console.WindowWidth = 38;   // X ancho.
  12.            Console.WindowHeight = 15;  // Y altura.
  13.  
  14.            int tiempo = 1;
  15.  
  16.            // Cursor invisible.
  17.            Console.CursorVisible = false;
  18.  
  19.            // Dibujar cuadro.
  20.            DrawMarco(1, 1, 35, 14);
  21.  
  22.            // Escribir textos.
  23.            Console.SetCursorPosition(2, 4);
  24.            Escribir("PROJECTION: \n", 25);
  25.            Console.SetCursorPosition(2, 5);
  26.            Escribir("IF INTRUDER ORGANISM REACHES \n", 25);
  27.            Console.SetCursorPosition(2, 6);
  28.            Escribir("CIVILIZED AREAS . . . \n", 25);
  29.            Thread.Sleep(100);
  30.            Console.SetCursorPosition(2, 10);
  31.            Escribir("ENTIRE WORLD POPULATION INFECTED \n", 25);
  32.            Console.SetCursorPosition(2, 11);
  33.            Escribir("27,000 HOURS FROM FIRST CONTACT. \n", 25);
  34.  
  35.            // En español.
  36.            Thread.Sleep(2000);
  37.  
  38.            // Limpiar pantalla.
  39.            Console.Clear();
  40.  
  41.            // Dibujar cuadro.
  42.            DrawMarco(1, 1, 35, 14);
  43.  
  44.            // Escribir textos.
  45.            Console.SetCursorPosition(2, 3);
  46.            Escribir("PROYECCIÓN: \n", 25);
  47.            Console.SetCursorPosition(2, 4);
  48.            Escribir("SI ORGANISMO INTRUSO ALCANZA \n", 25);
  49.            Console.SetCursorPosition(2, 5);
  50.            Escribir("ZONAS CIVILIZADAS . . . \n", 25);
  51.            Thread.Sleep(100);
  52.            Console.SetCursorPosition(2, 9);
  53.            Escribir("TODA LA POBLACIÓN MUNDIAL INFECTÓ\n", 25);
  54.            Console.SetCursorPosition(2, 10);
  55.            Escribir("27,000 HORAS DESDE EL PRIMER\n", 25);
  56.            Console.SetCursorPosition(2, 11);
  57.            Escribir("CONTACTO. \n", 25);
  58.  
  59.            Console.ReadKey();
  60.        }
  61.  
  62.        public static void Escribir(string Cadena, int tiempo)
  63.        {
  64.            foreach (char letra in Cadena)
  65.            {
  66.                Console.Write(letra);
  67.                Thread.Sleep(tiempo);
  68.            }
  69.        }
  70.  
  71.        private static void DrawMarco(int v1, int v2, int v3, int v4)
  72.        {
  73.            Console.ForegroundColor = ConsoleColor.Cyan; // Texto azul claro.
  74.            Console.BackgroundColor = ConsoleColor.DarkBlue; // Fondo azul oscuro.
  75.            Console.Clear(); // Para poner fondo azul oscuro en la pantalla completa.
  76.  
  77.            Console.CursorVisible = false;
  78.            gotoXY(v1, v2, "┌");
  79.  
  80.            for (int i = v1 + 1; i < v3; i++)
  81.            {
  82.                gotoXY(i, v2, "&#9472;");
  83.            }
  84.            gotoXY(v3, v2, "&#9488;");
  85.            for (int i = v2 + 1; i < v4; i++)
  86.            {
  87.                gotoXY(v3, i, "&#9474;");
  88.            }
  89.            gotoXY(v3, v4, "&#9496;");
  90.            for (int i = v3 - 1; i > v1; i--)
  91.            {
  92.                gotoXY(i, v4, "&#9472;");
  93.            }
  94.            gotoXY(v1, v4, "&#9492;");
  95.            for (int i = v4 - 1; i > v2; i--)
  96.            {
  97.                gotoXY(v1, i, "&#9474;");
  98.            }
  99.            //Console.CursorVisible = true;
  100.        }
  101.  
  102.        private static void gotoXY(int v1, int v2, string cadena)
  103.        {
  104.            Console.SetCursorPosition(v1, v2);
  105.            Console.WriteLine(cadena);
  106.            Thread.Sleep(1);
  107.        }
  108.    }
  109. }
  110.  

¿Alguna idea de como hacerlo?

Por lo que parece, a pesar de que es del 1982, hoy en día exige mucho tiempo y complicado.

Saludos.


« Última modificación: 4 Mayo 2019, 22:02 pm por Meta » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Hacer lo mismo de esta "cosa" de la película ochentera
« Respuesta #1 en: 5 Mayo 2019, 14:37 pm »

Que quieras reproducir un efecto cinemático de software de los años 80, no significa que debas hacerlo como se podría hacer en los años 80...

En lugar de una aplicación de consola puedes utilizar la tecnologia WindowsForms o WPF. Lo siguiente lo hice en WinForms en apenas 40 lineas de código:



Código
  1. Imports System.Drawing.Drawing2D
  2. Imports System.Threading
  3.  
  4. Public Class Form1
  5.  
  6.    Dim str As String =
  7. "PROJECTION:
  8. IF INTRUDER ORGANISM REACHES
  9. CIVILIZED AREAS...
  10.  
  11. ENTIRE WORLD POPULATION INFECTED
  12. 27,000 HOURS FROM FIRST CONTACT."
  13.  
  14.    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
  15.  
  16.        ' Draw Panel Border.
  17.        Using g As Graphics = Me.Panel1.CreateGraphics(),
  18.              pen As New Pen(Color.FromArgb(255, 36, 244, 248), 6)
  19.  
  20.            pen.Alignment = PenAlignment.Inset
  21.            g.DrawRectangle(pen, Me.Panel1.ClientRectangle)
  22.        End Using
  23.  
  24.        ' Clear label text and set text font.
  25.        Me.Label1.Text = ""
  26.        Me.Label1.Font = New Font("MODESEVEN", 20)
  27.        Me.Update()
  28.        Thread.Sleep(1000)
  29.  
  30.        ' Write the text.
  31.        For Each c As Char In Me.str
  32.            Me.Label1.Text &= c
  33.            Me.Label1.Update()
  34.            Thread.Sleep(80)
  35.        Next c
  36.  
  37.    End Sub
  38.  
  39. End Class

El form consiste de un Panel y un Label, nada más.

Aquí puedes descargar el proyecto:

Y la fuente true-type que utilicé:



Logicamente si pretendes reproducirlo en una ventana de consola, es un procedimiento bastante más tedioso al carecer de funcionalidades avanzadas de dibujado.

Para empezar, el rectángulo o borde lo puedes dibujar de manera muy sencilla con mi código reusable de ConsoleRectangle:

Cita de: Elektro

Y para escribir el texto disculpa que te diga pero yo sinceramente alucino con la que te has montado en tu código. A estas alturas y todavía sigues haciendo estas cosas...

Cita de: Meta
Código
  1.            // Escribir textos.
  2.            Console.SetCursorPosition(2, 3);
  3.            Escribir("PROYECCIÓN: \n", 25);
  4.            Console.SetCursorPosition(2, 4);
  5.            Escribir("SI ORGANISMO INTRUSO ALCANZA \n", 25);
  6.            Console.SetCursorPosition(2, 5);
  7.            Escribir("ZONAS CIVILIZADAS . . . \n", 25);
  8.            Thread.Sleep(100);
  9.            Console.SetCursorPosition(2, 9);
  10.            Escribir("TODA LA POBLACIÓN MUNDIAL INFECTÓ\n", 25);
  11.            Console.SetCursorPosition(2, 10);
  12.            Escribir("27,000 HORAS DESDE EL PRIMER\n", 25);
  13.            Console.SetCursorPosition(2, 11);
  14.            Escribir("CONTACTO. \n", 25);

Mira, simplemente declara una variable multilinea con el texto a escribir (del mismo modo que en el código que he mostrado arriba) y con un foreach en C# iteras los caracteres, haces una pausa de 80-100 ms entre cada caracter y lo escribes. fin.

Ah, y si quieres modificar la fuente de la instancia de la consola actual, deberás usar la función SetCurrentConsoleFontEx:

Hice este código que podría servir como ejemplo...



Código
  1. Imports System.ComponentModel
  2. Imports System.Drawing
  3. Imports System.Runtime.InteropServices
  4. Imports System.Security
  5. Imports System.Text
  6. Imports System.Threading
  7.  
  8. Module Module1
  9.  
  10.    ReadOnly str As String =
  11. "PROJECTION:
  12. IF INTRUDER ORGANISM REACHES
  13. CIVILIZED AREAS...
  14.  
  15. ENTIRE WORLD POPULATION INFECTED
  16. 27,000 HOURS FROM FIRST CONTACT."
  17.  
  18.    Sub Main()
  19.        Console.Title = "The Thing - La Cosa"
  20.        Console.WindowWidth = 60
  21.        Console.WindowHeight = 20
  22.  
  23.        ' Paint background.
  24.        Console.BackgroundColor = ConsoleColor.DarkBlue
  25.        Console.Clear()
  26.  
  27.        ' Draw border.
  28.        Console.ForegroundColor = ConsoleColor.Cyan
  29.        Dim rc As ConsoleRectangle = New Rectangle(2, 2, Console.WindowWidth - 4, Console.WindowHeight - 4)
  30.        rc.Write()
  31.  
  32.        ' Draw Text.
  33.        Dim x As Integer = (rc.Width \ 5)
  34.        Dim y As Integer = (rc.Height \ 3)
  35.        ConsoleUtil.SetConsolefont("Consolas", bold:=False)
  36.        Console.SetCursorPosition(x, y)
  37.  
  38.        For Each c As Char In str
  39.            If c.Equals(ControlChars.Cr) Then
  40.                Console.SetCursorPosition(x, Interlocked.Increment(y))
  41.                Continue For
  42.            End If
  43.  
  44.            If c.Equals(ControlChars.Lf) Then
  45.                Continue For
  46.            End If
  47.  
  48.            Console.Write(c)
  49.            Thread.Sleep(80)
  50.        Next
  51.  
  52.        Console.ReadKey(intercept:=True)
  53.    End Sub
  54.  
  55. End Module

El proyecto (con el resto del código que no he mostrado) lo puedes descargar aquí:

Nótese que el proyecto que he compartido incluye extractos del código fuente de mi librería comercial DevCase for .NET Framework para programadores de C# y VB.NET.
También incluí un método para cambiar la fuente de texto de la consola, el cual lo he escrito practicamente para responderte a tu duda, y no lo he testeado mucho, pero encontré problemas para cambiarle el tamaño a la fuente por que al cambiarle el tamaño también se agranda la ventana de la consola. Parece ser el comportamiento por defecto de Windows, así que dejé el tamaño por defecto para no comerme mucho la cabeza. Tampoco me esmeré nada para alinear el texto dentro del rectángulo ya que es solo un ejemplo y no quiero darle más vueltas haciendo cálculos más sofisticados, eso te lo dejo a ti.

Saludos.


« Última modificación: 5 Mayo 2019, 14:54 pm por Eleкtro » En línea

Machacador


Desconectado Desconectado

Mensajes: 5.018


El original...


Ver Perfil WWW
Re: Hacer lo mismo de esta "cosa" de la película ochentera
« Respuesta #2 en: 5 Mayo 2019, 15:20 pm »

Que bonito.. como yo no soy programador de repente lo puedo hacer con el EASY-GIF...  :silbar:

 :rolleyes: :o :rolleyes:

Saludos.
En línea

"Solo tu perro puede admirarte mas de lo que tu te admiras a ti mismo"
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Hacer lo mismo de esta "cosa" de la película ochentera
« Respuesta #3 en: 5 Mayo 2019, 16:56 pm »

Fantático ejemplos visuales.  ;-) ;-) ;-) ;-) ;-) ;-)

Si te fija en el vídeo, primero la formación del rectángulo se hace poco a poco, no de golpe, algo parecido hice en modo consola.

En Windows Form el cuadro se hace directo, no poco a poco con GDI+, por eso mejor usar los ASCII para la formación del retángulo como en modo consola. Por ahora solo he heche textos en Windows Form.

Añado un timer, luego hago el resto. Con Window Form.
Código
  1. using System;
  2. using System.Windows.Forms;
  3.  
  4. namespace The_Thing_La_Cosa
  5. {
  6.    public partial class Form1 : Form
  7.    {
  8.        public Form1()
  9.        {
  10.            InitializeComponent();
  11.        }
  12.  
  13.        string texto = @"
  14. PROJECTION:
  15. IF INTRUDER ORGANISM REACHES
  16. CIVILIZED AREAS . . .
  17.  
  18.  
  19. ENTIRE WORLD POPULATION INFECTED
  20. 27,000 HOURS FROM FIRST CONTACT.
  21. ";
  22.        int contador = 0;
  23.  
  24.        private void timer1_Tick(object sender, EventArgs e)
  25.        {
  26.  
  27.           label1.Text += texto[contador++];
  28.  
  29.            if (contador >= texto.Length)
  30.            {
  31.                timer1.Enabled = false;
  32.                Console.Beep(600, 25); // Console.Beep(frecuencia, duracion);
  33.            }
  34.        }
  35.  
  36.        private void Form1_Load(object sender, EventArgs e)
  37.        {
  38.            timer1.Enabled = true;
  39.        }
  40.    }
  41. }

Lo intenté hacer con WPF pero no tiene el componente timer, habrá que crear hasta su propio evento y vete a saber cuántos códigos más.

Gracias por compartir.
« Última modificación: 5 Mayo 2019, 17:24 pm por Meta » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Hacer lo mismo de esta "cosa" de la película ochentera
« Respuesta #4 en: 5 Mayo 2019, 18:30 pm »

En Windows Form el cuadro se hace directo, no poco a poco con GDI+

Lo puedes hacer como quieras, de forma directa, o dibujando una linea poco a poco (usando un For)...


Saludos.
En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Hacer lo mismo de esta "cosa" de la película ochentera
« Respuesta #5 en: 6 Mayo 2019, 00:27 am »

Vale. ;)

Código no hecho por mi.

Código
  1. private void Form1_Load(object sender, EventArgs e)
  2.        {
  3.            Thread tr = new Thread(new ThreadStart(drawlines));
  4.            tr.Start();
  5.        }
  6.  
  7.        public delegate void Function();
  8.        Point A = new Point(5, 5);
  9.        Point B = new Point(5, 5);
  10.  
  11.        private void drawlines()
  12.        {
  13.            Thread.Sleep(1000);
  14.            drawMarco();
  15.            Thread.Sleep(25);
  16.            SetText("2", "PROJECTION:");
  17.            SetText("3", "IF INTRUDER ORGANISM REACHES");
  18.            SetText("4", "CIVILIZED AREAS . . .");
  19.            Thread.Sleep(100);
  20.            SetText("7", "ENTIRE WORLD POPULATION INFECTED");
  21.            SetText("8", "27,000 HOURS FROM FIRST CONTACT.");
  22.            Thread.Sleep(2000);
  23.            clrscr();
  24.            drawMarco();
  25.            SetText("1", "PROYECCIÓN:");
  26.            SetText("2", "SI ORGANISMO INTRUSO ALCANZA");
  27.            SetText("3", "ZONAS CIVILIZADAS . . . ");
  28.            Thread.Sleep(100);
  29.            SetText("7", "TODA LA POBLACIÓN MUNDIAL INFECTÓ");
  30.            SetText("8", "27,000 HORAS DESDE EL PRIMER");
  31.            SetText("9", "CONTACTO.");
  32.            Thread.Sleep(2000);
  33.            Application.Exit();
  34.  
  35.        }
  36.  
  37.        private void clrscr()
  38.        {
  39.            A = B;
  40.            Graphics ps = this.CreateGraphics();
  41.            ps.FillRectangle(new SolidBrush(Color.DarkBlue), 0,0, this.Width, this.Height);
  42.            foreach (Control control in Controls)
  43.            {
  44.                this.Invoke(new Function(delegate ()
  45.                {                
  46.                    control.Text = "";
  47.                }));                
  48.            }
  49.  
  50.        }
  51.  
  52.        private void SetText(string name, string txt)
  53.        {
  54.            string nombre = $"label{name}";
  55.            foreach (char letra in txt)
  56.            {
  57.                this.Invoke(new Function(delegate ()
  58.                {            
  59.  
  60.                    Controls[nombre].Text += letra;
  61.                }));
  62.                Console.Beep(600, 25);
  63.                Thread.Sleep(25);
  64.  
  65.            }
  66.        }
  67.  
  68.  
  69.  
  70.        private void drawMarco()
  71.        {
  72.            for (int i = 5; i < this.Width - 20; i++)
  73.                SetMarco(i, B.Y);            
  74.            for (int i = 5; i < this.Height - 40; i++)
  75.                SetMarco(B.X, i);            
  76.            for (int i = this.Width - 20; i > 5; i--)
  77.                 SetMarco(i, B.Y);            
  78.            for (int i = this.Height - 40; i > 5; i--)
  79.                 SetMarco(B.X, i);
  80.        }
  81.  
  82.        private void SetMarco(int x,int y)
  83.        {
  84.            this.Invoke(new Function(delegate ()
  85.              {
  86.                  A = B;
  87.                  B = new Point(x, y);
  88.                  Graphics ps = this.CreateGraphics();
  89.                  ps.DrawLine(new Pen(Color.Blue,3), A, B);
  90.              }));
  91.            Thread.Sleep(1);
  92.        }
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines