[C++/SDL] Czarny ekran po włączeniu gry

0

Witam, mam taki problem: piszę grę z użyciem SDL'a i wszystko działa poprawnie, kompiluje się dobrze i po kompilacji uruchamia. Jest jednak problem gdy chcę uruchomić grę poprzez plik .exe w katalogu projektu, wtedy pojawia się tylko okno gry z czarnym tłem i nic się nie dzieje a po chwili program wchodzi w stan brak odpowiedzi ;/ nie wiem co może powodować taki błąd

Z góry dzięki za pomoc

0

Zakladajac, ze juz narysowales cos to teraz mi jedna rzecz do glowy przychodzi, a mianowicie, ze zapominasz uzyc SDL_Flip() po narysowaniu czegos na ekranie. Co do tego braku odpowiedzi to albo gdzies masz SDL_Delay i sam chciales czekac albo cos z pamiecia zwaliles albo nie korzystasz z SDL_MUSTLOCK, SDL_LockSurface i SDL_UnlockSurface dla powierzchni. Najlepiej jakbys wrzucil tu swoj kod.

0

Jeszcze jedno, mozesz probowac mazac za ekranem i stad ta zawieszka, ale w takim momencie zawsze u mnie program po prostu sie wylaczal, a nie zawieszal.

0

Problem nie polega na tym, że się coś nie wyświetla, jak włączę grę przez kompilator tj. zrobię kompiluj i uruchom to działa wszystko dobrze, da się grać itp... Natomiast jeśli chcę włączyć grę za pomocą pliku .exe to występuje ten problem który opisałem wcześniej. Kompilator mam dobrze skonfigurowany ponieważ przy innym projekcie wszystko działa, używałem kompilatora ms visual c++ oraz codeblocks w obu tak samo ;/ zamieszczam kod jeszcze ze wczesnej fazy, trochę bałagan w nim jest ale nie ma go aż tak dużo i wszystko w jednym pliku więc być może łatwiej będzie znaleźć błąd

//Zalaczamy pliki
#include "SDL.h"
#include "SDL_image.h"
#include <string> 
#include <fstream>
using namespace std;


	//Dane stale i statyczne
	const int SCREEN_WIDTH = 640; 
	const int SCREEN_HEIGHT = 480; 
	const int SCREEN_BPP = 32; 
	const int TAB_HEIGHT = 20;
	const int TAB_WIDTH = 20;
	static int numer_planszy = 1;
	const int max_przejsc = 20;
	const int max_kluczy = 10;
    //Struktury przechowujace obrazy
	SDL_Surface *image = NULL; 
	SDL_Surface *przejscie = NULL; 
	SDL_Surface *screen = NULL; 
	SDL_Surface *mur = NULL; 
	SDL_Surface *postac = NULL; 
	SDL_Surface *klucz = NULL; 
	SDL_Surface *trawa = NULL; 
	//Reszta
	SDL_Event event; 
	enum STANGRY{MENU, PAUSE, GAME};
	enum KIERUNEK{UP, DOWN, LEFT, RIGHT};

class Silnik
{
public:
	void wczytaj_obraz();
    void umiesc_obraz();
	void inicjuj();
	void wczytaj_pliki();
    void wyczysc_pamiec();

};
class Gra
{
  
public:
   STANGRY stan_gry;
   void Menu();
   void Pausa();
   void Rozpocznij();
   void Zapisz();
   void Wczytaj();
};
class Obiekt
{
public:
	int id;
	int x;
	int y;
	int numer_planszy;
	bool widocznosc;
	bool blokujacy;
};
class Postac
{	
    public:
	int x;
	int y;
};

class Klucz : public Obiekt
{
public:
	void otworz_przejscie(int numer_przejscia);
};
class Przeciwnik : Postac
{
public:
	void Atakuj();
};
class Przejscie : public Obiekt
{
public:
	bool otwarte;
	int numer_przejscia;
	void zmien_status();
};
class ElPlanszy : Obiekt
{
public:
	void informacja();
};
class Plansza
{
public:
	Obiekt tablica[20][20];
};

class Bohater : public Postac
{
	
public: 
	 int numer_planszy;
	 int ilosc_kluczy;
	 void ruch(KIERUNEK kierunek, Plansza plansza);
	 void Podnies();
	 void Otworz(Przejscie przejscie);

};

