Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Hiirtä seuraava kuva, SDL

Sivun loppuun

Meitsi [16.08.2005 22:22:03]

#

Tätä jo keskustelualueellakin kysyttiin. Miten saada kuva seuraamaan hiirtä. Tarvitset hiiri.bmp tiedoston, joka sisältää kuvan, "hiiren kursoriksi". Jos haluat kuvan hiiren "keskelle", miinusta x ja y koordinaateista puolet kuvan koosta. Blittausfunktio putkan oppaasta lainattu. Dev-C++:sassa kääntyy parametrein: -lmingw32 -lSDLmain -lSDL

#include <SDL/SDL.h>

SDL_Surface *ruutu, *hiiri; // Pinnat
SDL_Event tapahtumat;  //Tapahtumat
Uint8 *nappi;  //Napeille kahva
int hiiriX, hiiriY;  //Hiiren koordinaatit

void blitKuva(SDL_Surface *minne, SDL_Surface *mika, int x, int y);  // Funktion proto

int main(int argc, char *argv[])
{
    SDL_Init(SDL_INIT_VIDEO);  //SDL Päälle
    ruutu = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_WM_SetCaption("HiirenLoukku", NULL);  //Otsikko
    SDL_ShowCursor(0);  //Oikea kursori piiloon
    hiiri=SDL_LoadBMP("hiiri.bmp");  //Ladataan kuva
    SDL_SetColorKey(hiiri, SDL_SRCCOLORKEY, SDL_MapRGB(hiiri->format, 255, 255, 255));  //Valkoinen väri läpinäkyväksi "kursorista"

    while (true)  //Päälooppi
    {
        SDL_FillRect(ruutu, NULL, SDL_MapRGB(ruutu->format, 0, 0, 0));  //Ruutu tyhjäksi
        SDL_PollEvent(&tapahtumat);  //Tapahtumat talteen
        nappi = SDL_GetKeyState(NULL);  //Napit talteen
        if (nappi[SDLK_ESCAPE])break;  //Jos ESC pohjassa, ulos
        if (tapahtumat.type==SDL_QUIT)break;  //Jos ikkuna suljettu, ulos
        SDL_GetMouseState(&hiiriX, &hiiriY);  //Hiiren koordinaatit talteen

        blitKuva(ruutu, hiiri, hiiriX, hiiriY);  //Kursori ruudulle

        SDL_Delay(1);  //Jotta ei käytettäisi liikaa tehoja
        SDL_Flip(ruutu);
    }
    SDL_ShowCursor(1);  //Kun lopetetaa, oikea kursori takaisin (ei (kai) pakollinen)
    SDL_Quit();  //Ulos
    return 0;  //Nappiin meni...
}

void blitKuva(SDL_Surface *minne, SDL_Surface *mika, int x, int y)  //Funktio blittaukseen, ei tästä sen enempää
{
    SDL_Rect piirtoAlue;
    piirtoAlue.x=x;
    piirtoAlue.y=y;
    SDL_BlitSurface(mika, NULL, minne, &piirtoAlue);
}

rndprogy [18.08.2005 14:03:48]

#

<pilkunviilaus>Miksi käyttää SDL_DOUBLEBUF:ia jossei käytä SDL_UpdateRectiä</pilkunviilaus> :-)

Meitsi [18.08.2005 15:50:21]

#

Tohon blittausfunktioon oli jäänyt ylimääräinen parametri. Korjattu.

C++Amatööri [19.08.2005 07:16:15]

#

Hyvä koodivnkki ja toimikin jo ekalla kerralla.

ZcMander [19.08.2005 14:41:25]

#

ei globaalimuuntajia!

yhtä hyvin ne vois välittää parametseina tolle funktiolle.

tesmu [22.08.2005 17:23:37]

#

Oisko binääriä tääl ohjelmointiputkassa vois olla sellanen näis koodivinkeissä et voi uploadaa binäärin ja sit aina alussa ois linkki binääriin

aWW [23.08.2005 10:39:33]

#

lainaus:

<pilkunviilaus>Miksi käyttää SDL_DOUBLEBUF:ia jossei käytä SDL_UpdateRectiä</pilkunviilaus> :-)

Koska kaksoispuskurointi on parempi.

lainaus:

ei globaalimuuntajia!

yhtä hyvin ne vois välittää parametseina tolle funktiolle.

Kyseessä on pieni ohjelma, joten globaalien muuttujien käyttö ei haittaa.

Meitsi [24.08.2005 14:51:47]

#

Binäärejä tästä:
*Rar
*Zip

ZcMander [10.06.2006 20:04:02]

#

aWW, mitä pienempi ohjelma sitä helpommin ne voi välittää funktiolle :)
Itse pyrin siihen ettei ole yhtään globaalia muuttujaa

teksturi [26.03.2008 10:33:41]

#

Eikös tuo hiiri.bmp pidä vapauttaa lopuksi?
SDL_FreeSurface(hiiri.bmp);

peran [17.01.2016 14:56:25]

#

hiiri.bmp:n kuvan tulee olla RGB-väreissä. Harmaasävy ei ainakaan käy, vaan tulee coredumppi.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta