Hi Leutz,
mich würd mal interessieren wie die Konsolen in Spielen, wie z.B. Half Life etc., realisiert werden! Ich würd nämlich auch gerne eine kleine Konsole in mein Programm einbauen, damit ich ein paar werte ab fragen kann und nicht den ganzen Bildschirm mit Schrift zu pflaster muss!
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ave!
Ne Konsole zu proggen ist eigentlich relativ einfach, wenn man weiss was der Ortho-Modus ist, und man auch in der Lage ist Textu unter OpenGL auszugeben (vorzugsweise, wegen der besseren Lesbarkeit, ein Bitmapfont auf Basis einer Windowsschriftart).
Benötigte Variablen : Zunächst brauchst du einen Platz, an dem du deinen Konsolentext speicherst.Dazu eignet sich wohl eine TStringList am besten.
Dann wird natürlich noch eine Variable benötigt, in der die Benutzereingabe in die Konsole gesichert wird. Dies ist nötig, da man ja kein einfaches Edit-Feld benutzen kann, und die Benutzereingabe somit selbst verwalten muss.
Konsole zeichnen : Auch leicht, besonders im Orhtomodus :
Wenn die Konsole angezeigt werden sollst, wechselst du in den Orhto-Modus und zeichnest ein Quad, das der Größe der Konsole entsprechen soll, also z.B. halbe Bildschirmhöhe und volle Breite.
Nun muss du dort nur noch den in der TStringList liegenden Text anzeigen, und zwar von der letzten Zeile runterzählen.
Benutzereingabe verarbeiten : Wie schon gesagt, gibts für OpenGl ja kein einfaches Edit-Feld, das die Benutzereingabe für dich übernimmt.Deshalb musst du ja auch ne Variable deklarieren (String) in der die Benutzereingabe gesichert wird.
Nun kannst du diesen String ganz einfach im OnKeyPress-Event deiner Form verändern, sprich das was der Benutzer getippt hat dort hinein bringen, z.B. so:
Code:
procedure TForm1.OnKeyPres...
begin
Prüfe ob gedrückte Taste gültig (<> Backspace oder Enter) then
Eingabe := Eingabe+Key;
if Key = #13 then //=Enter
Führe Kommando aus (Eingabe);
end;
Wenn der Benutzer jetzt z.B. die Returntaste drückt, prüfst du was in diesem String steht, und wenns z.B. ein Kommando ist das du mit ner Funktion hinterlegt hast, dann führst du diese eben einfach aus.
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
da hätt ich mal 'ne Frage *sg*:
Wie finde ich raus, das z.B. eine Zahl (bzw. Reihe) damit in Verbindung steht? z.B. rotate 8,0,0,0.7 oder color 0.1,0.2,0.3 bzw. wie lese ich die Kommawerte da raus?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Mit ner ganz einfachen Schleife (for i := 1 to Length(pString)), einem variablen Wertearray für die mit Kommata getrennten Werte, und nem einfache Stringvergleich (if pString[i] = ',' then Variable speichern, neue Variable anfangen).
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ok..nochmal GANZ langsam für alle zum Mitschreiben hier mal ein Codeschnippsel...das die Variablen mit nem '.' als Fliesskommawerte dargestellt werden spielt da auch gar keine Rolle :
Anmerkung : Die Prozedur parst nur die durch Kommata getrennten Werte, also das Kommando steht nicht mehr in pString!
Ausserdem hab ich das ganze nicht getestet, sonder grad "on the fly" erdacht...
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Ich glaub dann müsste vor der ersten Zahl auch ein Komma stehen. Glaub, wenn ich mich ein wenig anstrenge, schaffe ich auch die Kommazahlen. Aber bis meine 1. Konsole im Einsatz sein wird... obwohl, ich könnte ja... naja, mal schaun... Gute Nacht auf jeden Fall (dumme Schule...)
Dies sollte (ungetest, übermütet) dazu sorgen, dass auf dem ganzen Bildschirm eine Textur gelegt wird. Eine Welteinheit entspricht einem Pixel. Ausgehend vom Ursprung links unten.
_________________ "Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
Registriert: Sa Mai 04, 2002 19:48 Beiträge: 3830 Wohnort: Tespe (nahe Hamburg)
Technisch würde ja auch ne Quad vor der Kamera reichen, bei einer "normalen" Projektionsmatrix ist ja aber der Mittelpunkt des Bildschirmes 0/0/0, bei meiner Lösung ist sie links unten und in Pixeln. Das kann das Positionieren erheblich vereinfachen
_________________ "Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
Einfach wieder die Perspektiven-Matrix setzen und fertig. Oder du merkst Dir die aktuelle Matrix mit glPushMatrix, gehst in den Ortho-Modus und zeichnest Deine 2D-Sachen und dannach holst Du Dir die alte Matrix wieder mit glPopMatrix.
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.