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);
}<pilkunviilaus>Miksi käyttää SDL_DOUBLEBUF:ia jossei käytä SDL_UpdateRectiä</pilkunviilaus> :-)
Tohon blittausfunktioon oli jäänyt ylimääräinen parametri. Korjattu.
Hyvä koodivnkki ja toimikin jo ekalla kerralla.
ei globaalimuuntajia!
yhtä hyvin ne vois välittää parametseina tolle funktiolle.
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
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.
aWW, mitä pienempi ohjelma sitä helpommin ne voi välittää funktiolle :)
Itse pyrin siihen ettei ole yhtään globaalia muuttujaa
Eikös tuo hiiri.bmp pidä vapauttaa lopuksi?
SDL_FreeSurface(hiiri.bmp);
hiiri.bmp:n kuvan tulee olla RGB-väreissä. Harmaasävy ei ainakaan käy, vaan tulee coredumppi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.