TMemo & Matrix-effekt (Film)
-
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.