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

Aktuelle Zeit: Fr Jul 18, 2025 15:43

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Mär 29, 2006 14:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jan 24, 2006 16:26
Beiträge: 25
hi,

in meiner Render Prozedur erhöhe ich einen wert und wenn diesen einen bestimmten grenzwert erreicht hat dann möchte ich die Render Prozedur anhalten und nach bestimmter zeit oder drücken von enter weiter laufen lassen..wie geht das?

mfg und thx für die Hilfe juKx


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 15:41 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Werte in der Renderschleife zu erhöhen ist immer ein schlechter Ansatz, da der Szenenfortschritt damit abhängig von der Leistung des Rechners ist. Du solltest einmal einen Blick auf das Thema "TimeBased Movement" (bomberman tutorial) werfen. Ansonsten macht es Sinn für so etwas eine State-Machine zu realisieren. Setze eine Variable scene auf 0, nach einer gewissen Zeit wird diese auf 1 gesetzt. In der Render-Loop setzt Du dann ein Case ein und leitest von da aus an zwei verschiedene Methoden weiter. Voila, fertig wäre ein Szenenwechsel abhängig von einem Ereignis. Eine Pausenfunktion hängt sehr stark davon ab in welcher Form pausiert werden soll. So könnte Szene zwei z.B. ein schwarzer Bildschirm sein auf dem Pause steht und bei einem Tastendruck wieder in den normalen Modus zurück fallen. Oder Du deaktivierst einfach den Zeitgeber den Du (ggf. implementiert hast), damit keine neuen Positionen mehr berechnet werden und die Szene eingefroren gezeichnet wird.

_________________
"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: Mi Mär 29, 2006 15:46 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Du könntest deine Render Proc als Event ( Procedural pointer ) deklarieren, und vor dem Ausführen auf Gültigkeit überprüfen (lassen):
Code:
  1. type
  2.   TRenderProc = procedure () of object;
  3. ..
  4.   private
  5.     { Private declarations }
  6.     F_RenderProc:TRenderProc;
  7.     procedure MyRenderProcedure();
  8. ...
  9. procedure TForm1.MyRenderProcedure;
  10. begin
  11. // hier rendern....
  12. end;
  13. ...
  14. procedure TForm1.FormCreate(Sender: TObject);
  15. begin//
  16. ....
  17.   F_RenderProc := MyRenderProcedure;
  18. end;
  19. ...
  20. procedure TForm1.FormPaint(Sender: TObject);
  21. begin
  22.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  23.   // TODO : Draw Hier
  24.   if Assigned(F_RenderProc) then
  25.     F_RenderProc();
  26.   // End Drawing
  27.   SwapBuffers(myDc);
  28. end;
  29.  
  30.  

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 16:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

hmm ich weiss nicht ob das geht, aber falls du deine Renderprozedur in mehrere kleine Teilschritte unterteilen kannst, könntest du diese mit glFlush jeweils an deine Grafikkarte schicken (sprich rendern) und dann danach jeweils fragen ob der User die Renderprozedur unterbrechen möchte.
Habe ich aber leider noch nicht selbst ausprobiert... :roll:

Viele Grüße
dj3hut1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 18:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jan 24, 2006 16:26
Beiträge: 25
hi,

