PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmieren mit SDL


Einfachkrank
2004-01-16, 07:38:55
Hi,

wer von euch programmiert mit SDL? Ich habe die ganze Zeit meine Grafik mit OpenGL ausgegeben und brauche nun ein System für Sound und Input. Afaik stellt SDL beides zur Verfügung, oder? Kann ich OpenGL in diesem Fall mit SDL einfach kombinieren oder ist das ein größerer Aufwand?

Und wenn, kennt jemand gute Tutorials für SDL, wo die wesentlichsten Dinge über Sound und Input erklärt werden?

MFG Einfachkrank

Metal Maniac
2004-01-16, 10:31:49
Ich arbeite gerade mit der SDL.
Die Doku zu SDL:
http://sdldoc.csn.ul.ie/

Tutorials:
http://www.libsdl.org/tutorials.php

Input funktioniert ganz normal über Event-Handling (also einfach Message-Polling und die entsprechenden Keyboard- bzw. Mouse-Events abfangen). Beim Sound wird nur eine Funktion für das Einlesen von .wav bereitgestellt, aber es gibt eine Bibliothek SDL_Sound (http://www.icculus.org/SDL_sound/), die auf SDL aufbaut, und mit der man auch .mp3 usw. einlesen kann (hab' es aber noch nicht getestet).

OpenGL kann ganz normal verwendet werden, allerdings muss sdl_opengl.h inkludiert werden (anstatt der includes von OpenGL). Die OpenGL-Fenster-Verwaltung ist mit der SDL auch um einiges einfacher (zumindest im Vergleich zur normalen Erstellung unter Windows... Device Context, Rendering Context usw...).

Einfachkrank
2004-01-19, 09:09:56
Ok, in Windows komm ich mit Input und Audio schon klar. Jetzt wollte ich mich mit OpenGL unter Linux versuchen, aber da gibts noch en paar probs. Er erkennt zum Beispiel, obwohl ich die SDL_OpenGL.h inkludiert habe, keine Funktion von OGL(z.B. glViewport())...

Was muss ich denn speziell beachten, wenn ich ein Projekt anlege? Ich arbeite zur Zeit noch mit KDevelop 3.1, aber wenn du mir einen anderen Compiler empfehlen kannst, wäre auch OK, so lange ich alles zum Laufen bekomme :).

Metal Maniac
2004-01-19, 10:42:31
Tut mir leid, ich arbeite momentan nur mit Visual Studio. Um Linux einzurichten fehlt mir momentan vollkommen die Zeit, da ich meine Diplomarbeit fertig kriegen muss. Bei der DA verwende ich SDL, da ich mein Projekt später auch unter Linux kompilieren will. Allerdings werde ich mich damit wohl erst nach Ende meiner DA beschäftigen können. Somit kann ich leider nicht sagen, was man unter Linux beachten muss, um die SDL einzubinden (bzw. auch OpenGL).

Einfachkrank
2004-01-24, 15:07:49
Mittlerweile läuft mein Fenster, aber leider bleibt es schwarz und es wird nicht mein Polygon angezeigt:

# include <stdio.h>
# include <stdlib.h>
# include <SDL/SDL.h>
# include <SDL/SDL_opengl.h>


void InitGL(void)
{
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}



int main(int argc, char *argv[])
{
int quit = 0, flags;
const SDL_VideoInfo *info;
FILE *file;
SDL_Event event;

file = fopen("Protokoll.txt", "w");

if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
fprintf(file, "SDL Init: FAILED\n");
fflush(file);
exit(-1);
}

info = SDL_GetVideoInfo();

if(!info)
{
fprintf(file, "SDL_GetVideoInfo: FAILED\n");
fflush(file);
exit(-1);
}

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

flags = SDL_OPENGL/* | SDL_FULLSCREEN*/;

if(SDL_SetVideoMode(800, 600, 16, flags) == 0)
{
fprintf(file, "SDL_SetVideoMode: FAILED\n");
fflush(file);
exit(-1);
}

