|

Grundlagen der Grafikprogrammierung - Teil 11 - by Delax
Tach!
Um die Unit vom letzten Mal zu testen habe ich eine kleine Spielerei für euch. Es geht schlicht und einfach nur darum einen Pixel hin- und herzubewegen. Er hat eine bestimmte Geschwindigkeit, eine X/Y Richtung und bewegt sich nach diesen Angaben. Wenn er am Bildschirmrand angekommen ist, soll er die Richtung wechseln.
Also - wir brauchen folgende Variablen: als X/Y Koordinaten: PunktX und PunktY. Für die Richtung RichtungX und RichtungY. Mehr ist nicht nötig.
Einen Pixel zu bewegen ist sehr einfach: man sagt einfach PixelX := PixelX + 1; bzw inc(PixelX). Das bewegt ihn um je einen Wert pro Durchlauf nach rechts. Doch wie lassen wir ihn die Richtung wechseln? Auch das ist einfach, denn jetzt kommen die Richtungsvariablen ins Spiel. Ihr definiert zu Anfang RichtungX und RichtungY als 1. Nun addiert ihr pro Runde PunktX mit RichtungX. Wenn der Punkt am Rand angekommen ist, nehmt die Richtung mal -1. Sie wird demnach negativ und der Punkt bewegt sich in die andere Richtung. Einfach, aber wirkungsvoll. Etwa so:
PunktX := PunktX + RichtungX;
PunktY := PunktY + RichtungY;
IF (PunktX > MaxX-5) OR (PunktX < 5) THEN RichtungX := RichtungX * -1;
IF (PunktY > MaxY-5) OR (PunktY < 5) THEN RichtungY := RichtungY * -1;
PutPixel(vidvscr,PunktX,PunktY,10,10);
Was eigentlich der Knoten an dieser Sache ist: bisher haben wir immer nur starre Programme gehabt. Unsere WinProc funktionierte so: hole die Nachricht ab, verarbeite sie. Doch was, wenn gar keine Nachricht da war? Dann hat unsere WinProc brav gewartet, bis eine da war und hat somit das ganze Programm angehalten. Schlecht, wir wollen ja, das es immer funktioniert!
Also müssen wir die WinProc ändern, so das sie folgendermaßen arbeitet: Schau nach, ob eine Nachricht da ist, wenn ja: abholen und verarbeiten, ansonsten kümmere dich um unser Programm. Dazu nutzen wir statt GetMessage einfach PeekMessage.
IF PeekMessage(@AMessage,0,0,0,0) = TRUE THEN BEGIN
GetMessage(@AMessage,0,0,0);
TranslateMessage(AMessage);
DispatchMessage(AMessage);
END;
Gar nicht so kompliziert alles, oder? jetzt noch eine Repeat/ Until Schleife um alles, damit es dauernd abläuft und gut ist.
Das komplette Programm bekommt ihr hier als Datei zum download. Es nutzt wie schon gesagt die toolbox-Unit vom letzten Mal, also nicht vergessen - ohne die geht ab jetzt nichts mehr.
Das nächste Mal schauen wir uns mal den Plasma Effekt an - an dem kann man nämlich schön Optimierung bzw. Look-Up Tables erklären ;)
Delax/ Sundancer Inc.
[delax@sundancerinc.de]
Back to previous page
|