TMemo & Matrix-effekt (Film)
-
Ich hab vor ein paar monaten die visuelle Darstellung der Matrix (aus dem Film) nach-programmiert. Ich hab das extrem primitive gemacht und hab einfach 60 Memos nebeneinander gehängt und ihnen das irgenwelche rand() zeichen zum ausgeben gegeben.
Mittlerweile bin ich nicht mehr so ein extremer anfänger und würd gerne die 'Matrix' verbessern bzw. neu machen.Hat irgendwer eine Ahnung wie ich ein EINEM Memo Zeichen von senkrecht ausgeben kann und nicht horizontal?
Ich hoffe das hat jetzt jeder verstanden.
-
Ich glaube, da wirst du wohl mit TCanvas arbeiten müssen. Es gab da auch schon mal was zu, wie man Senkrecht schreibt. Weiß jetzt leider nicht mehr den Titel. Ich guck mal nach und poste den
[Edit]
Sorry, in dem gemeinten Thread gings um vertikale ausrichtung
[/Edit]
-
TCanvas?
Hmmmm, das wird interresant, ich hab leider noch nie mit canvas gearbeitet.
-
-
Folgendes sieht zwar nicht ganz wie Matrix aus, aber is auch cool, TForm1::Font::Color ist im Übrigen schwarz, nicht dass ihr euch wundert.
int i; int x[100]={0}; int y[100]={0}; char Zeichen[100]={' '}; /* [...] */ void __fastcall Timer1::Timer(TObject *Sender) { Randomize(); Form1->Font->Color=clBlack; i=0; while(i<=100) { Form1->Canvas->TextOut(x[i]*13,y[i]*13,(String)Zeichen[i]); /* Damit die Zeichen nicht stehen bleiben */ ++i; } Form1->Font->Color=clLime; i=0; while(i<=100) { x[i]=Random(ClientWidth/13); y[i]=Random(ClientHeight/13); Zeichen[i]=(char)Random(255); Form1->Canvas->TextOut(x[i]*13,y[i]*13,(String)Zeichen[i]); /* Schreibt 100 neue zufällige Zeichen */ ++i; } }
-
-
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ÜRZERIst 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.