Eli miten voin määrittää kuvan koon? Esimerkiksi kuvan koko on 100 niin siitä piirretäänkin vain muuttujan_arvo px?
Kristallipallo kertoo, että kun olet nyt räpiköinyt SDL:n kanssa, niin tämäkin kysymys koskee sitä.
Eikös se aika selvästi oppaassa lue?
En tarkoittanut tuota kuvaa vaan siis kuva SDL_LoadBMP().
Et ymmärtänyt. Eli teen
int leveys = kuva->w; int korkeus = kuva->h; leveys=leveys-jokumuuttuja //korkeudelle sama
Vai onko helpompi tapa?
Taisin ymmärtää kysymyksesi ensin väärin.
Eli siis luulin, että haluat selvittää SDL_LoadBMP:llä ladatun kuvan koon, mutta ilmeisesti halusitkin ottaa kuvasta vain osan ja piirtää sen.
SDL_BlitSurface:n esittely:
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
Se siis ottaa paitsi lähde- ja kohdepinnat, myös laatikkomäärittelyn kummallekin. Eli määrittele kuvaa pienempi laatikko srcrect:iksi niin saat vain osan kuvasta.
Ei, ei ole helpompaa tapaa vähentää leveydestä jotain lukua kuin vähennyslasku. Se ei ole kovin mutkikasta, vai onko sinusta? Jos tiedät valmiiksi, että haluat piirtää esim. 32 pikseliä, voit tietysti kirjoittaa suoraan tämän 32:n siihen. (Olisikin typeryyden huippu laskea se joka kerta jostain lausekkeesta näennäisesti kuvan leveyden perusteella...)
Ennen kuin kysyt, miten Grezin neuvo toteutetaan, mene takaisin lukemaan opasta – siinä on esimerkki.
Tuli tässä vain mieleen, että tämän hetken koodissani ei ole mitään logiikkaa. Eikä se edes toimi, joten mitä teen?
Koodi ei ole tälläisessä pötkössä vaan sijoitin kaikki nuo koodit tänne.
int leveys = elama_plus->w; int korkeus = elama_plus->h; void Huone8Piirto(void) { leveys=elama; elama_plus.w = leveys; //tarkoitus muuttaa leveys leveys muuttujaksi. PiirraKuva(kentta_1, naytto, 0, 0); KatsoOikeaHahmoKokonaan(1); PiirraKuva(koko_hahmo_1, naytto, vasX, vasY); PiirraKuva(elama_miinus, naytto, 10, 10); PiirraKuva(elama_plus, naytto, 10, 10); }
Härppäää windowsin 8 ja 5 erroreita.
mika132 kirjoitti:
Tuli tässä vain mieleen, että tämän hetken koodissani ei ole mitään logiikkaa. Eikä se edes toimi, joten mitä teen?
- -
Härppäää windowsin 8 ja 5 erroreita.
Sanon tämän nyt vielä kerran, että siirry helpompien tehtävien pariin ihan oikeasti. Tee kunnollinen tekstiseikkailu, jonka juoni ladataan ulkoisesta tiedostosta. Tee siis kunnollinen moottori, jonka ympärille peli rakentuu.
minulla on. Ainut vain et taistelun elämäpalkki ei näy.
KUNNOLLINEN MOOTTORI!!! No joo, mutta sun pitää rakentaa se palkki monesta pienestä osasta, eikä venyttää yhtä osaa.
eikun minulla on 100px kokoinen elama_plus kuva (vihreä väri) ja elämä miinus kuva (punainen väri) Tuohon elämä miinus kuvan kokoon ei kosketa kun taas elämä plus kuva pienenee sitä tahtia, kun elämäkin. Olen tuollaisen joskus PHP:llä tehnyt yhteen selainpeliini, mutta ongelma on siinä, että siihen oli valmiit pohjat. nimittäin .CSS ja PHP muuttujat. C++ en löydä mitään valmista mihin saisi suoraan laittaa kuvan koon. :)
Sanoin jo edellisessä viestissäni, että oppaassa on esimerkki, jossa piirretään kuvasta vain osa. Jos et itse löydä sitä, kannattaisi kyllä lopettaa ohjelmointi, kunnes opit lukemaan kunnolla. (Jos et halua leikata kuvaa vaan skaalata sitä, niin eräässä aiemmassa keskustelussa käytit jo siihen sopivaa funktiota... Muistatko? Vast'ikään kehuit, että opit tekemällä, joten todistapa nyt oppineesi.)
Pääohjelma
#include "funktiot.hpp" int main (int maara, char **argumentit){ SDL_alusta(640, 480, 16, SDL_HWSURFACE|SDL_DOUBLEBUF); bool kaynnissa = true; while(kaynnissa){ kaynnissa = kasittele_viestit(); piirra(); SDL_Delay(150); } return EXIT_SUCCESS; }
funktiot.hpp
#ifndef _FUNKTIOT_HPP #define _FUNKTIOT_HPP #include <SDL/SDL.h> #include "kuvavarasto.hpp" void SDL_alusta(int leveys, int korkeus, int syvyys, Uint32 Liput); SDL_Rect newRect(int x, int y); int rnd(int ala, int yla); void liikuta(double aika); void piirra(); bool kasittele_viestit(); #endif
funktiot.cpp
#include "funktiot.hpp" SDL_Surface *ruutu; SDL_Surface *plus; SDL_Surface *miinus; int elama = 30; void SDL_alusta(int leveys, int korkeus, int syvyys, Uint32 Liput){ SDL_Init(SDL_INIT_VIDEO); std::atexit(SDL_Quit); plus = image_cache::common().get("kuvat\\elama_plus.png"); miinus = image_cache::common().get("kuvat\\elama_miinus.png"); ruutu = SDL_SetVideoMode(leveys, korkeus, syvyys, Liput); } void piirra(){ SDL_Rect kuva_alue_plus; SDL_Rect kuva_alue_miinus; SDL_Rect naytolle_miinus = {80, 80}; SDL_Rect naytolle_plus = {80, (80+(100-elama))}; kuva_alue_plus.x = 0; kuva_alue_plus.y = 0; kuva_alue_plus.h = elama; kuva_alue_plus.w = 50; SDL_BlitSurface(miinus, 0, ruutu, &naytolle_miinus); SDL_BlitSurface(plus, &kuva_alue_plus, ruutu, &naytolle_plus); SDL_Flip(ruutu); } bool kasittele_viestit(){ SDL_Event event; bool kaynnissa = true; while (SDL_PollEvent(&event)) { // Painettiinko ruksia? if (event.type == SDL_QUIT) { kaynnissa = false; } if (event.type == SDL_KEYDOWN){ switch (event.key.keysym.sym) { // Escape ja Q lopettavat. case SDLK_ESCAPE: case 'q': kaynnissa = false; break; case 'a': elama += (elama < 100) ? 1 : 0; break; case 'z': elama += (elama > 0) ? -1 : 0; break; default: kaynnissa = true; } } } return kaynnissa; }
Lopuksi vielä putkasta kuvavarasto
Tämän lisäksi tarvitaan vielä elama_plus.png (50 x 100 px) ja samankokoinen elama_miinus.png. Tuohon voisi vielä laittaa dynaamiset kuvien mitat, kun nyt ne ovat vielä kovakoodattuja numeroita.
Aihe on jo aika vanha, joten et voi enää vastata siihen.