2D-Spiel Fragen und Hilfe bei Programmierung

So, ich glaub, dass die Kollision jetzt funktionieren könnte, hab das mit so ner Spiegelungsmatrix gemacht (Ich hasse es, wenn ich Dinge verwenden muss, die ich nicht ganz versteh).

Meine Frage: Würdet ihr mir OpenGL oder Direct3D empfehlen?

MfG, Crymes.
 
OpenGL, das läuft sowohl unter Windows als auch Linux. Direct3D würde ich daher nicht nutzen. Liegt aber auch an meinem universitären Background. Da ist Windows verpöhnt.
 
Dann wered eich mal schauen, ob ich mir ein Buch besorgen kann.
Wie implementiere ich eigentlich so en Grafikausgabe ohne Timer?
Etwa so: die aktuellen Koordinaten werden so schnell wie geht refreshed und in Form einer Kugel angezeigt und jede 60stel Sekunde wird die Position aktualisiert?
 
Das kannst du z.B. machen, wobei du dann natürlich wieder einen Timer hast.

Meiner Meinung nach besser ist es, wenn du einfach alle X Iterationen die Positionen neu berechnest. Von den Kugeln würde ich allerdings wegkommen. Das sind zu viele Objekte, das schaffst du nicht performant zu zeichnen.

Ich bin da atm selbst noch am Überlegen, wie man das am geschicktesten machen kann, aber atm keine Zeit dafür.

Kannst dir aber mal das N-Body Beispiel im AMD OpenCL SDK anschauen. Die haben eine Grafikausgabe per OpenGL mit dabei. Keine Ahnung wie die das Lösen, aber ich denke die zeichnen einfach nur Punkte.
 
Du solltest auf jeden Fall einen Timer verwenden. Wenn du einfach in einer Schleife wartest, braucht das Spiel sämtliche Rechenzeit auf der CPU auf.
 
nicht wirklich, dafür gibts idle funktions unter OpenGL und man kann auch ein sleep(0) einfügen, damit wird der timeframe freigegeben, was anderen Programmen Rechenzeit ermöglicht.
 
Ein Sleep Befehl gehört in der Regel nicht in eine RenderFunc oder auch die Idle Func nicht.
Bei (Free)glut gibt es ein glutPostRedisplay() - am besten mal in den freeglut Source gucken wie das arbeitet ;)


Ansonsten könnte man solche Berechnungen gut in die Renderfunction einarbeiten.

Kleines Beispiel:
Code:
void Render()
{

    static DWORD timer = timeGetTime();
    if (timeGetTime() - timer >= 15) {
        //Calc something
        timer = timeGetTime();
    }
}
So hast du alle 15ms einen Aufruf in der Renderfunktion von allem, was in der If-Abfrage ist. Das sind 66 Aufrufe pro Sekunde - definitiv ausreichend. Falls es mehr sein sollen: 1000 / gewünschte Aufrufe = ms
Das ist schon ziemlich performant, die Renderfunktion läuft ohnehin und die eine If-Abfrage brauch nicht viel Performance! Selbst wenn du mit 1000 fps renderst, was sind 1000 If Abfragen in einer Sekunde - genau, nix!

Hoffe das entspricht den Vorstellungen, hab jetzt nur die letzten paar Beiträge gelesen :ugly:
 
Nimm SDL als Bibliothek, es ist Plattformunabhängig, kann direkt auch deinen Input handeln und ist für dein Pong mehr als ausreichend.
OpenGL wäre am anfang wohl ein zu großer Brocken (viel zu groß!), damit würdest du dich nur erschlagen und hättest nachher garkeine Lust mehr (eigene Erfahrung). Wenn du Tutorials suchst, ich hab hier mal ein paar Links gepostet, die leider nicht fest gepinnt wurden. Die hätten wohl viele deiner Fragen beantwortet...
 
Ich probier mal OpenGL.
Ich hab mich da jetzt ma informiert, was es da für Bibliotheken gibt. Aber wie binde ich die jetzt ein?

Ich brauche glaub Glut für die Generierung von Fenstern als Ersatz für Windows.h und die gl.h.

Was macht aber jetzt die Glew? Die ersetzt doch die gl.h, oder? Dann bräuchste ich dann nur 2 Bibliotheken?

Sind die eigentlich für OpenGL4.2 schon in VS integriert!
 
Ne. VS unsterstützt outofthebox kein OpenGL in höheren Versionen. Windows auch nicht. Da musst du schon einiges selbst installieren usw.

Du kannst aber die glext.h unter Windows verwenden. Die hat dann selbst einen include auf gl.h usw. Im AMD SDK ist die glaub ich vorhanden. Kannst dir also einfach mal das Ding installieren. Vor allem wenn du ne AMD hast, wirst du das ja eh machen ;)

Code:
#include <gl\glext.h>//wird benötigt, um Funktionen von GL1.2 bis GL3.x verwenden zu können

Anstonsten zu OpenGL und GLUT:

Also OpenGL bietet dir ne API, um Funktionen deiner GPU zu verwenden, wie z.B. das zeichnen von Polygonen, Linien und das Verwenden von Texturen.

GLUT ist auch wiederum eine API, aber diese bietet dir nur einige Funktionen zur Verwaltung deiner GUI. Ähnlich wie dies auch QT macht. Bei GLUT musst du allerdings aufpassen. Das Ding wird nicht mehr weiterentwickelt, und das schon recht lange. Spielt für dich am Anfang aber keine Rolle, zumal du eben auch einfach FreeGLUT oder ein anderes GLUT Derivat verwenden kannst, welches dann aktuell noch supported wird. Umschreiben musst du da meist nichts.
 
Am besten gleich Freeglut nehmen - kannst die selben Befehle wie das normale glut (und sogar noch ein paar mehr) aber ist eben auch aktuell.
Zumal es gerade für den Begin einfach ist.
 
Ich hab jetzt gelesen, dass freeGlut/Glut eher nicht so der Renner für Spiele ist, eher für Demos.
Wie siehts mit SDL aus?
 
Und die Aussage kommt von wem? Einem SDL-User? ;)
Letztendlich ist es egal was du nimmst, du kannst auch generell auf sowas verzichten und dir alles selber coden, obs das einfacher macht kann man anzweifeln, gerade für den Einstieg.

Nur sind wir mal ehrlich, deine 2D-Darstellung wird definitiv kein Grafikwunder und ob du da SDL nimmst oder freeglut ist wohl so ziemlich egal.
Für den Einstieg rate ich trotzdem zu freeglut, da es einfach sehr simpel ist und was will man mehr als Anfänger?!
 
Das sehe ich auch so. Vor allem versteht man halt wirklich besser, was man macht, und (free)GLUT brauch halt auch nahezu 0 Einarbeitungszeit, was ich bei SDL mal anzweifle (Hab selbst damit noch nicht gearbeitet), da weniger als bei GLUT eigentlich nicht geht.
 
So, ich versuche mich nun an FreeGlut.
Kann mir einer helfen und sagen, warum kein Fenster mit einem Dreieck angezeigt wird?:hail: (Ich übe erst mal die Grafikausgabe, dass mit der Kolission und den Kugeln kommt später).

Ich hab den Code im Anhang.
 
Also ich sehe in deiner main nur folgendes:
Code:
    glutInit(&argc, argv);

    //Renderfunktion festlegen
    glutDisplayFunc(zeichnen);

    //immer auf neuen Event warten;
    glutMainLoop();
Das ist aber etwas zu dünn ^^

Probier mal folgendes:
Code:
    glutInit(&argc, argv);
    glutInitWindowPosition(0, 0);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

    glutInitWindowSize(800, 600);
    glutCreateWindow("Kugel");

    //Gleich noch Glew hinterher für später, kann aber auch raus
    glewInit();

    glutMainLoop();

Du hast zwar eine glutinit() aber rufst glutInit() auf - ist aber was verschiedenes! glutInit ist eine Glut-Funktion, außerdem: Case-Sensitve ;)

Ansonsten unter glutSwapBuffers: glutPostRedisplay();
 
So, hab mich mal an die Darstellung gewagt.
Ich hab das Problem, dass immer bei den cos und sin gemeckert wird, irgendwas überladenes stimmt nicht überein.

Läuft der Code in der Form, wie er im Anhang ist, eigentlich nur einmal durch und ich brauch noch ne while Schleife in der Funktion zeichnen oder wird der automatisch immer neu ausgeführt?

Danke für eure Hilfe!
 
Die glutMainLoop() ist deine Endlosschleife. ;)

Du solltest noch eine Idle-Funktion implementieren. Die wird dann immer aufgerufen, wenn sonst nichts zu tun ist, wie der Name schon sagt ;)

Da kannst du dann mit einem GlutRedisplay, oder wie das grad nochmal heist, dann dafür sorgen, dass bei jedem Aufruf von Idle neu gezeichnet wird, oder aber du definierst doch eine gewisse Anzahl an Aufrufen vor dem neu zeichnen, oder eine Mindestzeitspanne, die vergangen sein muss, bevor das Update auf dem Bildschrim erfolgt.

In die Funktion packst du dann auch deine kollision() und ballupdate() Funktionen rein. Die sind in der display Funktion SEHR unschön. ;)

Ansnsten sieht das doch schon gar nicht sooo schlecht aus. Das mit dem GL_LINE_LOOP solltest du dir aber nochmal überlegen. Da wird also vom Mittelpunkt ausgehend ein Strich nach außen geschrieben, und dann erst der Kreis gezeichnet. Warum den Mittelpunkt mit zeichnen???

Das mit cos/sin könnte vielleicht daran liegen, dass du c als int hast, sollte aber eigentlich nicht der Fall sein. Am Besten zeigst du uns einfach mal, was der Compiler/Debugger ausspuckt. Alles andere bringt nichts.
 
Das hier wird beim Kompilieren angezeigt:
Code:
[FONT=Consolas][SIZE=1][FONT=Consolas][SIZE=1]
1>------ Erstellen gestartet: Projekt: Ball Simulation, Konfiguration: Debug Win32 ------
1> Ball Simulation.cpp
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(123): warning C4244: 'Argument': Konvertierung von 'float' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(123): warning C4244: 'Argument': Konvertierung von 'float' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(128): error C2668: 'cos': Mehrdeutiger Aufruf einer überladenen Funktion
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(559): kann 'long double cos(long double)' sein
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(511): oder "float cos(float)"
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(115): oder "double cos(double)"
1> bei Anpassung der Argumentliste '(unsigned __int64)'
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(129): error C2668: 'sin': Mehrdeutiger Aufruf einer überladenen Funktion
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(585): kann 'long double sin(long double)' sein
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(537): oder "float sin(float)"
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(123): oder "double sin(double)"
1> bei Anpassung der Argumentliste '(unsigned __int64)'
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(132): warning C4244: 'Argument': Konvertierung von 'GLfloat' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(132): warning C4244: 'Argument': Konvertierung von 'GLfloat' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(143): warning C4244: 'Argument': Konvertierung von 'float' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(143): warning C4244: 'Argument': Konvertierung von 'float' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(148): error C2668: 'cos': Mehrdeutiger Aufruf einer überladenen Funktion
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(559): kann 'long double cos(long double)' sein
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(511): oder "float cos(float)"
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(115): oder "double cos(double)"
1> bei Anpassung der Argumentliste '(unsigned __int64)'
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(149): error C2668: 'sin': Mehrdeutiger Aufruf einer überladenen Funktion
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(585): kann 'long double sin(long double)' sein
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(537): oder "float sin(float)"
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(123): oder "double sin(double)"
1> bei Anpassung der Argumentliste '(unsigned __int64)'
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(152): warning C4244: 'Argument': Konvertierung von 'GLfloat' in 'GLint', möglicher Datenverlust
1>c:\users\**\documents\visual studio 2010\projects\ball simulation\ball simulation\ball simulation.cpp(152): warning C4244: 'Argument': Konvertierung von 'GLfloat' in 'GLint', möglicher Datenverlust
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
[/SIZE][/FONT][/SIZE][/FONT]

Werdet ihr daraus schlau?:hail:
 
na steht doch da, du übergibst woh
ein unsigned int64, wo du nen float oder double haben solltest. Damit kommt der compiler nicht zurecht.
 
Zurück