//Funkcja odpowiedzialna za wczytywanie obrazow i ich optymalizacji
SDL_Surface *load_image( string filename ) 
{ 
	SDL_Surface* loadedImage = NULL; 
	SDL_Surface* optimizedImage = NULL; 
	loadedImage = IMG_Load( filename.c_str() ); 

	if( loadedImage != NULL ) 
	{ 
		optimizedImage = SDL_DisplayFormat( loadedImage ); 
		SDL_FreeSurface( loadedImage ); 
	} 
	return optimizedImage; 
} 

//funckja umieszczajaca obraz na pozycji x,y z podanego zrodla w danej strukturze
void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination ) 
{ 
	SDL_Rect offset; 
	offset.x = x; 
	offset.y = y; 
	SDL_BlitSurface( source, NULL, destination, &offset ); 
}

//Inicjalizja SDL'a oraz ekranu
bool init() 
{ 
	if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 ) 
	{ return false; } 

	screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE ); 

	if( screen == NULL ) 
	{ return false; } 

	SDL_WM_SetCaption( "Labirynt", NULL ); 

	return true; 
} 

//Polaczenia przestrzeni obrazowych z plikami
bool load_files() 
{ 

	image = load_image("images/tlo.png"); 
	mur = load_image("images/mur.png"); 
	postac = load_image("images/ludzik.png");
	klucz = load_image("images/kluczyk.gif");
	trawa = load_image("images/trawa.png");
	przejscie = load_image("images/drzwi.png");

	return true; 
}

// Funkcja zwalniajaca pamiec oraz konczaca dzialanie SDL'a
void clean_up() 
{ 
	SDL_FreeSurface( image ); 
	SDL_FreeSurface( mur ); 
	SDL_FreeSurface( postac ); 
	SDL_FreeSurface( klucz ); 
	SDL_FreeSurface( trawa ); 
	SDL_FreeSurface( przejscie ); 
	SDL_Quit(); 
} 


//Wczytanie planszy z pliku i zapisanie poszczegolnych pol do tablicy dwuwymiarowej
Plansza wczytaj_plansze(char sciezka[])
{
	ifstream plik;
	plik.open(sciezka);
	string linia;
	Plansza plansza;
	int j = 0;
	int i = 0;
	while(plik.eof() == 0)
	{   
		getline(plik,linia);
		for(i =0; i < linia.length(); i++)
		{
			plansza.tablica[j][i].id = (int)linia[i];
			if((int)linia[i] > 48)
				plansza.tablica[j][i].blokujacy = false;
			else
				plansza.tablica[j][i].blokujacy = true;
	
		}
		j++;

	}
	plik.close();
	return plansza;
}

//Wyswietlanie planszy w zaleznosci od tego co znajduje sie w tablicy oraz od tego czy pole jest widoczne
void wyswietl_plansze(Plansza plansza)
{
	apply_surface( 0, 0, image, screen ); 
	for(int j = 0; j < 20; j++)
	{
		for(int i = 0; i<20; i++)
		{
			if(plansza.tablica[j][i].widocznosc== true)
			{
				if(plansza.tablica[j][i].id==48)
					apply_surface( (i*32), (j*24), mur, screen );
				if(plansza.tablica[j][i].id==49)
					apply_surface( (i*32), (j*24), trawa, screen );
				if(plansza.tablica[j][i].id==50)
					apply_surface( (i*32), (j*24), przejscie, screen );
				if(plansza.tablica[j][i].id==51)
					apply_surface( (i*32), (j*24), klucz, screen );
			}
		}
	}
	
}


void wyswietl_wszystko(Plansza plansza, Bohater bohater)
{
	apply_surface( 0, 0, image, screen ); 
	wyswietl_plansze(plansza);
	apply_surface( bohater.x*32, bohater.y*24, postac, screen ); 
}

//Sprawdzanie czy bohater stoi na danym przejsciu oraz planszy i zwrocenie numeru przejscia
int sprawdz_przejscia(Przejscie przejscia[], Bohater bohater)
{
  for(int i =0; i < max_przejsc; i++)
  {
	  if(przejscia[i].x == bohater.x && przejscia[i].y == bohater.y && przejscia[i].numer_planszy == numer_planszy)
		  return przejscia[i].numer_przejscia;
		  
  }
  return -1;
}