glMatrixMode(GL_PROJECTION);
glViewport(0, 0, 800, 600);
gluPerspective(45.0f, 800/600, 0.1f, 50.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
InitGL();

atexit(SDL_Quit);

while(quit == 0)
{
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
if(event.key.keysym.sym == 'a') quit = 1;
break;

case SDL_KEYUP:
fprintf(file, "Release: Name: %s\n", SDL_GetKeyName(event.key.keysym.sym));
break;

case SDL_QUIT: quit = 1; break;

default: break;
}
}

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glTranslatef(0.0f, 0.0f, -1.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-0.3f, -0.3f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 0.3f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.3f, -0.3f, 0.0f);
glEnd();

SDL_GL_SwapBuffers();
}

exit(0);

return EXIT_SUCCESS;
}



fehlt hier noch was? oder muss ich noch irgendwelchen speziellen Dinge unter Linux beachten?

Gnafoo
2004-01-24, 15:54:49
Du zeichnest im Uhrzeigersinn, aber benutzt:

glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);

(Bei Y ist -1 unten und 1 oben)

cu DerTod

Einfachkrank
2004-01-25, 15:09:35
Gut, das war ein ehrlich und aufrichtiger Fehler, aber das war es noch nicht ganz. Es kommt immer noch nichts...
Was mir noch aufgefallen ist, dass sich auch ne Console zu meinen Programm öffnet und dass in der dies steht:

'XLib: extension "XFree86-DRI" missing on Display ":0.0".'

Hat das was spezielles zu bedeuten, wahrscheinlich schon, nur was?

Nagilum
2004-01-25, 15:57:17
Bei dir ist die X Erweitung für die D(irect)(R)endering (I)nfrastructur nicht vorhanden oder aktiviert.

Oder anders: Du hast unter X keine funktionierende 3D Hardwarebeschleunigung.

Schau mal per "glxinfo" nach. Steht dort was vom MESA Software Renderer?

Einfachkrank
2004-01-25, 16:01:01
Ahhh, 3D Beschleunigung ist bei mir nicht aktiviert. Aber die lässt sich auch nicht aktivieren. Ich bekomme gesagt, dass meine Karte das nicht unterstützt, aber ich habe ne Sapphire Radeon 9500 und erst den neusten offiziellen Treiber für Linux installiert... Was kann ich denn da jetzt machen?

Beim glxinfo Befehl rührt sich nichts.

Nagilum
2004-01-25, 16:11:55
Schieb die Frage einfach mal ins Linux-Forum. Mit Angaben zur Distribution, Kernel usw.

Die 9500 wird aber defintiv unterstützt.
Ich hab hier eine 9500 Pro und damit lässt sich prima Quake oder Enemy Territoy unter Linux spielen. :)

Einfachkrank
2004-01-26, 12:49:59
alles klar, opengl läuft jetzt auch, es tut sich leider noch net viel im Fenster. Man sieh dass es initialisiert wurde, da alles total farbenfroh verzerrt ist, aber mehr kommt nicht. Werden vielleicht die OGL Puffer nicht getauscht? Kann ich das über die normalen OpenGL Bibliotheken auch machen, anstatt über SDL?

Gnafoo
2004-01-26, 19:44:16
Also bei mir funktioniert das Programm problemlos, nachdem
ich glFrontFace(GL_CCW); durch GL_CW ersetzt habe.

Ich weiß nicht, ob das evtl. doch irgendwie mit deinem Treiber
zusammenhängt.
Du könntest vielleicht noch ein glFlush() vor dem
SDL_GL_SwapBuffers() einfügen und schauen, ob das was ändert.
Bin mir aber nicht ganz sicher, ob das überhaupt etwas ändert.

cu DerTod

Einfachkrank
2004-01-27, 07:30:42
Ja jetzt gehts bei mir auch, nachdem ich den Quelltext mal kurz um- und wieder zurück gestellt hatte und das Programmn neu compiled hatte. Komisch, diese Compiler :)

Einfachkrank
2004-02-09, 17:21:58
kann ich über SDL die Cursor Position setzen? wenn ja, wie?

Nagilum
2004-02-09, 18:05:56
SDL_WarpMouse() (http://sdldoc.csn.ul.ie/sdlwarpmouse.php)?