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

SDL podruhé – C / C++ – Fórum – Programujte.comSDL podruhé – C / C++ – Fórum – Programujte.com

 

vollf820
Stálý člen
17. 9. 2008   #1
-
0
-

Tak tamto už sem dořešil, radši založím novej topic. Chci načítat ten obrázek ale stále se neobjevuje. Chybu tam nikde nemůžu najít, už sem udělal i to že sem zadal absolutní cestu k obrázku ale stále je to okno jen černý. Pomůžete mi najít chybu please? Zdroják uz zkracuju.

#pragma comment (lib, "SDL_image.lib")

#pragma comment (lib, "SDL.lib")
#pragma comment (lib, "SDLmain.lib")

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

int DrawImage( SDL_Surface *surface, char *image_path, int x_pos, int y_pos )
{
SDL_Surface *image = IMG_Load ( image_path );
if ( !image )
{
printf ( "IMG_Load: %s\n", IMG_GetError () );
return 1;
}

// Draws the image on the screen:
SDL_Rect rcDest = { x_pos, y_pos, 0, 0 };
SDL_BlitSurface ( image, NULL, surface, &rcDest );
SDL_FreeSurface ( image );
return 0;
}

int main(int argc, char *argv[])
{
if( SDL_Init(SDL_INIT_VIDEO) < 0 )
{
printf("Inicializace SDL se nezdařila: %s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);

SDL_Surface *screen;
screen = SDL_SetVideoMode(600, 480, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
if ( screen == NULL )
{
printf("Vytvoření okna se nezdařilo: %s\n", SDL_GetError());
exit(1);
}

SDL_WM_SetCaption("Ahoj", NULL);

bool done=false;
while(done == false)
{
DrawImage(screen, "C:\DATA\C++\SDL\2\flower.png" , 40, 30);
SDL_Event event;
while(SDL_PollEvent(&event) ) {
if(event.type == SDL_QUIT) done=true;
}
}
return 0;
}


Zkoušel sem tu funkci volat i až za tou smyčkou SDL_Event ale ani to nešlo. Dík ...

Nahlásit jako SPAM
IP: 91.195.106.–
vollf820
Stálý člen
17. 9. 2008   #2
-
0
-

Tak sem to samý rozchodil bez chyby v Dev C++ a obrazek se opět neobjeví. Pouze černý okno s titulkem. Čili špatným linkováním a podobnejma věcma to bejt nemůže :( .... poomoooooocc .... please

Nahlásit jako SPAM
IP: 91.195.106.–
tucna0
Návštěvník
17. 9. 2008   #3
-
0
-

Čti warningy, nastuduj escape sekvence a pokud ani pak nic tak použij debugger. A pokud ti to nedojde ani tak, tak počkej než ti to tady někdo ochotně přepíše správně.

Strašně by mě zajímalo, jak postupuješ, když narazíš ve svém programu na problém tohoto ražení...

Nahlásit jako SPAM
IP: 131.207.141.–
vollf820
Stálý člen
17. 9. 2008   #4
-
0
-

No je sice pravda ze by ty lomítka bez escape sekvencí mohly dělat problém. Ale ono to nejde ani kdyz ten obrázek hodim k tomu exáči a dam tam jen "flower.png". Takže to tím asi nebude.

Jak postupuju? Zkopíruju si tu funkci DrawImage(..,..,..,) z manuálu k tý funkci a poupravim podle tutoriálu. Ale jak sem psal, to samý mi to dělalo i kdyz sem zkopíroval celej příklad a ani na něj nešáhnul.

Nahlásit jako SPAM
IP: 91.195.106.–
survik1
~ Moderátor
0
Posthunter
17. 9. 2008   #5
-
0
-

Jestli mi kvůli tobě ujede bus...

a) Nekresli obrázek v cyklu.
b) Musíš zavolat SDL_Flip(screen), protože používáš flag SDL_DOUBLEBUF. zbytek si najdi, bo ať ti to vysvětlí někdo jiný, já pospíchám

Nahlásit jako SPAM
IP: 89.102.156.–
Život je jen hra, která se nedá vyhrát.
tucna0
Návštěvník
17. 9. 2008   #6
-
0
-

No vidíš, survik1 už je velice blízko definitivnímu řešení ;)

Aha, mno takže nevíš jak použít debugger, netušíš (možná TUŠÍŠ) jak zacházet s escape sekvencí a warningy taky nečteš.

Teď se laskavě podívej do logu který vytváří SDL. Nemáš tam čistě náhodou nějáké řádky o chybě? (poradím ti - máš)

Nahlásit jako SPAM
IP: 131.207.141.–
mephi0
Expert
17. 9. 2008   #7
-
0
-

DrawImage(screen, "C:\\DATA\\C++\\SDL\\2\\flower.png" , 40, 30);

v uvodzovkach aj napišeš \ tak to berie ako zvlaštny pripad. \n je koniec riadku a nie lomítko n, takže ak chceš napísať lomítko tak ho buď napiš 2x za sebou (to sa uloži akoby tam bolo jedno) alebo použi opačné / , ktore by malo v tvojom pripade fungovať rovnako ale nemusiš ho davať dvakrát. to oprav, pretože takto ti to fungovať nebude.

Dufam že survik stihol autobus :-) Za vykonanim f-cie alebo na jej konci zavolaj
SDL_Flip(screen)

Doublebuffering znamena, že sa to najskor vykresli niekam do pamate a až je to hotove, tak to cele naraz vykresli.

skus tieto 2 veci spraviť na napiš ako to ide.

Nahlásit jako SPAM
IP: 85.248.56.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
vollf820
Stálý člen
17. 9. 2008   #8
-
0
-

warningy čtu, uznávám že ty escape sekvence v tý cestě mě nenapadly, ale říkám, kdyz tam dám

DrawImage(screen, "C:\\DATA\\C++\\SDL\\2\\flower.png" , 40, 30);

nejde to taky.

Za další, kdyby ten příkaz
if ( !image )

{
printf ( "IMG_Load: %s\n", IMG_GetError () );
return 1;
}

vytvořil nějakej log, byl bych moc rád a asi bych sem ani nepsal a poradil si sám. Jenže to nikde nic nenapíše ani nevytvoří, a jak mi bylo řečeno tady v mym prvnim topicu, novější verze SDL upustili od výpisu do soubory nebo jak to tu někdo psal.

Tak konec kódu mam ted takhle:

bool done=false;


while(done == false){
SDL_Event event;

while(SDL_PollEvent(&event) ) {

if(event.type == SDL_QUIT) done=true;
}
DrawImage(screen, "C:\\DATA\\C++\\SDL\\2\\flower.png" , 40, 30);
SDL_Flip(screen);
}
return 0;
}
taky to nejede. Jeste to vyzkouším dát jinam (do smyčky) nebo to SDL_Flip() dát do tý funkce DrawImage, nebo mě aspon nějak naveď protože tímhle se fakt hodně naučím a sem ti za to vděčnej.

Jinak máš pravdu, debugger používat neumim, tuším co to dělá, ale nevim jak to dělat (to trasování, krokování a já nevim co ještě). Kdybys věděl o nějakym návodu na VC++ 9.0 budu ti vděčnej (mam ale express edition, neni v ní náhodou debugger odstraněnej??).

jeste jednou díky ...

EDIT: Podotýkam že tohle sem sem dal dřív než sem si přečet to od mephiho takže je vidět že taková lama zas nejsem :)) (já vim, sem, ale samouci to měli vždycky těžký) ;)

Nahlásit jako SPAM
IP: 91.195.106.–
tucna0
Návštěvník
17. 9. 2008   #9
-
0
-

Už se mi to nechce řešit. Nauč se první pracovat s prostředím, které používáš a potom prosímtě něco zkoušej programovat.

(A to, že by SDL přestalo logovat do souborů jsem opravdu ještě neslyšel. Poprosil bych autora o konkrétní zdroj té informace. Děkuji)

Nahlásit jako SPAM
IP: 131.207.141.–
mephi0
Expert
18. 9. 2008   #10
-
0
-

To vollf82 : I profici zabudaju na blbosti ;) Debuger ... ono je to taka zvlaštnosť. Ak by si programoval pod nejakym linuxom tak potrebuješ textovy editor, kompilator a debuger. Tam by si mal nejaky debuger, ale visual studio to spája takže ani nevieš že s debugerom práve pracuješ ;) Debugovať znamena ladiť, teda zisťovať či to funguje ako ma. Debugovať môžeš aj bez debugera, napriklad vypisovanim hodnôt premenných za behu programu niekam do log súborov alebo lepšie do konzoly (záleži od podmienok). Už to je debugovanie. Visual studio ma veľa možností ako si to zjednodušiť. Skus sa pohrať s breakpointmi. To je super vec. Ako maš zdrojový kód, tak klikni pred začiatok nejakeho riadka (s nejakým kódom) a zjaví sa červený kruh. Ak spustiš program kde takýto breakpoint bude a vykoná sa práve riadok pred ním, tak sa beh programu zastaví a ukáže sa visual studio. A hurá na zisťovanie hodnôt premenných, krokovanie a nadávanie :-)

A aby to neostalo bez nejakej rady tak skus zistiť veľkosť nahratého obrázku, ktorý nahraješ resp. zisti či ti drawImage nevracia 1, pretože to nikde netestuješ.

Nahlásit jako SPAM
IP: 85.248.56.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
vollf820
Stálý člen
19. 9. 2008   #11
-
0
-

No konečně rozumnej člověk co mě hned nepošle do hajzlu. Zjistil sem, že chyba je někde v tomhle kódu -

SDL_Surface *image;

image=IMG_Load("flower.png");
int x=0;
if ( !image )
{
printf ( "IMG_Load: %s\n", IMG_GetError () );
x=1;
}


Jelikož to printf skutečně nikam nic nevypíše ani nevytvoří žádnej soubor (tucna věřit nemusí), a nebo to ten soubor vytváří úplně jinde než u programu a v tom případě nevim kde, tak sem si tam přidal to x=1 jako testovací hodnotu a skutečně to to x změní na 1 tudíž chyba je někde v tom image=IMG_Load("flower.png");. Nechápu ale proč. Našel sem si k tomu i dokumentaci a jedná se o jednoduchej příkaz, na kterym snad nejde ani nic zkazit. Ten obrázek MAM u exáče toho programu. Ale i kdyz sem zadal absolutní cestu k obrázku tak to stejně nešlo. Zkusim to teda ještě s jinym obrázkem v jinym formátu ale nevim proč to nejde s timhle. Obrázek normálně otevřu takže poškozenej taky neni.

Nahlásit jako SPAM
IP: 91.195.106.–
vollf820
Stálý člen
19. 9. 2008   #12
-
0
-

Aleluja, takze uz mi to funguje.

Za prvé: jiný obrázek již x=1 neházel, takže to bylo obrázkem (!!!) nechápu ovšem proč. .PNG formát by to brát mělo taky ne?? !!

Za druhé: do funkce sem musel dopsta to SDL_Flip(screen); jak mi tu taky někdo radil i přesto, že okno mam inicializované s parametrem SDL_SWSURFACE a někdo tu psal že to SDL_Flip se musí dělat u HWSURFACE ne ???

Pokud mi tohle někdo zodpoví budu vděčnej a zas o něco chytřejší ;)

Díky všem ...

Nahlásit jako SPAM
IP: 91.195.106.–
mephi0
Expert
19. 9. 2008   #13
-
0
-

to SDL_Flip(screen) je pre DOUBLEBUFERING ;)

Nahlásit jako SPAM
IP: 85.248.56.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
survik1
~ Moderátor
0
Posthunter
19. 9. 2008   #14
-
0
-

To vollf82 : Začíná mě to deptat.
a) SDL_Image sice podporuje PNG, nicméně musíš přiložit patřičné knihovny (dll)!
b) Podle kterýho kurzu se učíš? Nevěřím, že by tam nebylo zmíněno:
SDL_HWSURFACE + SDL_DOUBLEBUFERING + SDL_Flip()
nebo
SDL_SWSURFACE + SDL_UpdateRect()

Nahlásit jako SPAM
IP: 89.102.156.–
Život je jen hra, která se nedá vyhrát.
vollf820
Stálý člen
22. 9. 2008   #15
-
0
-

NO vida, stačilo jen napsta, že tu dyn. knihovnu .dll pro PNG musim přikopírovat k tomu projektu a hned bylo jasno. sice nevim proč se teda zadává v linkeru cesta k externím knihovnám ale hlavně že jsem o něco ( o dost ) moudřejší zase.

Díky moc všem a obzvláště survikovi za radu, která to zpravila ;)

Nahlásit jako SPAM
IP: 91.195.106.–
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, 121 hostů

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ý