Uskoisin että aika yleinenkin kysymys aloittelijoilta? Valitettavasti olemassa olevat aiheet eivät auttaneet minua yhtään, joten sepustetaanpa oma tarina vielä jonon jatkoksi...
Olen saanut sellaisen kuvan, että jos on saanut pelkästään SDL_image kirjaston asennettua, ja koodinsa oikein käännettyä, niin png-kuvien lataaminen pitäisi onnistua, eikö? Itselläni ei ilmeisesti näin ole, SDL_image kirjasto on asennettu ja toimii hyvin, ja samoin kooditkin kääntyy. Mutta ei vaan png-kuvat lataudu käytettäväksi, ja näiden SDL_Surface pintojen arvot ovat aina NULL. Voisinhan minä tietysti muuttaa nuo kaikki kuvat bmp-muotoon jolloin kaikki varmasti toimisi, mutta jättäisin sen mieluummin viimeiseksi vaihtoehdoksi.
Tein hieman tutkimuksia, ja huomasin SDL_imagen dokumentaatiossa että libpng ja zlib kirjastot vaaditaan png-kuvien lataamiseen. Eipä tätä ollut missään sitten kuuluvammin sanottu. Noh, nyt on kummatkin asennettu, ja äsken kävinkin hieman hiuksia halkomassa kun ilmeisesti juuri zlib esti ylipäätänsä kaikkien ohjelmien käytön ja vielä kirjautumisen (Ubuntu Linux, ah niin mahtava 9.04 distro), jonka jälkeen laitoin zlibin bittiavaruuteen matkailemaan. Mainittakoon vielä se että asensin SDL_image kirjaston uudelleen näiden kirjastojen asennusten jälkeen, ja kyllä se libpng:n on huomannut.
Joten, tarvittavat kirjastot ovat asennettu, mutta silti mitään muutosta ei näy. Sitten ajattelin että tarvitseekohan linkkerille mitään lippuja antaa, ja pitääkö nuo kirjastot vielä laittaa erikseen projektiin mukaan. Ehkä kaukaa haettua, mutta päätin yrittää. Noh, eipä mitään auttanut.
Sitten varmistin ne tavallisimmat ongelmat (jotka yleensä tarkistetaan ensimmäisenä mutta olen ollut tietoinen siitä että png-kuvien latailu ei ihan suoraan onnistu, ainakaan omalla kokoonpanollani): typo tiedostopolussa tai joku muu virhe kuvan lataamisessa. Mutta ei, tiedostopolut sekä hakemisto ovat 100% oikein (ja painotan 100% oikein), eikä ohjelma varsinaisesti valita ettei kuvaa löydy, ainoastaan seuraavaa:
lainaus:
No file or no mode specified
...ja tämän ymmärtäisin niin etten olisi antanut mitään tiedostopolkua purtavaksi. Valitettavasti olen kuitenkin antanut, joten ratkaisu ei voi tietenkään olla niin yksinkertainen. Tästä olen nyt lopullisesti varmistunut että ongelma ei ole koodissani, eikä itse kuvissa, eikä esimerkiksi käyttöoikeuksissa, vaan jossain ylempää. Mutta sitten kysymys kuuluukin, missä siellä? Tarvitsenko jonkun muun kirjaston, vai onko ratkaisu jotain muuta?
Varmista nyt ainakin että koodissa ei ole mitään vikaa. Varmista myös että .png-tiedosto todellakin on kelvollinen .png-tiedosto.
Tässä toimiva esimerkkikoodi.
#include <SDL/SDL.h> #include <SDL/SDL_image.h> #include <string> int main() { SDL_Surface *screen; SDL_Surface *image; std::string filename("test.png"); SDL_Init(SDL_INIT_VIDEO); screen = SDL_SetVideoMode(800,600,32, SDL_SWSURFACE); image = IMG_Load(filename.c_str()); SDL_BlitSurface(image, 0, screen, 0); SDL_Flip(screen); SDL_Delay(2500); SDL_FreeSurface(screen); SDL_Quit(); return 0; }
Koodi kääntyy seuraavasti:
g++ SDLTest.cpp -lSDL -lSDL_image -o SDL
joka siis luonnollisesti luo SDL-nimisen suoritettavan binäärin.
Nappaa jostakin png-kuva tuohon ja tallenna se "test.png" nimellä. Itse käytin tätä: http://www.crystalxp.net/galerie/img/img-icons-a-png-hard-drive-aguba-10781.png kun sattui googlella ensimäisenä eteen.
Hieman noloa ehkä nyt sanoa, mutta oli se sittenkin typo, tosin ei tiedostopoluissa :S Oliolle joka ottaa sen tiedostopolun vastaan ei käyttänyt sitä annettua tiedostopolkua kuvan lataamiseen, vaan tyhjää merkkijonoa johon tämä tiedostopolku sitten laitetaan myöhemmin. Voi tuota huolimattomuutta...
Aihe on jo aika vanha, joten et voi enää vastata siihen.