Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: SDL VideoModen vaihto (SDL <> GL)

msdos464 [04.03.2008 19:28:07]

#

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;
}

Metabolix [04.03.2008 19:51:56]

#

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.

msdos464 [05.03.2008 08:26:00]

#

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.

Metabolix [06.03.2008 21:33:18]

#

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;
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta