Problem s SDL_BlitSurface – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problem s SDL_BlitSurface – C / C++ – Fórum – Programujte.comProblem s SDL_BlitSurface – C / C++ – Fórum – Programujte.com

 

yaqwsx+9
Posthunter
31. 12. 2007   #1
-
0
-

Mam funkci na vykresleni obrazku na urcite misto:

int DrawImage(sprite obr,SDL_Surface *cil , int x, int y, bool a = true)

{
SDL_Rect rec;

rec.x = x - obr.rec().x;
rec.y = y - obr.rec().y;
rec.h = 0;
rec.h = 0;
if(obr.get() == NULL)
chyba << "get vraaci null!";
else
chyba << "get() vraci dobre!";
SDL_BlitSurface(obr.get(), NULL, cil, &rec);
if(a == true)
SDL_UpdateRect(cil, rec.x, rec.y, rec.w, rec.h);
return 0;

}

//omlouvam se za tu neprehlednost, ale tu funkci jsem uz 8x prepisoval a zjednodusoval....
Mam strukturu sprite, ve ktere uchovavam surface a SDL_Rect, kde mam nekolik parametru(napriklad,kde je sred obrazku, atd...)
Surface ziskavam f-ci get() a ten obdelnik f-ci par()

Bohuzel, kdyz tuto f-ci pouziji, program mi spadne.Dokonce se ani jakoby nevykonalo telo programu...

EDIT:Jeste pridavam telo programu
//Globalni promenne

SDL_Surface *okno;

sprite sprit;


bool ProcessEvent()
{
SDL_Event event;

while(SDL_PollEvent(&event))
{
switch(event.type)
{
// Klavesnice
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
return false;
break;

default:
break;
}
break;


// Pozadavek na ukonceni
case SDL_QUIT:
return false;
break;

default:
break;
}
}

return true;
}



int main(int argc, char *argv[])
{
//Inicializace
if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
chyba << "Nepodařila se inicializace";
return false;
}
okno = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE | SDL_FULLSCREEN);


//Priprava
LoadImage("flower.png", sprit, 10, 10);
if(sprit.get() == NULL)
chyba << "nevraci";
else
chyba << "vraci";

//Konec inicializace
bool done = false;
while(!done)
{
//DrawImage(sprit, okno, 20, 20);
done = !ProcessEvent();

}

// Deinicializace a konec
SDL_Quit();
return 0;





return 0;
}

Nahlásit jako SPAM
IP: 85.160.92.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Jonyzz0
Návštěvník
31. 12. 2007   #2
-
0
-

Zkus nepředávat tu strukturu sprite u té funkce hodnotou ale pomocí reference nebo ukazatele. Nevím jak máš tu strukturu sprite navrhnutou, ale jestli v destruktoru uvolnujěš paměť pomocí SDL_FreeSurface() a chtěl bys ji takhle předávat hodnotou měl by si u ní nespíš udělat kopírovací konstruktor.

Nahlásit jako SPAM
IP: 62.40.69.–
yaqwsx+9
Posthunter
31. 12. 2007   #3
-
0
-

TAk ten ukazatel,ani reference nepomohla.....Pote me napadlo dat to jako třídní f-ci.Uz program nepada.Bohuzel mit SDl_BlitSurface vraci -1.... :smile10:

Nahlásit jako SPAM
IP: 85.160.92.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Jura
~ Anonymní uživatel
637 příspěvků
31. 12. 2007   #4
-
0
-

Zdravím,

raději postni celý kód. Takhle ti tu jinak moc nepomůžeme.

Nahlásit jako SPAM
IP: 85.207.192.–
yaqwsx+9
Posthunter
31. 12. 2007   #5
-
0
-

Omlouvam se, ze je tam malo komentaru a je to neprehledne,ale mam to dosti dokopane, jak skousim ruzne moznosti.....
Dekuji za kazdou odpoved...

Nahlásit jako SPAM
IP: 85.160.92.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
survik1
~ Moderátor
0
Posthunter
31. 12. 2007   #6
-
0
-

používej defaultní funkce SDL na výpis chyby:
SDL_Error();

na SDL_Image se musíš podívat...

Nahlásit jako SPAM
IP: 89.102.163.–
Život je jen hra, která se nedá vyhrát.
yaqwsx+9
Posthunter
31. 12. 2007   #7
-
0
-

Tak jsem z toho vedle......Ukazatel SDL_Surface ukazuje na platnou oblast, presto SDl_BlitSurface hlasi chybu SDL_UpperBlit: passed a NULL surfaceget()

Nahlásit jako SPAM
IP: 85.160.92.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Jonyzz0
Návštěvník
1. 1. 2008   #8
-
0
-

No už tu chybu vidím, je ve funkci LoadImage. Problém je v tom že v ní vytvoříš proměnnou SDL_Surface *ret, kterou potom předáš pomocí metody set tomu spritu, proměnná ret má ale pouze platnost po dobu trvání té funkce (automatická proměnná), takže po skončení té funkce neukazuje ten ukazatel uvnitř třídy sprite na *ref ale na NULL, protože *ref už neexisuje.
Vytvoř si u té třídy sprite metodu LoadImage a SDL_Surface načitej rovnou do členské proměnné té třídy.

Jinak trošku sis tam popletl používání výstupu třídy fstream s funkcí fprintf

chyba << "Chyba ve f-ci LoadImage - IMG_Load nevraci \t" << "%s\n" << SDL_GetError();

Ten příznak %s tam být vůbec nemusí třída fstream má přetížený operátor << skoro pro všechny datový typy, takže pozná že předáváš řetězec, stačí pouze:
chyba << "Chyba ve f-ci LoadImage - IMG_Load nevraci " << SDL_GetError();


EDIT: a pokud tu třídu sprite chceš někde ve funkci předávat jako parametr hodnotou, tak si u ní určitě ten kopírovací konstruktor udělej, nebo jí radši všude předávej pomocí reference.

Nahlásit jako SPAM
IP: 62.40.69.–
yaqwsx+9
Posthunter
1. 1. 2008   #9
-
0
-

To Jonyzz : Tak to jsem nepochopil...Kdyz mam ukazatel ve f-ci a jeho hodnotu predam globalnimu ukazateli, tak pri ukonceni funkce se rusi pouze ukazatel, ale ta pamet stale existuje, ne?Nebo se pletu?
Vyzkousel jsem tvoji radu, bohuzel se nic nezmenilo.... :smile10:

Nahlásit jako SPAM
IP: 85.160.109.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Jonyzz0
Návštěvník
1. 1. 2008   #10
-
0
-

To yaqwsx : Omlouvám se ti máš pravdu. Zapoměl jsem, že se ta proměnná v té funkci alokuje pomocí IMG_Load dynamicky, takže existuje po skončení funkce.

Nahlásit jako SPAM
IP: 62.40.69.–
Jonyzz0
Návštěvník
1. 1. 2008   #11
-
0
-

Tak jsme to zkoušel zkompilovat a nakonec jsem přišel na to proč to padá.
V té funkci LoadImage alokuješ paměť pro SDL_Surface a ukazatel na ní předáš pomocí metody set té třídě, ale pak tu paměť dealokuješ pomocí SDL_FreeSurface !!!



int LoadImage(const char *filename,sprite& obr ,int x, int y, bool alpha = true)
{
SDL_Surface *tmp;// Pomocny
SDL_Surface *ret;// Bude vracen

if((tmp = IMG_Load(filename)) == NULL)// Prilinkovat SDL_image
{
chyba << "Chyba ve f-ci LoadImage - IMG_Load nevraci \t" << "%s\n" << SDL_GetError();
return -1;
}

if((ret = (alpha) ? SDL_DisplayFormatAlpha(tmp)
: SDL_DisplayFormat(tmp)) == NULL)
{
chyba << "Chyba ve f-ci LoadImage - nepodarilo se nastavit alpha kanal \t" << "%s\n" << SDL_GetError();
SDL_FreeSurface(tmp);
return -2;
}

SDL_FreeSurface(tmp);// Uz neni potreba
//Nastaveni parametru
SDL_Rect r;
r = obr.rec();
//NAstaveni hight
r.h = ret->h /2;
//Nastaveni weight
r.w = ret->w /2;
//NAstaveni x a y
r.x = x;
r.y = y;

//prirazeni
obr.set(ret, 0, 0);
obr.setpar(r);

SDL_FreeSurface(ret); //Tenhle řádek odstraň
return 0;
}


Program sice nespadne, ale nic to nevykresluje, nejspíš máš ještě chybu někde ve vykreslování.

Nahlásit jako SPAM
IP: 62.40.69.–
yaqwsx+9
Posthunter
2. 1. 2008   #12
-
0
-

To je teda banalni chyba!Ale zkoumal jsem kod, a zkusil dat LoadImage jako clenskou f-ci a zjednodusil jsem ji na

obr = IMG_Load(filename);

par.x = x;
par.y = y;

Ale vysledek je stejny.....Asi mam chybu nekde ve vykreslovani, bohuzel ji nemohu najit

Omluvam se pokud placam same nesmysly nebo prehlizim chyby, ale nejak mi to pres svatky nemysli....

Nahlásit jako SPAM
IP: 85.160.74.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
yaqwsx+9
Posthunter
3. 1. 2008   #13
-
0
-

Problem vyresen!Byla to opravdu drobna chybicka...... Definoval jsem si okno jako static a pak ho vsude uvadel.Ted okno predavam jako argument do f-ce a uz to funguje!!!! :smile18: :smile18: :smile18: :smile18:
A dekuji vsem za snahu!

Nahlásit jako SPAM
IP: 85.160.65.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 42 hostů

Podobná vlákna

Problem s &lt; a &gt; — založil 7raul

Problém — založil Dfire

Problém — založil Ma.ty

Problém v C++ — založil Anonim

Problem — založil roonill

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý