Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

20.02.2011, 14:41

[c++ und openGL] bild ständig aktualisieren

Hallo,
Hoffentlich bin ich im richtigen Forenbereich gelandet. Ich wollte nachfragen wie man das z.B. bei einem Autorennspiel macht dass ständig das Bild neu gezeichnet wird, auch wenn keine Tastatureingabe erfolgt.

Ich habe eine Funktion, in der ich die Tastatur abfrage und bei einem Tastendruck eine Aktion ausführen kann. Dazu eine "neu zeichnen" Funktion, die hier am Ende immer ausgegeben wird..

Mein erster einfall war das ganze mit sleep(millisekunden); in einer Schleife zu versuchen, allerdings hängt sich da das Programm auf, da in der "sleep Zeit" das ganze Programm nur pausiert wird und auch keine Tastatureingaben abgefangen werden können..

Mein 2. Einfall, den ich bisher immer verwendet habe ist die OpenGL Funktion:
void glutTimerFunc (unsigned int msecs, void (*func)(int value), value);

mit:
unsigned int msecs
Wert, in welchem Abstand die im zweiten Parameter übergebene Funktion aufgerufen werden soll.

void (*func)(int value)
Eine Funktion vom Typ "void funktionsname(int i)"

value
Der Wert, mit der die Funktion aufgerufen wird


Diese wird z.b. in eine Funktion "bewegexyz();" eingebaut, bewegexyz(); wird wiederrum im Programm gleich beim start aufgerufen.

Hiermit hat bisher alles so funktioniert wie ich wollte (abgesehen davon dass ich dadurch mein halbes Programm statisch machen musste), aber ich vermute dass das eine ziemlich schlechte Lösung dafür ist, oder? Wie müsste ich das denn anstellen, wenn ich es richtig programmieren möchte? Gibt es hierfür gute Tutorials im Internet?

Viele Grüße,
Poseidon

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

20.02.2011, 14:57

normalerweise laufen spiele in einer großen hauptschleife die abwechselnd zeichnet und updatet(objekte bewegt und tastatureingaben abfragt).
ein schleifendurchlauf nennt man frame und die zeit die für ein frame benötigt wird frametime. schafft man 100 frames in der sekunde hat man 100fps ;)
bewegungen multipliziert man am einfachsten mit der frametime. (richtig*geschwindigkeit*frametime) dabei empfiehlt sich anfangs aber vsinc einzuschalten damit du keine 2000fps hast^^

ob es da was besonderes bei opengl zu beachten gibt kann ich dir leider nicht verraten.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

20.02.2011, 19:07

Statt der statischen Verwendung kannst du dir auch einen Wrapper auf einer Template-Basis bauen, welche einen statischen Call auf eine Instanz-Methode einer beliebigen Klasse umlenkt. Auch nur getrickst und behebt das Highlander-Problem nicht ("es kann nur einen geben"), aber immerhin geht der Call dann direkt in eine Instanz-Methode hinein.

Übrigens fände ich glutDisplayFunc und glutIdleFunc sinnvoller als den Timer.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (20.02.2011, 19:13)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

21.02.2011, 00:46

Ich glaub nicht das er da viel mit anfangen konnte. Ich kann kaum nachvollziehen was du ihm damit sagen willst und ich würd mich nicht als blutigen Anfänger bezeichnen;)
Wobei doch. Nachvollziehen kann ichs doch bei nochmaligem lesen. Mal abwarten ob ers auch kann;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

21.02.2011, 09:59

Übrigens fände ich glutDisplayFunc und glutIdleFunc sinnvoller als den Timer.

Von der Verwendung von GLUT würd ich im Kontext mit C++ abraten, das verträgt sich nicht so gut. Lieber GLFW o.ä. nehmen...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

21.02.2011, 10:21

dot, das mag stimmen. Allerdings hat Poseidon1987 selbst die glutTimerFunc in's Gespräch gebracht und da das GLUT ist, habe ich ihm nur gesagt, welche Funktionen dem Zweck eher dienlich sind.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

23.02.2011, 12:10

@NachoMan
Das ist eine gute Idee und habe ich auch gleich schon ausprobieren wollen. Nur weiß ich nicht wirklich wie ich in der Schleife jetzt die Tastatur abfragen kann.. Ich habe hier aus dem TicTacToe Tutorial die Funktion verwendet, allerdings läuft dies ja über die Kommandozeile..
Wie ich das bisher gelöst hatte, ich habe eine kleine Engine, die eine keyboard funktion beinhaltet. Hier musste ich in der funktion in einer switch case schleife nur alles eintragen, so dass ich mich nicht wirklich damit auskenne wie ich das realisieren kann..
Gibt es irgendwo im Netz dazu ein mini Beispiel? Etwas ganz einfaches leicht verständliches ^^?

@blueCobold
auch in der Theorie verstanden aber an der Umsetzung mangelt es da dann bei mir etwas..

Wieso verträgt sich GLUT nicht so gut? GLFW werd ich mir mal ergoogeln =)

@all danke schonmal für alle Antworten =)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

23.02.2011, 12:27

Wieso verträgt sich GLUT nicht so gut? GLFW werd ich mir mal ergoogeln =)

Weil glutMainLoop() nie returned sondern intern exit() aufruft. exit() ist etwas was man in C++ grundsätzlich vermeiden will. Es führt dazu dass ein C++ Programm das auf glut baut prinzipiell nie korrekt beendet wird sonder immer einfach "abgewürgt", weil exit() eben einfach den Prozess killt. In C ist das kein so großes Problem aber in C++ werden z.B. die Destruktoren aller Objekte die in dem Moment auf dem Stack liegen nichtmehr aufgerufen etc.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

23.02.2011, 14:14

Gibt es irgendwo im Netz dazu ein mini Beispiel? Etwas ganz einfaches leicht verständliches ^^?

wenn du etwas leicht verständliches suchst solltest du meiner meinung erstmal nicht nicht direkt mit opengl arbeiten bevor du ein bisschen erfahrung gesammelt hast(z.b. weitere konsolenprogramme, 2d spiele/anwendungen z.b. mit der sfml oder wxwidgets/Qt oder, wenns unbedingt 3d sein soll, mit ogre3d oder irrlicht).
denn das wird nicht dein kompiliziertestes oder schwierigstes problem bleiben...
ein tutorial kenn ich aus diesem grund leider nicht(hab auch nie direkt mit opengl gearbeitet^^). ich kenn nur zwei möglichkeiten wie man input abfragen kann, entweder sie liegen in einem buffer und du musst sie in einer schleife abfragen oder du kriegst callbacks. in beiden fällen kannst du den input am anfang des frames in eine spezielle klasse schreiben, sie während des frames abfragen(ist taste a gedrückt, wenn ja...) und am ende wieder löschen. wobei du bei callbacks einen extra buffer benötigst glaube ich.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige