Programm "flimmert"
-
Hi,
ich hab mal angefangen ein kleines 2D RPG zu machen(von der Seite).
Da fängt der Spieler über dem Boden an und fällt dann erstmal runter.
Dazu hab ich einen Timer gemacht:loopx = 0; loopx2 = ipl->Left; loopy = ipl->Top+ipl->Height; bfall = true; while (loopx != 30) { if (ibacabl->Canvas->Pixels[loopx + loopx2][loopy] == 0) bfall = false; loopx++; } if (bfall) { ipl->Top += 1; pltrans(transcolor); } vfall--;Kurze Erklärung:
loopx, loopx2 und loopy sind int-Variablen.bfall ist eine bool-Variable.Es soll so funktionieren, dass man zwei Bilder vom Level hat:
Eins, das der Spieler sehen kann und auf dem er sich bewegt, und eins, dass Schwarz/Weiß ist und anzeigt, wo der Spieler hingehen kann und wo nicht.
Dort wo es Schwarz ist, kann der Spieler nicht hingehen.
Außerdem kann er das Bild nicht sehen.
In dem Timer wird überprüft, ob irgendeiner der Pixel direkt unter dem Spieler schwarz ist. Wenn nein, dann bewegt sich der Spieler 1 Pixel nach unten. Andernfalls passiert nichts.
Wenn der Spieler sich bewegt hat, wird eine Funktion aufgerufen, die Teile des Spielers transparent machen soll, damit er zum Level passt(denn es ist ja kein rechteckiger Spieler).ibacpic und ibacabl sind die Images mit dem Levelbild bzw. dem Schwarz/Weiß-Bild.ipl ist das Image mit dem Spieler. vpldir ist eine int-Variable in der steht, wohin der Spieler kuckt.
Das Array dir ist ein String und enthält: ("o", "r", "u", "l");
Das sind die Abkürzungsbuchstaben der jeweiligen Richtung.
transcolor ist eine TColor-Variable in der die Farbe steht, die beim Spieler transparent gemacht werden soll.Hier die Funktion:
void pltrans(TColor transcol) { Form1->ipl->Picture->LoadFromFile (spfad + "pl" + dir[vpldir] + ".bmp"); loopx = 0; loopy = 0; while (loopy != 50) { if (Form1->ipl->Canvas->Pixels[loopx][loopy] == transcol) Form1->ipl->Canvas->Pixels[loopx][loopy] = Form1->ibacpic->Canvas->Pixels[Form1->ipl->Left+loopx][Form1->ipl->Top+loopy]; loopx++; if (loopx == 30) { loopx = 0; loopy++; } } }Das funktioniert auch alles so weit, aber wenn der Spieler dann ordnungsgemäß fällt, ziehen sich immer kleine Weiße Striche über sein Bild.
Dabei ist mein Rechner gar nicht soo langsam.
Muss ich da jetzt irgendwas unkomplizierter programmieren oder woran liegt das, dass er schon bei solchen Sachen anfängt zu flimmern?Ich hoffe ich hab alles verständlich erklärt^^
mfg
Jakel
-
Versuch mal Update() und die Eigenschaft DoublePuffered (Hilfe).
-
Hallo
Und vor allem vor allem würde ich nicht die Bilder bei jedem Schleifen/Timer durchlauf neu aus der Datei laden. Lege die bereits beim Programmstart in den Speicher, sei es ein eigenes Array oder eine TImageList.
Auch der Zugriff auf die einzelnen Pixel über die Pixels-Eigenschaft ist langsam. Verwende die Methode Scanline um eine ganze Zeile von Pixel in ein normales Array zu laden.
bis bald
akari
-
Rostfrei[] schrieb:
Versuch mal Update() und die Eigenschaft DoublePuffered (Hilfe).
Ich hab in der Hilfe nach DoublePuffered gesucht aber nichts gefunden.
akari schrieb:
Hallo
Auch der Zugriff auf die einzelnen Pixel über die Pixels-Eigenschaft ist langsam. Verwende die Methode Scanline um eine ganze Zeile von Pixel in ein normales Array zu laden.
Wie geht das mit der Scanline - Methode?
Hab ich auch schon in der Hilfe gesucht.akari schrieb:
Hallo
Und vor allem vor allem würde ich nicht die Bilder bei jedem Schleifen/Timer durchlauf neu aus der Datei laden. Lege die bereits beim Programmstart in den Speicher, sei es ein eigenes Array oder eine TImageList.
Wenn ich das Bild in eine ImagList im Builder hinzugefügt habe, wie lade ich sie dann in ein Image?
mfg
Jakel
-
Hallo
Die Eigenschaft heißt ja auch DoubleBuffered.
Zum Beispiel hier findest du Code samt Erklärung.
bis bald
akari