Hei.. pelissä päävalikko on tehdy SDL:llä ja peligrafiikka OpenGL:llä. Main menusta voi pelin käynnistää kerran, mutta toisella kerralla peli sulkeutuu. Mistä tämä voisi johtua? Pitäisikö tuon SDL_SetVideoMode:n onnistua ihan lennosta vai pitääkö siinä ottaa jotain erityistä huomioon? Piirtokoodissa ei ole lukittu screeniä kun se noinkin näyttää toimivan. Mistä tämä voisi johtua? Ohjelma ilmeisesti kaatuu jossain kohtaa koodia, koska tuota viiimeistä tulostusta ei tule. Täytynee laittaa debuggaus tulostuksia tuonne väleihin ja katsoa missä tyssää.
#include "Gui.h" #include "Game.h" #include "Constants.h" int main(int argc, char **args){ SDL_Init(SDL_INIT_VIDEO); SDL_Surface *screen = SDL_SetVideoMode(RESX, RESY, 24, SDL_DOUBLEBUF); // SDL_SWSURFACE int jatka = 1, valinta; do { valinta = mainMenu(screen); switch (valinta) { case 1: screen = SDL_SetVideoMode(RESX, RESY, 0, SDL_OPENGL | SDL_HWSURFACE); gameLoop(); screen = SDL_SetVideoMode(RESX, RESY, 24, SDL_DOUBLEBUF); break; case 99: jatka = 0; } } while (jatka); // && SDL_GetTicks() < 10000); printf("End program\n"); SDL_FreeSurface(screen); SDL_Quit(); return 0; }
Tarkistapa, palauttaako SDL_SetVideoMode NULL-osoittimen vai jotain muuta. Linuxissa ainakin tuo vaihtaminen näyttäisi onnistuvan montakin kertaa. Voit kuitenkin kokeilla, auttaako SDL:n grafiikkajärjestelmän sulkeminen, eli ennen vaihtoa sammuta se (SDL_QuitSubSystem(SDL_INIT_VIDEO)) ja käynnistä uudelleen (SDL_InitSubSystem(SDL_INIT_VIDEO)).
Ruutua ei kuulu vapauttaa SDL_FreeSurfacella.
Jos käyttää noita quit ja init subsystemejä, peli ei onnitu palaamaan pelistä päävalikkoon. Ilman niitä ohjelma ilmeisesti kaatuu rivillä SDL_SetVideoMode(RESX, RESY, 0, SDL_OPENGL | SDL_HWSURFACE), eikä se palauta edes NULL pointteria.
Oletko nyt aivan varma asiasta? Kyllä tuo näyttäisi nimittäin Windowsissakin toimivan. Kokeilisitko vielä tällaisella ohjelmalla, joka vaihtaa muutaman kerran näyttötilaa OpenGL:n ja normaalin SDL:n välillä ja värittää kummallakin ruudun tunnistettavasti? Jos tämä toimii, vikaa täytyy lähteä etsimään jostain muualta, ja jos taas ei, täytynee vain todeta, että järjestelmä ei yksinkertaisesti toimi kaikilla koneilla.
#include <SDL.h> #include <SDL_opengl.h> #include <stdlib.h> #include <stdio.h> #include <string.h> /* Vaihtaa tilan, piirtää ja odottaa sekunnin. */ void f(int w, int h, int bpp, int flags) { static int n; int i, j; /* Toimii sekä näiden kanssa että ilman: ** grafiikan "reboot" ennen vaihtoa: SDL_QuitSubSystem(SDL_INIT_VIDEO); SDL_InitSubSystem(SDL_INIT_VIDEO); */ SDL_Surface *s = SDL_SetVideoMode(w, h, bpp, flags); printf("%d: %p\n", ++n, s); if (!s) return; /* Virhe! */ j = rand(); for (i = 0; i < 2; ++i) { if (flags & SDL_OPENGL) { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); glVertex2f(-1, -1); glColor3f(0, 1, 0); glVertex2f( 1, -1); glColor3f(0, 0, 1); glVertex2f( 0, 1); glEnd(); SDL_GL_SwapBuffers(); } else { memset(s->pixels, j, w*h*bpp/8); SDL_Flip(s); } } SDL_PumpEvents(); SDL_Delay(1000); } int main(int argc, char **argv) { int i; SDL_Init(SDL_INIT_VIDEO); /* Vaihdetaan kokeeksi kolme kertaa edestakaisin. */ for (i = 0; i < 3; ++i) { f(800, 600, 8, SDL_DOUBLEBUF); f(640, 480, 0, SDL_OPENGL); } SDL_Quit(); return 0; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.