TMemo & Matrix-effekt (Film)



  • hallo,

    @sp: wirklich total cool... bis auf ein flimmern seh ich nix...

    mfg
    murph



  • Hi Spieleprogrammierer,

    wie lang ist dein HelloWorld? 10000 Zeilen? Würde micht nicht wundern!

    Hier:

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
      Randomize();
      Form1->Refresh();
      Form1->Font->Color=clLime;
      for (int i=0; i<=100; i++)
       Form1->Canvas->TextOut(random(ClientWidth/13)*13,random(ClientHeight/13)*13,(String)(char)random(255));
    }
    

    Zu beachten ist natürlich:

    - KEINE GLOBALEN VARS
    - ETWAS KÜRZER

    Ist immer noch nicht perfekt!
    Randomize und Font->Color... sollte eigentlich bei FormCreat oder so stehen!
    Aber naja!

    MFG

    Alexander Sulfrian

    Edit:
    Zitate bitte auf das Notwendigste beschränken. Danke!



  • Das hier sieht schonmal so ähnlich aus. Leider weiß ich jetzt nicht mehr, wie das Matrix-Ding eigentlich aussah.

    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
      Randomize();
      Color = clBlack;
      Font->Color = clLime;
      Width = 336;
      Height = 240;
      Timer1->Interval = 200;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
      Refresh();
    
      int wCount = 13;
      int hCount = 23;
      int width = ClientWidth / wCount;
      int height = ClientHeight / hCount;
    
      for(int i=0; i<wCount; ++i)
         for(int j=0; j<hCount; ++j)
            Canvas->TextOut(i*width,
                            j*height,
                            AnsiString((char)random(256)));
    }
    


  • Soweit ich weiß is das alles nich korrekt. Ich würd das ganz anders machen. Das Problem der ersten Version ist, dass alle Zeichen geändert werden. Man müsste so anfangen: Man färbt halt das Canvas schwarz.
    Dann wählt man eine zufällige Spalte aus. Eine weitere Zufallszahl sagt noch aus wie Lang die Spalte werden soll. Dann fängt man an einen Zufälligen Weißen Buchstaben an die Erste stelle der Spalte zu Setzen. Dann setzt man einen zweiten zufälligen weißen Buchstaben darunter und färbt den Oberen grün. Und so geht das weiter bis die Länge der Spalte mit der Zufallszahl (s.o.) übereinstimmt. Das ganze wird dann noch mit mehreren Spalten gleichzeitig gemacht. Es können auch Spalten zweimal drankommen.

    Dann hat man einen Matrix ähnlichen effekt. Als Schrifttyp würd ich symbols ohne Zahlen vorschlagen.



  • Bei diesem "Wettbewerb" geht's um konkrete Umsetzungen, nicht um abstrakte Entwürfe! 😉



  • Also ich hab die Matrix jetzt mehr oder weniger wie der der WebFritzi realisiert.

    Zuerst füll ich die zeile ganz links aus (mit irgendwelchen rand symbolen), dann kommt die nächste zeile weiter rechts dran. Sind alle Zeilen voll wird refresht, und alles fängt von vorne an. (Für die Dauer der Matrix wird somit ein Wert gebraucht den ich ja liefern kann.)

    Durch das refreshen, (und das Warten von 50 ms) schaut es aus als würde sich der text 'bewegen'. Mehr oder weniger mein ziel. Jetzt arbeite ich halt noch daran, ein paar sonderzeichen (chinesische oder arabische schriftzeichen) einzubauen.



  • Hallo, möchte auc hmal meinen Senf dazutun.

    Unit1.h

    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TTimer *Timer1;
            void __fastcall FormPaint(TObject *Sender);
            void __fastcall Timer1Timer(TObject *Sender);
            void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    private:	// Anwenderdeklarationen
      int TextHeight;
      int TextWidth;
      int *Zeichenlaenge;
      char **szZeichen;
    public:		// Anwenderdeklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    

    Unit1.cpp

    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
      Randomize();  
      Canvas->Font->Color = clGreen;  // setzen der Schriftfarbe
      Canvas->Font->Pitch = fpFixed;  // setzen der Schriftbreite
      TextWidth = Canvas->TextWidth("WW"); // Textweite und
      TextHeight = Canvas->TextHeight("W");  // Texthöhe ermitteln
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
      Timer1->Enabled = false; 
      Canvas->Brush->Color = clBlack; // Hintergrundfabe festlegen
      // kompletten Clientbereich mit H-Farbe füllen
      Canvas->FillRect(Rect(0,0,ClientWidth,ClientHeight)); 
      // Zeichenlaenge ist Array max. Anzahl Spalte 
      Zeichenlaenge = (int *)malloc((floor(ClientWidth/TextWidth))*sizeof(*Zeichenlaenge));
      // Array mit 0 füllen
      setmem(Zeichenlaenge,(floor(ClientWidth/TextWidth))*sizeof(*Zeichenlaenge),0);
      Timer1->Enabled = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
      Timer1->Enabled = false;
      // Speicher für Zeichenarray reservieren 
      szZeichen = (char **)malloc(( floor(ClientWidth/TextWidth) )*sizeof(*szZeichen));
    
      for(int i=0;i<floor(ClientWidth/TextWidth);i++){
        // Anz. Zeichen für jeweilige Spalte bestimmen
        Zeichenlaenge[i] += (random(floor(ClientHeight/TextHeight)));
        // wenn mehr Zeichen als möglich, wird Anzahl auf 0 gesetzt
        if(Zeichenlaenge[i]>floor(ClientHeight/TextHeight)){
          Zeichenlaenge[i] = 0;
        }
        // Speicher für die einzelnen Zeichen reservieren  
        szZeichen[i] =(char *) malloc((Zeichenlaenge[i]+1)*sizeof(**szZeichen));
        // Alle auf 0 setzen
        setmem(szZeichen[i],Zeichenlaenge[i]+1,'\0');
        for(int j=0;j<Zeichenlaenge[i]+1;j++){
          // jedes einzelne Zeichen zufällig ermitteln
          szZeichen[i][j] = random(256);
        }
      }
    
      for(int i=0;i<floor(ClientWidth/TextWidth);i++){
        // wenn 0, wird ein Schwarzer Balcken gezeichnet
        if(Zeichenlaenge[i]==0){
          Canvas->FillRect(Rect(TextWidth*(i-1),0,TextWidth*(i),ClientHeight));
        }else{
          for(int j=0;j<Zeichenlaenge[i];j++){
            // ansonsten werde ndie Zeichen ausgegeben
            Canvas->TextOut(TextWidth*i,TextHeight*j,szZeichen[i][j]);
          }
        }
      }
      // Zeichenarray wieder freigeben
      for (int i = 0; i < floor(ClientWidth/TextWidth); ++i) {
        free(szZeichen[i]);
      }
      free(szZeichen);
      Timer1->Enabled = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
      Timer1->Enabled = false;
      free(Zeichenlaenge);
    }
    


  • Schaut euch mal das hier an. Braucht einen Timer mit Intervall von 100.

    //---------------------------------------------------------------------------
    //---------------------------------Als Schrift Symcol einstellen--------------
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    const int rows = 10; //Anzahl der gleichzeitig gezeichneten Spalten
    int max = 700;      //Wann von vorn angefangen wird
    int ocount=0;
    int count[rows];
    int max_row = 200; //Mximalanzahl der Spalten
    int row_width = 12;//Breite einer Spalte
    int max_length = 100; //maximale Länge einer Spalte
    int font_size = 12;//Schriftgröße
    int x[rows];
    int length[rows];
    char lastchar[rows];
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    randomize();
    Form1->Font->Size = font_size;
    Form1->Font->Color  = clGreen;
    Form1->Color = clBlack;
    for(int i = 0;i< rows;i++)
    {
    x[i] = random(max_row)*row_width;
    length[i] = random(max_length-20)+20;
    lastchar[i] = ' ';
    count[i] = 1;
    }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    for (int i=0;i<rows;i++)
    {
    if(count[i] >= length[i])
    {
     count[i] = 1;
     x[i] = random(max_row)*row_width;
    }
    lastchar[i] = (char)(random(26)+65);
    Form1->Canvas->TextOut(x[i],count[i]*13,lastchar[i]);
    count[i]++;
    }
    ocount++;
    if (ocount >= max)  Form1->Repaint();;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
    Form1->WindowState = wsMaximized;
    }
    //---------------------------------------------------------------------------
    


  • Nicht schlecht, allerdings fehlt noch das von dir selbst erwähnte "Leuchten", also das Einfärben des jeweils untersten Buchstabens. 😉



  • Alexander Sulfrian schrieb:

    Hi Spieleprogrammierer,

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
      Randomize();
      Form1->Refresh();
      Form1->Font->Color=clLime;
      for (int i=0; i<=100; i++)
       Form1->Canvas->TextOut(random(ClientWidth/13)*13,random(ClientHeight/13)*13,(String)(char)random(255));
    }
    

    Also wenn so kurz, dann bitte ne while-schleife, sonst flakkert's nurnoch.
    Und nochwas: Globale Variablen? -schau mal 2 Antworten weiter oben 😉



  • @e=mc²

    #include "math.h"
    

    fehlt.



  • Ja und, #include <vcl.h> fehlt auch!? Oder traust du den Leuten nicht zu, selbst den passenden Header für floor() zu finden?

    Wenn es bei der Lösung von e=mc² etwas zu bemängeln gibt dann doch wohl den Einsatz von malloc/free etc. 😉



  • Das kommt noch mit dem Leuchten. Das Problem is das is nich so einfach. Wenn man die Schriftfarbe ändert wir repaint ausgelöst. Da binn ich grad am Basteln.



  • Jansen schrieb:

    Wenn es bei der Lösung von e=mc² etwas zu bemängeln gibt dann doch wohl den Einsatz von malloc/free etc. 😉

    Was ist daran zu bemängeln?

    PS.: Um es Stillvoller zu machen sollte man anstatt die Zeichen mit Random zu ermitteln, lieber einen sich ständig wechselnden Speicherbereich auslesen.



  • e=mc² schrieb:

    Was ist daran zu bemängeln?

    Das kannst du im C++-Grundlagenwerk deiner Wahl bei der Gegenüberstellung von new/delete vs. malloc/free nachlesen. 😉


Anmelden zum Antworten