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

Aktuelle Zeit: Mi Jul 16, 2025 23:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Feb 18, 2006 22:14 
Offline
DGL Member

Registriert: Di Feb 07, 2006 20:22
Beiträge: 27
Hallo Leute,

eine paar Freunde und ich wollen für den informatikunterricht eine kleine Grafikdemo in OpenGL schreiben (nichts besonderes, alles auf Einsteigerniveau). Die einzelenen Szene sind auch schon fertig (z.B. ein Dreieck das auftaucht und wieder verschwindet), nur wie packen wir das alles in ein Programm, so dass nach ca. 10 sec die nächste Szene gerendert wird? Meine Idee wäre gewesen die Durchläufe der Renderfunktion zu zählen und mithilfe von if then Bedingungen, die bei einer gewissen Anzahl des Durchlaufens ausgelößt werden zu bestimmen, was angezeigt wird.

Gibt es da vielleicht eine professionellere Lösung?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 18, 2006 22:36 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
also ich hab mal sowas ähnliches gemacht. Für kleine Demos ist das durchaus anwendbar, bei etwas größeren funktioniert es auch noch erstaunlich gut, jedoch sollte man dann auf Dateibasierte Lösungen zurückgreifen.

Also: Ihr legt euch einfach ein Array of single an. Darin stehen jeweils die zeitlichen Endpunkte der einzelnen Teildemos.
Soll also das Erscheinende Dreieck für z.B. 5 Sekunden gezeigt werden, danach soll für 2 Sekunden beispielsweise das Dreieck flackern oder sonstwas *g*, definierst du es einfach so:
Code:
  1. type
  2.   TimeSegs = (tsTriangle, tsFlashingTriangle);
  3. var
  4.   TimePosition: Single;
  5.   CurrentSeg: integer;

Code:
  1. const
  2.   TimeLine: array [TimeSegs] of single = (5000, 7000);

bzw. so:
Code:
  1. const
  2.   Timeline: array [TimeSegs] of single = (5000, 2000);

Ersteres definiert genau, wann absolut die aktuelle Unterdemo aufhört, letzteres dagegen, wie lange es dauert. Das Erste ist also absolut und es können dort die Zeiten geändert werden, ohne dass nachfolgende Sachen davon beeinflusst werden, während letzteres auch nachfolgende Sachen beeinflusst.

Im Game-Loop inkrementierst du dann TimePosition mithilfe von Timebased Movement, sodass es in einer Sekunde um 1000 erhöht wird. Kann natürlich alles geändert werden, aber Millisekunden dürften hier die gebräuchlichste Zeitform sein ;)
Was mit CurrentSeg passiert, hängt von der Herangehensweise ab. Und zwar davon, ob man es relativ oder absolut macht.
Ich beginne mal mit dem Absoluten:
CurrentSeg wird auf 0 gesetzt und dann solange um 1 inkrementiert, solange TimeLine[CurrentSeg] < TimePosition ist. Dadurch weißt du dann immer, in welchem Segment du dich befindest.
Du kannst dann deine Statemachine entsprechend setzen und beim Zeichnen immer abfragen, in welchem Segment du dich befindest ;) Denke, der Rest sollte klar sein.

Bei der relativen Herangehensweise verläuft es zum Großteil analog und die wenigen Änderungen, die gemacht werden müssen, sollten nun klar sein *g*

Gruß,
Frase

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 18, 2006 23:19 
Offline
DGL Member

Registriert: Di Feb 07, 2006 20:22
Beiträge: 27
Erstmal danke für die Hilfe, aber ich stehe im Moment noch ein bisschen auf dem Schlauch:

Was genau ist timesegs? Es ist definitiv kein record; TsTriangle und TSFlashingTriangle scheinen Teile der Demo zu sein.
Und warum übergibts dem Array die single Werte 7000 und 5000?

Danke schonmal im Voraus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 18, 2006 23:45 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 13, 2004 17:17
Beiträge: 43
Wohnort: GER/OBB/TÖL-WOR/Icking
Code:
  1. TimeSegs = (tsTriangle, tsFlashingTriangle);

Timeseg ist ein Aufzählungstyp(mir fällt die englische bez. grad ned ein) d.h. Timesegs kann entweder den "Wert" tsTriangle oder tsFlashingTriangle annehmen
Code:
  1. const
  2.    Timeline: array [TimeSegs] of single = (5000, 2000);

Const (nicht Var) deklariert das Array als Konstante, da musst du nix übergeben, die Werte können sich nicht ändern.

PS: ich helf ja gerne aber sry "const" ist ein mustknow.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 19, 2006 01:42 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also, jeh nachdem wie kompliziert die Teildemos sind würde ich es eventuell etwas anders angehen:

Statemachine und so is klar. Aber ich würde die Szenen lieber etwas überblenden. Dazu einfach paar Durchläufe vor dem umschnappen anfangen die nachfolgende Szene über die eigentliche drüberzublenden. Einfachste Möglichkeit wäre das Jeweilige startbild einer jeden Szene in eine Textur zu rendern und diese Textur dann mit zunehmender Sichtbarkeit über die Szene zu mappen. (Alpha Kanal)
Wenn der Alphakanal dann 100% da ist, startet die nächste Szene. Je nachdem wie lange das Blenden dauert wäre es vermutlich sinnvoll das überblenden nicht linear sondern exponentiell zu machen. Also am anfang den alphawert wenig erhöhen, und dann zum ende hin immer schneller werden.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 19, 2006 12:20 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Was spricht den gegen eine einfache State-Maschine für die Armen ;) Timebased Movement, damit es keine Unfälle auf dem Demonstrationsrechners gibt und in der Render, ein riesiges Case in dem dann an die aktuell einfache Render-Procedure weitergegeben wird. Alternativ das gleiche auch noch für ein Updateworld, falls es komplexere zeitabhängige Berechnungen gibt und gut ist. Ich gehe mal davon aus, dass die bisherige Arbeit verstanden worden ist und nicht die Gefahr eines simplen Plagiates besteht ;)
Jan Horn schrieb 2001 eine kleine Grafik-Demo namens Biohazzard, die mehr oder minder genau das macht, was Ihr machen wollt. Ich würde einmal einen kurzen Blick darauf empfehlen: http://www.sulaco.co.za/opengl_project_biohazard-optimize_2001_megademo.htm

_________________
"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: So Feb 19, 2006 20:25 
Offline
DGL Member

Registriert: Di Feb 07, 2006 20:22
Beiträge: 27
Erstmal danke für die vielen Antworten. Leider ist mir keine davon ist mir bisher wirklich klar geworden. Allerdings hatte ich einen Geistesblitz um dieses Problem wenigstens halbwegs zu umgehen. Ich erstelle eine globale Variable, die auf Tastendruck erhöht wird. Abhänig davon verändert sich dann sie Szene, was schon sehr cool ist.

Das ist wahrscheinlich extrem noobiehaft aber solange es funzt ist mir das recht.


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


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]