ich habe jetzt die erhöhung von werten aus der rende prozedur rausgenommen und in den Idelhandler getan...jetzt male ich wirklich nur noch mit der Schleife...und TimeBasedMovment habe ich auch drin...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 20:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jan 24, 2006 16:26
Beiträge: 25
also ich habe jetzt folgenden Quelltext:
Code:
  1.  
  2. procedure TForm2.IdleHandler(Sender: TObject; var Done: Boolean);
  3. begin
  4.   QueryPerformanceCounter(Start);//für tbm
  5.   Render;
  6.   QueryPerformanceCounter(Ende);//für tbm
  7.  
  8. //bei Randberührung
  9.   //links:
  10.   if ((xm-r)<=0)and(vx<0) then
  11.     abprallen;
  12.   //rechts:
  13.   if (xm+r>=ClientWidth)and(vx>0) then
  14.     abprallen;
  15.   //oben:
  16.   if ym+r>=ClientHeight then
  17.     begin
  18.       vorz_wechsel_vy;
  19.       inc(won);
  20.       score_neu_ausgeben;
  21.       if won=2 then
  22.         begin
  23.           //hier irgentwie abbrechen und wenn z.B "ESC" gedrücktwird dann weiter spielen od. ggf. abbrechen
  24.           messagedlg('Sie haben gewonnen!',mtInformation,[mbOk],0);
  25.         end;
  26.     end;
  27.   //unten:
  28.   if ym-r<=0 then
  29.     begin
  30.       vorz_wechsel_vy;
  31.       inc(lost);
  32.       score_neu_ausgeben;
  33.       if lost=2 then
  34.         begin
  35.           //hier irgentwie abbrechen und wenn z.B "ESC" gedrücktwird dann weiter spielen od. ggf. abbrechen
  36.           messagedlg('Sie haben verloren!',mtInformation,[mbOk],0);
  37.         end;
  38.     end;
  39.  
  40.   xm:=xm+vx;
  41.   ym:=ym+vy;
  42.  
  43.   Done:=false;
  44. end;
  45.  


wo muss ich jetzt einsetzten um ne pasue oder stop oder dann weiter zu machen!?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 20:49 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Setzt einfach nen Boolean den du abfragst.
Und abhängig davon gehst du in die Renderprocedure oder nicht.

Und den Boolean änderst nach einem entsprechenden Tastendruck oder ähnlichen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 22:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jan 24, 2006 16:26
Beiträge: 25
hi,

irgentwie geht deine variante mit dem boolean typ nicht...

Code:
  1.  
  2. if game_over=false then
  3.   begin
  4.     Render
  5.     berechnungen(if anzahl=max then game_over:=true)
  6.     bla
  7.   end;
  8. else
  9.   fragen ob nochmal us.
  10.   wenn key gedrückt dann game_over:=false;
  11.  
  12.  


und das alles im idlehandleR;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 30, 2006 00:58 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Sollte auch so aussehen:
Idlehandler:
Code:
  1.  
  2. if not pause then
  3. begin
  4.   render;
  5.   kalkuliere_Spieldaten;
  6.   ...
  7. end
  8. else
  9. begin
  10.   renderpausescreen;
  11. end;
  12.  

onkeydown:
Code:
  1.  
  2. //Bei beliebiger Taste weiter
  3. if pause then pause:=false
  4. else
  5.   if key=VK_PAUSE then pause:=true;
  6.  


Das Ganze funktioniert dann so:
Das Spiel läuft normal bis der Spieler die Pause-Taste drückt.
Dann wird pause auf true gesetzt und es wird der Pausebildschirm gerendert.
Erst wenn dann eine weitere beliebige Taste gedrückt wird, läuft das Spiel wieder normal weiter.

Eine Alternative wäre:
Code:
  1.  
  2. render;
  3. if not pause then
  4. begin
  5.   kalkuliere_Spieldaten;
  6.   ...
  7. end
  8. else
  9. begin
  10.   Font.Write('Pause',centerw,centerh);
  11. end;
  12. glFlush;
  13.  

im Idlehandler.
OnKeyDown bleibt wie oben.
Dann bekommst du einfach den Bildschirm des Spieles mit einer Pause-Beschriftung.
Es bewegt sich aber nichts, da diese Sachen in kalkuliere_Spieldaten zu finden ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 30, 2006 15:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jan 24, 2006 16:26
Beiträge: 25
hi,

cool danke für deine Antwort..das mit der Pause klappt..ABER:

Code:
  1.  
  2. procedure berechnungen;
  3. begin
  4.   bla...
  5.   if ym+r then
  6.     inc(won);
  7.       score_neu_ausgeben;
  8.       if won=2 then
  9.         begin
  10.           game_over:=false; //[color=red]ist das richtig...'???[/color]
  11.           messagedlg('Sie haben gewonnen!',mtInformation,[mbOk],0);
  12.         end;
  13.     end;
  14.   //unten:
  15.   if ym-r<=0 then
  16.       inc(lost);
  17.       score_neu_ausgeben;
  18.       if lost=2 then
  19.         begin
  20.           game_over:=false;
  21.           messagedlg('Sie haben verloren!',mtInformation,[mbOk],0);
  22.         end;
  23. end;
  24.  
  25. procedure TForm2.IdleHandler(Sender: TObject; var Done: Boolean);
  26. begin
  27.   if not (pause) then
  28.     begin
  29.       QueryPerformanceCounter(Start);
  30.       Render;
  31.       QueryPerformanceCounter(Ende);
  32.       Spieldaten_kalkulieren;
  33.     end
  34.   else
  35.     if (game_over=false) or (pause=false) then
  36.       Render_pause;
  37.  
  38.   Done:=false;
  39. end;
  40.  


Ich möchte das wenn das Spiel vorbei ist(won or lost =2) das er dann das Spiel anhält und ne message ausgibt mit sie haben verloren..dann kann der benutze ne taste drücken und er spielt weiter oder er bricht das spiel ganz ab..? ichwerde bald irre. :roll:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 30, 2006 15:42 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
juKx hat geschrieben:
ichwerde bald irre. :roll:

/me too, bitte benutz Pascaltags.

Code:
  1. procedure berechnungen;
  2. begin
  3.   bla...
  4.   if ym+r then
  5.     inc(won);
  6.       score_neu_ausgeben;
  7.       if won=2 then
  8.         begin
  9.           game_over:=true;
  10.           pause:=true;
  11.           messagedlg('Sie haben gewonnen!',mtInformation,[mbOk],0);
  12.         end;
  13.     end;
  14.   //unten:
  15.   if ym-r<=0 then
  16.       inc(lost);
  17.       score_neu_ausgeben;
  18.       if lost=2 then
  19.         begin
  20.           game_over:=true;
  21.           pause:=true;
  22.           messagedlg('Sie haben verloren!',mtInformation,[mbOk],0);
  23.         end;
  24. end;

der Idlehandler:
Code:
  1. procedure TForm2.IdleHandler(Sender: TObject; var Done: Boolean);
  2. begin
  3.   if not (pause) then
  4.     begin
  5.       QueryPerformanceCounter(Start);
  6.       Render;
  7.       QueryPerformanceCounter(Ende);
  8.       Spieldaten_kalkulieren;
  9.     end
  10.   else if gameover then
  11.     Render_GameOver
  12.   else
  13.     Render_pause;
  14.  
  15.   Done:=false;
  16. end;
  17.  

OnKeyDown:
Code:
  1.  
  2. if gameover then
  3. begin
  4.   if key=VK_J then
  5.   begin
  6.     pause:=false;
  7.     neuesSpiel;
  8.   end
  9.   else Spielende;
  10. end
  11. else if pause then pause:=false
  12. else if key=VK_PAUSE then pause:=true;
  13.  

Dann hast du am Ende des Spieles ein Renderbild, was sich von dem der Pause unterscheidet, wo auch die entsprechenden Infos stehen.
Wenn der Benutzer dann j drückt wird ein neues Spiel gestartet, ansonsten beendet sich das Spiel.

Sobald du aber mehr als 2 Zustände hast, lohnt es sich ne Statemaschine (->Bomberman Tutorial) einzubauen und dann per Case zu unterscheiden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 30, 2006 15:47 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Jo... ließ dich mal ins Bomberman tutorial ein. Zu einer gescheiten Spielsteuerung gehört nämlich auch ein Menü. Und sowas mit ifs und case zu machen ist ... öhm ... DOS-Style, und passt irgendwie nicht zu OpenGL ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.011s | 14 Queries | GZIP : On ]