//sprawdzanie czy bohater stoi na jakims kluczu
bool sprawdz_klucze(Klucz klucze[], Bohater bohater)
{
	for(int i =0; i < max_kluczy; i++)
    {
	  if(klucze[i].x == bohater.x && klucze[i].y == bohater.y && klucze[i].numer_planszy == numer_planszy)
	  {
		  klucze[i].numer_planszy = 0;
		  return true;
	  }
    }
	return false;
}


//wczytywanie nowej planszy w zaleznosci od numeru
Plansza zmien_plansze(int i)
{
	Plansza plansza;
	switch(i)
	{
		case 1:
			plansza = wczytaj_plansze("plansza1.txt");
			numer_planszy = 1;
			return plansza;
			break;
		case 2:
			plansza = wczytaj_plansze("plansza2.txt");
			numer_planszy = 2;
			return plansza;
			break;
		case 3:
			plansza = wczytaj_plansze("plansza3.txt");
			numer_planszy = 3;
			return plansza;
			break;

	}
}

//ustawianie widocznosci poszczegolnych pol w zaleznosci od pozycji na ktorej stoi bohater
void ustaw_widocznosc(Plansza &plansza, Bohater bohater)
{

   for(int j = 0; j < 20; j++)
   {
	   for(int i = 0; i < 20; i++)
	   {
		   plansza.tablica[j][i].widocznosc = false;
	   }
   }
    plansza.tablica[bohater.y][bohater.x].widocznosc = true;
   if(bohater.y+1 < TAB_HEIGHT && bohater.x-1 >= 0)
	plansza.tablica[bohater.y+1][bohater.x-1].widocznosc = true;
   if(bohater.x-1 >= 0)
	plansza.tablica[bohater.y][bohater.x-1].widocznosc = true;
   if(bohater.y-1 >= 0 && bohater.x-1 >= 0)
	plansza.tablica[bohater.y-1][bohater.x-1].widocznosc = true;
   if(bohater.y+1 < TAB_HEIGHT && bohater.x+1 < TAB_WIDTH)
	plansza.tablica[bohater.y+1][bohater.x+1].widocznosc = true;
   if( bohater.x+1 < TAB_WIDTH)
	plansza.tablica[bohater.y][bohater.x+1].widocznosc = true;
   if(bohater.y-1 >= 0 && bohater.x+1 < TAB_WIDTH)
	plansza.tablica[bohater.y-1][bohater.x+1].widocznosc = true;
   if(bohater.y+1 < TAB_HEIGHT)
	plansza.tablica[bohater.y+1][bohater.x].widocznosc = true;
   if(bohater.y-1 >= 0)
	plansza.tablica[bohater.y-1][bohater.x].widocznosc = true;

   if(plansza.tablica[bohater.y-1][bohater.x-1].blokujacy == false && bohater.y-2 >=0 &&  bohater.x-2 >= 0)
   {
		plansza.tablica[bohater.y-1][bohater.x-2].widocznosc = true;
		plansza.tablica[bohater.y-2][bohater.x-2].widocznosc = true;
		plansza.tablica[bohater.y-2][bohater.x-1].widocznosc = true;
   }
   if(plansza.tablica[bohater.y-1][bohater.x+1].blokujacy == false && bohater.y-2 >=0 &&  bohater.x+2 < TAB_WIDTH)
   {
		plansza.tablica[bohater.y-1][bohater.x+2].widocznosc = true;
		plansza.tablica[bohater.y-2][bohater.x+2].widocznosc = true;
		plansza.tablica[bohater.y-2][bohater.x+1].widocznosc = true;
   }
   if(plansza.tablica[bohater.y+1][bohater.x+1].blokujacy == false && bohater.y+2 < TAB_HEIGHT &&  bohater.x+2 < TAB_WIDTH)
   {
		plansza.tablica[bohater.y+1][bohater.x+2].widocznosc = true;
		plansza.tablica[bohater.y+2][bohater.x+2].widocznosc = true;
		plansza.tablica[bohater.y+2][bohater.x+1].widocznosc = true;
   }
   if(plansza.tablica[bohater.y+1][bohater.x-1].blokujacy == false && bohater.y+2 < TAB_HEIGHT &&  bohater.x-2 >= 0)
   {
		plansza.tablica[bohater.y+1][bohater.x-2].widocznosc = true;
		plansza.tablica[bohater.y+2][bohater.x-2].widocznosc = true;
		plansza.tablica[bohater.y+2][bohater.x-1].widocznosc = true;
   }
   if(plansza.tablica[bohater.y][bohater.x-1].blokujacy == false &&  bohater.x-2 >= 0)
	   plansza.tablica[bohater.y][bohater.x-2].widocznosc = true;
   if(plansza.tablica[bohater.y][bohater.x+1].blokujacy == false &&  bohater.x+2 < TAB_WIDTH)
	   plansza.tablica[bohater.y][bohater.x+2].widocznosc = true;
   if(plansza.tablica[bohater.y+1][bohater.x].blokujacy == false &&  bohater.y+2 < TAB_HEIGHT)
	   plansza.tablica[bohater.y+2][bohater.x].widocznosc = true;
   if(plansza.tablica[bohater.y-1][bohater.x].blokujacy == false &&  bohater.y-2 >=0)
	   plansza.tablica[bohater.y-2][bohater.x].widocznosc = true;

}

