Gry robione pisane w C z użyciem biblioteki SDL

0

Witam!
Chciałem napisać grę typu układanka, czyli mamy tablice 3x3 i jedno puste miejsce którym ruszamy by ułożyć liczby w kolejności od 1 do 8. Wszystko działało całkiem fajnie gdy na rozmieszczenie elementów było stałe, jednakże problem zaczął się gdy chciałem zrobić losowe rozmieszczenie elementów. Nie wiem dlaczego ale teraz zamiast spritów mam całe czarne ekran, jak gdyby wgl. nie czytał pliku. Dodam, że programuje na Visual Studio 2013 i projekt mam odpowiednio skonfigurowany do działania na bibliotece SDL.
Z góry dziękuje za pomoc.

#include<SDL.h>
#include<stdio.h>
#include<time.h>

SDL_Surface * ekran = NULL;
SDL_Surface * obraz = NULL;
SDL_Rect sprst[9];
SDL_Rect dprst[9];
SDL_Event zdarzenie;

int CzyBylaPowtorzona(int liczba, int tablica[], int indeks)
{
	for (int i = 0; i < indeks; i++)
	{
		if (tablica[i] == liczba) return 1;
	}
	return 0;
}

int main(int argc, char * args[])
{
	srand(time(0));
	SDL_Init(SDL_INIT_EVERYTHING);
	ekran = SDL_SetVideoMode(600, 600, 32, SDL_SWSURFACE);
	obraz = SDL_LoadBMP("liczby.bmp");
	SDL_WM_SetCaption("Ukladanka", NULL);
	Uint8 *keystate = SDL_GetKeyState(NULL);

	int x = NULL, y = NULL, i = NULL, k = NULL, wyjscie = NULL, n = 8;
	int wylosowane[8], liczba = NULL;
	for (i = 0; i<9; i++)
	{
		sprst[i].x = k;
		sprst[i].y = 0;
		sprst[i].w = 200;
		sprst[i].h = 200;
		k = k + 200;
	}
	for (i = 0; i < 3; i++)
	{
		dprst[i].x = x;
		dprst[i].y = 0;
		x = x + 200;
	}
	for (i = 3, x = 0; i < 6; i++)
	{
		dprst[i].x = x;
		dprst[i].y = 200;
		x = x + 200;
	}
	for (i = 6, x = 0; i < 9; i++)
	{
		dprst[i].x = x;
		dprst[i].y = 400;
		x = x + 200;
	}
	for (i = 0; i < 8; i++)
	{
		liczba = rand() % 8;
		if (CzyBylaPowtorzona(liczba, wylosowane, i) == 0)
		{
			wylosowane[i] = liczba;
		}
	}
	for (i = 0; i < 8; i++)
	{
		y = wylosowane[i];
		SDL_BlitSurface(obraz, &sprst[i], ekran, &dprst[y]);
	}
		
	SDL_BlitSurface(obraz, &sprst[8], ekran, &dprst[8]);

/*	SDL_BlitSurface(obraz, &sprst[0], ekran, &dprst[3]);
	SDL_BlitSurface(obraz, &sprst[1], ekran, &dprst[5]);
	SDL_BlitSurface(obraz, &sprst[2], ekran, &dprst[7]);
	SDL_BlitSurface(obraz, &sprst[3], ekran, &dprst[2]);
	SDL_BlitSurface(obraz, &sprst[4], ekran, &dprst[1]);
	SDL_BlitSurface(obraz, &sprst[5], ekran, &dprst[4]);
	SDL_BlitSurface(obraz, &sprst[6], ekran, &dprst[6]);
	SDL_BlitSurface(obraz, &sprst[7], ekran, &dprst[0]);
	SDL_BlitSurface(obraz, &sprst[8], ekran, &dprst[8]);*/

	while (wyjscie == 0)
	{
		while (SDL_PollEvent(&zdarzenie))
		{
			if (zdarzenie.type == SDL_QUIT)
				wyjscie = 1;
			if (zdarzenie.type == SDL_KEYDOWN)
			{
				switch (zdarzenie.key.keysym.sym)
				{
				case SDLK_LEFT:
					if ((dprst[n].x) > 0)
					{
						SDL_BlitSurface(ekran, &dprst[n - 1], ekran, &dprst[n]);
						SDL_BlitSurface(obraz, &sprst[8], ekran, &dprst[n - 1]);
						n = n - 1;
					}
					break;
				case SDLK_RIGHT:
					if ((dprst[n].x) < 400)
					{
						SDL_BlitSurface(ekran, &dprst[n + 1], ekran, &dprst[n]);
						SDL_BlitSurface(obraz, &sprst[8], ekran, &dprst[n + 1]);
						n = n + 1;
					}
					break;
				case SDLK_UP:
					if ((dprst[n].y) > 0)
					{
						SDL_BlitSurface(ekran, &dprst[n - 3], ekran, &dprst[n]);
						SDL_BlitSurface(obraz, &sprst[8], ekran, &dprst[n - 3]);
						n = n - 3;
					}
					break;
				case SDLK_DOWN:
					if ((dprst[n].y) < 400)
					{
						SDL_BlitSurface(ekran, &dprst[n + 3], ekran, &dprst[n]);
						SDL_BlitSurface(obraz, &sprst[8], ekran, &dprst[n + 3]);
						n = n + 3;
					}
					break;
				}
			}
		}
		SDL_Flip(ekran);
	}

	SDL_FreeSurface(obraz);
	SDL_Quit();
	return 0;
}
 
0

przeciez tu nie masz nic do odczytywania/zapisywania do pliku. To z jakiego pliku to ma niby czytac?
podziel to na funkcje. Main niech ma jedna funkcje. Start. Kazda funkcja (oprocz obsluzenia eventow) niech bedzie do 10 linijek. usun magic numbery, DRY(petle for). Wtedy znajdziesz sam blad ;)

0
fasadin napisał(a):

przeciez tu nie masz nic do odczytywania/zapisywania do pliku. To z jakiego pliku to ma niby czytac?
podziel to na funkcje. Main niech ma jedna funkcje. Start. Kazda funkcja (oprocz obsluzenia eventow) niech bedzie do 10 linijek. usun magic numbery, DRY(petle for). Wtedy znajdziesz sam blad ;)

A co według ciebie robi poniższy kod, jak nie wczytuje obrazu?

obraz = SDL_LoadBMP("liczby.bmp");

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