Lyhyt ja ytimekäs: Eli kuinka ladataan SDL_Surfaceen jpg kuva? Käytössä siis SDL ja SDL_Image-kirjasto.
SDL_Surface *pinta = IMG_Load("kuva.jpg");
Tuohan vaatii toki että on SDL_image asennettuna.
Ja käytössähän oli toki "SDL ja SDL_Image-kirjasto."
oho.. >_>
(Miksi käyttää JPG:tä, kun voi käyttää PNG:tä? Ellei ole valokuvasta kyse...)
jpg vie vähemmän tilaa
Riippuu ihan kuvasta, monissa tapauksissa png vie vähemmän, ja se on vielä häviötönkin.
Onkos noilla formaateilla eroa siinä että kuinka nopeaa niiden piirto ja lataus on? Tällä hetkellä käytän PNG:tä... Sen ja BMP:n välillä ainakin oli aivan helkutin iso nopeusero (testikoneena Celeron 550mhz ja 8mt näyttis).
Nopeusero missä?
Piirtovaiheessa se on joka tapauksessa muutettu samaan muotoon, joten siinä ei ole eroa. Lataamisnopeus riippuu sitten siitä, missä koneen pullonkaula on. Jos levykkeeltä lukee, niin kannattaa ehdottomasti käyttää pakatumpaa muotoa, koska lukeminen on hidasta. Kovalevyltä tulee yleensä sen verran nopeasti tavaraa, ettei sen pitäisi olla ongelma.
Piirtonopeuksien ero voi kuitenkin selittyä, jos bittisyvyys on eri; kannattaa muuttaa lataamisen jälkeen kaikki samaan muotoon kuin näyttöpinta (eli varmaankin blitata uudelle saman kokoiselle mutta eri formaattiselle pinnalle ja tuhota alkuperäinen kuvapinta), niin piirtäminen kaiken järjen mukaan nopeutuu. Uskoisin.
Lataus tapahtuu ohjelman aikana vain "kerran", tai siis sitä ei toisteta joka framella, joten sen nopeudella ei ole niinkään käytännön merkitystä.
Noo pätkiminen väheni huomattavasti... Mutta tosin tällä hetkellä kuvapinta joka näytetään eli Screen on 24 bittinen ja kuvat ilmeisesti 32 bittisiä... Olen kokeillut vaihtaa Screenin 32 bittiseksi mutta tällöin ohjelma menee ihan sekaisin, eli kuva välkkyy ja tulee kaikkia grafiikkavirheitä.
Mitähän grafiikkavirheitä? Käytätkö kaksoispuskurointia?
Kaksoispuskurointi on käytössä. Eli kuva välkkyy ja hiiren kohdalla on välkkeen toisella jaksolla vain musta laatikko. Myös jotkin piirrettävät objektit menevat valkoisiksi, mutta ei kaikki. 24 bittisenä ei siis ole mitään ongelmia mutta 32 bittisenä kyllä...
Kokeile HW_SURFACE ja SW_SURFACE. Ja sitten voisit kokeilla muuttaa kuvat 24-bittisiksi, jos sellainen SDL:llä onnistuu (en ole liikaa tutustunut). Eli uusi 24-bittinen pinta jokaiselle, blittaus siihen ja alkuperäinen kuvapinta pois, olettaisin.
Mitähän pelleilyä tämä nyt on..? Vaihdoin näyttötilaksi ikkuna niin kaikki toimi kuten pitikin. Eikä ole ensimmäinen kerta, sillä aiemmin minulla oli vaikeuksia hiiren kanssa ja sekin suostui vain ikkunatilassa toimimaan...
Onko uusin SDL yms? Onko samoja ongelmia muilla koneilla ajaessa?
SDL:n pitäisi olla uusin ja olen kahdella koneella testannut.
Itselläni on ollut colorkeyn kanssa ongelmia kokoruututilan ja ikkunan välillä. Kun se toimii ikkunatilassa, se ei toimi kokoruututilassa ja päinvastoin. Ongelmasi ei siis ole uniikki.
Minä en saanut asennettua SDL_image kirjastoa. Latasin netistä kirjaston, purin sen ohjelmani kansioon (ja lisäksi Dev-cpp:n include, Sdl hakemistoon, Kääntäjä errorittaa include lauseessa, mitä pitäisi tehdä, jotta sen saisi toimimaan.
Tässä errori: SDL_image.h No such file or directory.
Latasitko varmasti kehityskirjastot etkä vain runtime-dll:ää? Devvikirjastoissa tulee SDL_image.h ja kaverit, jotka puretaan tietty sopiviin hakemistoihin, minkä luulis paketissa olevan valmiiks oikein...
Lataa sen DevPak ja asenna siitä. Olet mitä ilmeisimmin purkanut väärän paketin ja/tai väärään paikkaan. DevPak repository ei ollut halukas yhteistyöhön, joten tässä suora linkki tällä hetkellä: http://test.nix.lv/devpak/SDL_image-1.2.3.DevPak
Joo latasin tuon Metabolixen neuvoman tiedoston ja asensin sen Dev-cpp:n asennusohjelmalla. Nyt kuitenkin kääntäjä valittaa:
[Linker error] undefined reference to 'IMG_load'.
Mitäs tuolle pitäisi tehdä?
Linkkerin virhe tarkoittaa että kyseinen IMG_load-funktio esitellään kyllä mutta sille ei ole toteutusta, ts. sinun on linkitettävä kyseisen tiedoston toteutus mukaan ohjelmaan. Eli käytännössä lisättävä linkkerin parametreihin -lSDL_image (muistaakseni noin). Linkkerin asetukset löytyvät Dev-C++:ssa projektin asetuksista.
Edit. Sooda oot hidas :)
Linkkerin optioihin -lSDL_image, veikkaisin.
Suuret kiitokset jälleen!
Lähti toimimaan.
Jaaha, tulipa ongelma taasen. Nyt kun yritän ladata kuvaa
tausta=IMG_Load("valikko.jpg");
niin ajovaiheessa tulee virheilmoitus: "Proseduurin aloituskohtaa SDL_Error ei löydy dynaamisesti linkitettävästä kirjastosta SDL.dll."
tausta=SDL_LoadBMP("tausta.bmp");
Tuolla kyllä toimii. Mistähän kyseinen virhe voisi johtua.
Voisikohan se liittyä piirtofunktioon. Eli pitääkö .jpg kuville olla omanlaisensa piirtofunktiot, kuin .bmp:n SDL_BlitSurface?
Ei, niin bittikartat kuin JPG-kuvatkin luetaan muistiin samaan muotoon, jolloin niitä voidaan piirtää samalla funkkarilla.
Vaikuttaisi minusta ennemminkin siltä, että SDL-imagen DLL (millä nimellä se sitten lieneekään) puuttuisi. SDL-imagen funktioitahan ei luonnollisesti löydy perus-SDL:n DLL:stä.
ristokor kirjoitti:
Voisikohan se liittyä piirtofunktioon. Eli pitääkö .jpg kuville olla omanlaisensa piirtofunktiot, kuin .bmp:n SDL_BlitSurface?
Sama funktio käy molemmille. Mutta aika ihmeellinen kyllä tuo virheilmoitus... Onhan kaikki linkitykset ynnä muut varmasti kohdallaan?
EDIT: Myöhässä. :)
Ahaa, eli mistäköhän saisin tuon "erikois" DDL:n. Tuleeko se SDL_imagen matkassa?
Ja pitääkö se laittaa ohjelman kanssa samaan kansioon?
No sehän löytyy DevCpp:n kansiosta jossa SDL_imagen kansiosta. Samaan kansioon ohjelman kanssa lyöt sen...
Lisäksi sinun tarttee lyödä sinne zlib1.dll, libpng12.dll ja jpeg62.dll.
EDIT: Tulipa mielenkiintoinen lauseenrakenne...
Etsin, mutten löytänyt tiedostoja libpng12.dll ja jpeg62.dll. Löysin libpng13.dll:n ja jpeg.dll:n, muttei niillä toiminut. Olisiko nuo löytämäni jotenkin uudempia vai mikäköhän on. SDL_image.dll on myöskin pelihakemistossani. Ihmetyttää, kyllä kun kaikki muut on aina moitteettomasti toiminut, mutta jotakin teen varmasti väärin. Näin lataan kuvan: tausta=IMG_Load("valikko.jpg"); ja oikeinhan tuon pitäisi olla.
No mutta tuohan valitti SDL_Error-funktiosta ja SDL.DLL:stä. Eli onko SDL.DLL paikallaan ja kai alustat SDL:n ennen kuin yrität käyttää SDL_imagea?
Joo on SDL.dll oikeassa paikassa ja SDL (video) alustettu, johtuisiko tuo errori sitten siitä että jotain menee pieleen/ei alustu ajon aikana ja sitten yrittäisi kutsua erroria, mutta sitä ei ole? Yritän etsiä SDL:n sivulta lisätietoa
Jess! Nyt lähti toimimaan. Latasin SDL:n sivuilta uusimman SDL.dll tiedoston.
Aihe on jo aika vanha, joten et voi enää vastata siihen.