//funkcja wywolywana w momencie podnoszenia klucza (bedzie wygladala inaczej)
void Bohater::Podnies()
{
	ilosc_kluczy+=1;
}
//poruszanie sie bohatera tak aby animowac jego ruch
void Bohater::ruch(KIERUNEK kierunek, Plansza plansza)
{
   switch(kierunek)
   {
   case UP:
	   for(int i =0; i<12; i++)
	   {
		  SDL_Delay(20); 
		  wyswietl_plansze(plansza);
		  apply_surface( x*32, y*24-(i*2), postac, screen );
		  SDL_Flip(screen);
	   }
	   break;
   case DOWN:
	   for(int i =0; i<12; i++)
	   {
		  SDL_Delay(20);
		  wyswietl_plansze(plansza);
		  apply_surface( x*32, y*24+(i*2), postac, screen );
		  SDL_Flip(screen);
	   }
	   break;
   case RIGHT:
	   for(int i =0; i<16; i++)
	   {
		  SDL_Delay(20);
		  wyswietl_plansze(plansza);
		  apply_surface( x*32+(i*2), y*24, postac, screen );
		  SDL_Flip(screen);
	   }
	   break;
   case LEFT:
	   for(int i =1; i<=16; i++)
	   {
		  SDL_Delay(20);
		  wyswietl_plansze(plansza);
		  apply_surface( x*32-(i*2), y*24, postac, screen );
		  SDL_Flip(screen);
	   }
	   break;
   }
}

