Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 05, 2025 17:57

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Konsole?
BeitragVerfasst: So Jan 12, 2003 20:50 
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!

Tschö Newbie


Nach oben
  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 21:40 
Offline
DGL Member
Benutzeravatar

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:
  1.  
  2.  
  3. procedure TForm1.OnKeyPres...
  4.  
  5. begin
  6.  
  7. Prüfe ob gedrückte Taste gültig (<> Backspace oder Enter) then
  8.  
  9.  &nbsp;Eingabe := Eingabe+Key;
  10.  
  11. if Key = #13 then //=Enter
  12.  
  13.  &nbsp;Führe Kommando aus (Eingabe);
  14.  
  15. end;
  16.  
  17.  

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 22:29 
Offline
DGL Member
Benutzeravatar

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 22:33 
Offline
DGL Member
Benutzeravatar

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).

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 22:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Und wie mit den Kommawerten bzw. mit einem Dezimalzeichen getrennte Werte wie Pi z.B. 3,1472...?
Zitat:
color 0.1,0.2,0.3


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 22:45 
Offline
DGL Member
Benutzeravatar

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...

Code:
  1.  
  2.  
  3. procedure Parse(pString : String);
  4.  
  5. var
  6.  
  7.  Vars &nbsp; &nbsp; &nbsp; : array of String;
  8.  
  9.  FVars &nbsp; &nbsp; &nbsp;: array of Float;
  10.  
  11.  S &nbsp; &nbsp; &nbsp; : String;
  12.  
  13.  i,j &nbsp; &nbsp; &nbsp; : Integer;
  14.  
  15. begin
  16.  
  17. for i := 1 to Length(pString) do
  18.  
  19.  &nbsp;begin
  20.  
  21.  &nbsp;if pString[i] = ',' then
  22.  
  23.  &nbsp; &nbsp;begin
  24.  
  25.  &nbsp; &nbsp;SetLength(Vars, Length(Vars)+1);
  26.  
  27.  &nbsp; &nbsp;Vars[High(Vars)] := S;
  28.  
  29.  &nbsp; &nbsp;end;
  30.  
  31.  &nbsp;S := S+pString
  32.  
  33.  &nbsp;end;
  34.  
  35. SetLength(FVars, Length(Vars);
  36.  
  37. for i := 0 to High(Vars) do
  38.  
  39.  &nbsp;begin
  40.  
  41.  &nbsp;for j := 1 to Length(Vars[i]) do
  42.  
  43.  &nbsp; if Vars[i,j] = '.' then
  44.  
  45.  &nbsp; &nbsp;Vars[i,j] := ','; &nbsp; // nötig, da StrToFloat länderspezifisch ist!!!
  46.  
  47.  &nbsp;FVars := StrToFloat(Vars[i]);
  48.  
  49.  &nbsp;end;
  50.  
  51.  


Dürft so (oder mit ein paar kleinen Änderungen) funzen...

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 22:51 
Offline
DGL Member
Benutzeravatar

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. :wink: 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...) :wink:

Cyas,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 22:52 
Hi

Ok ich ist so weit eigentlich alles verständlich, aber was ist der Ortho-Modus?


Nach oben
  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 22:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
Ich glaub dann müsste vor der ersten Zahl auch ein Komma stehen

Negativ!Das klappt auch, wenn vor der ersten Zahl kein Komma steht...sieh dir den Code mal genauer an.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 13, 2003 00:17 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
@ortho: Das ist ein "Projektions-Modus" in dem die Tiefe fehlt. Besonders dann sinnvoll, wenn man 2D zeichnen möchte:

Code:
  1.  
  2.  
  3. glMatrixMode(GL_PROJECTION);
  4.  
  5. glLoadIdentity;
  6.  
  7. gluOrtho2d(0,width,0,heigth);
  8.  
  9. glMatrixMode(GL_MODELVIEW);
  10.  
  11.  
  12.  
  13. glLoadIdentity;
  14.  
  15.  
  16.  
  17. glBegin(GL_QUADS);
  18.  
  19.  &nbsp;glTexCoord2f(0,0); glVertex2d(0,0);
  20.  
  21.  &nbsp;glTexCoord2f(1,0); glVetrex2d(width,0);
  22.  
  23.  &nbsp;glTexCoord2f(1,1); glVertex2d(width,height);
  24.  
  25.  &nbsp;glTexCoord2f(0,1); glVertex2d(0,height);
  26.  
  27. glend;
  28.  
  29.  
  30.  
  31. Dies sollte (ungetest, übermütet) dazu sorgen, dass auf dem ganzen Bildschirm eine Textur gelegt wird. Eine Welteinheit entspricht einem Pixel. &nbsp;Ausgehend vom Ursprung links unten.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 13, 2003 14:49 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
@Ortho: Ist das wirklich notwendig? Ich meine, reicht es nicht einfach, die 2D-Funktionen von OpenGL zu benutzen? (Also glVertex2f & co) ?

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 13, 2003 15:08 
Offline
Fels i.d. Brandung
Benutzeravatar

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..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 06, 2003 13:56 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
wie schaltet man vom Ortho-Modus wieder in den "Normalen" Modus um?? :roll:

Fiji-Fighter

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 06, 2003 13:59 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Code:
  1.  
  2.  
  3.  &nbsp;...
  4.  
  5.  &nbsp;glMatrixMode(GL_PROJECTION);
  6.  
  7.  &nbsp;gluProjectionMatrix(die üblichen Parameter);
  8.  
  9.  &nbsp;glMatrixMode(GL_MODELLVIEW);
  10.  
  11.  &nbsp;...
  12.  
  13.  &nbsp;und weiter geht's.
  14.  
  15.  

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?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]