//ustawianie kluczy oraz przejsc na mapach
void ustaw_klucze_przejsca(Klucz *klucze, Przejscie *przejscia)
{

	klucze[0].x = 0;
	klucze[0].y = 13;
	klucze[0].numer_planszy = 1;

	klucze[1].x = 7;
	klucze[1].y = 8;
	klucze[1].numer_planszy = 2;

	klucze[2].x = 18;
	klucze[2].y = 11;
	klucze[2].numer_planszy = 3;

	przejscia[0].x=19;
	przejscia[0].y=0;
	przejscia[0].numer_planszy = 1;
	przejscia[0].numer_przejscia = 2;

	przejscia[1].x=1;
	przejscia[1].y=14;
	przejscia[1].numer_planszy = 2;
	przejscia[1].numer_przejscia = 3;

	przejscia[2].x=0;
	przejscia[2].y=11;
	przejscia[2].numer_planszy = 3;
	przejscia[2].numer_przejscia = 1;
}
int main( int argc, char* args[] )
{

	bool quit = false;

	if( init() == false ) 
	{ return 1; } 

	if( load_files() == false ) 
	{ return 1; } 
	
	//ustawianie poczatkowych wartosci oraz inicjalizacja obiektow
	Plansza plansza;
	plansza = wczytaj_plansze("plansza1.txt");
	Klucz klucze[3];
	Przejscie przejscia[3];
	ustaw_klucze_przejsca(klucze,przejscia);

	Bohater bohater;
	bohater.x = 0;
	bohater.y = 0;
	bohater.numer_planszy = 1;
	bohater.ilosc_kluczy = 0;

	ustaw_widocznosc(plansza, bohater);
	apply_surface( 0, 0, image, screen );
	wyswietl_plansze(plansza);
	apply_surface( bohater.x, bohater.y, postac, screen );
  

	if( SDL_Flip( screen ) == -1 ) 
	{ return 1; } 
    
	
	
	//dopuki nie nastapi koniec programu
	while( quit == false ) 
	{ 
		//jesli zostanie przechwycony jakis event (dzialanie ze striny uzytkownika)
		while( SDL_PollEvent( &event ) ) 
		{ 
			//jesli zostanie wcisniety krzyzyk to zakoncz
			if( event.type == SDL_QUIT ) 
			{ 
				quit = true; 
			} 
			//jesli zostanie wcisniety jakis z klawiszow na klawiaturze
			if( event.type == SDL_KEYDOWN ) 
			{ 
				switch( event.key.keysym.sym ) 
				{ 
				//klawisz o przenosi nam bohatera na kolejna plansze jesli posiada klucz oraz stoi na przejsciu
				case SDLK_o:
					if(sprawdz_przejscia(przejscia, bohater) > -1 && bohater.ilosc_kluczy > 0)
					{
						plansza = zmien_plansze(sprawdz_przejscia(przejscia, bohater));
						bohater.x = 0;
						bohater.y = 0;
						bohater.ilosc_kluczy-=1;
						ustaw_widocznosc(plansza, bohater);
						wyswietl_wszystko(plansza, bohater);
						SDL_Flip(screen);
					}
                    break;
				//klawisz p podnosi klucz jesli bohater na nim stoi
				case SDLK_p:
					if(sprawdz_klucze(klucze, bohater)== true)
					{
						bohater.Podnies();
						plansza.tablica[bohater.y][bohater.x].id = 49;
						ustaw_widocznosc(plansza, bohater);
						wyswietl_wszystko(plansza, bohater);
						SDL_Flip(screen);
					}
					break;
				//klawisz escape powoduje zakonczenie programu
				case SDLK_ESCAPE: quit = true; 
					break; 
				//strzalka w gore, dol, lewo, prawo porusza bohaterem w odpowiednim kierunku
				case SDLK_UP: 
					if(plansza.tablica[bohater.y-1][bohater.x].blokujacy == false && bohater.y-1 >=0)
					{
					bohater.ruch(UP, plansza);
					bohater.y-=1;
					ustaw_widocznosc(plansza, bohater);
					wyswietl_wszystko(plansza, bohater);
					SDL_Flip(screen);

					}
					break; 
				case SDLK_DOWN: 
					if(plansza.tablica[bohater.y+1][bohater.x].blokujacy == false && bohater.y+1 < TAB_HEIGHT)
					{
					bohater.ruch(DOWN, plansza);
					bohater.y+=1;
					ustaw_widocznosc(plansza, bohater);
					wyswietl_wszystko(plansza, bohater);
					SDL_Flip(screen);
					}
					break; 
				case SDLK_RIGHT: 
					if(plansza.tablica[bohater.y][bohater.x+1].blokujacy == false && bohater.x+1 < TAB_WIDTH)
					{
					bohater.ruch(RIGHT, plansza);
					bohater.x+=1;
					ustaw_widocznosc(plansza, bohater);
					wyswietl_wszystko(plansza, bohater);
					SDL_Flip(screen);
					}
					break; 
				case SDLK_LEFT: 
					if(plansza.tablica[bohater.y][bohater.x-1].blokujacy == false && bohater.x-1 >=0)
					{
					bohater.ruch(LEFT, plansza);
					bohater.x-=1;
					ustaw_widocznosc(plansza, bohater);
					wyswietl_wszystko(plansza, bohater);
					SDL_Flip(screen);
					}
					break; 
				
				} 
			} 
		} 
	} 



//jesli zostanie wywolany koniec programu wyczysc pamiec
	clean_up(); 
	return 0; 
} 

0

A czy jak uruchamiasz program to katalog images znajduje sie w tym samym folderze co exe?

1 użytkowników online, w tym zalogowanych: 0, gości: 1