Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C/SDL hiiren paikka ei päivity

kayttaja-2791 [26.03.2009 20:11:35]

#

Tervehdys

Koska tiedän miten tylsää putkalaisilla on, ja halu auttaa on kova ja autettavia on kovin vähän niin laitan oman kontribuutioni auttaakseni putkalaisia auttamaan apua tarvitsevia.

Eli SDL:ään aloin tutustumaan juurikin äskettäin, ja se sujuikin kivasti Heikin oppaan turvin. Nyt kuitenkin mietityttää miksei seuraava koodi piirrä kuvaa hiiren uusiin koordinaatteihin kun liikutan hiirtä? Kuva piirtyy vain siihen paikkaan missä kursori on ohjelman käynnistettäessä.

Ongelma siis nähdäkseni jostain syystä tuossa for-silmukassa.

#include <SDL/SDL.h>  // sisällytetään SDL:n otsikkotiedostot

#pragma comment(lib, "SDLmain.lib")  // otetaan SDL:n LIB-tiedostot mukaan. Kun nämä rivit ovat ohjelman alussa,
#pragma comment(lib, "SDL.lib")      // sinun ei tarvitse lisätä LIB-tiedostoja "käsin"

void PiirraKuva(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y);

int main(int argc, char *argv[]) {

    if( SDL_Init(SDL_INIT_VIDEO) < 0 )
    {
        fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); // virheestä tiedot tiedostoon
        return 0; // lopetetaan ohjelma
    }

    SDL_Surface *naytto;

    SDL_Surface *kuva;
    kuva=SDL_LoadBMP("ukko.bmp");

    naytto = SDL_SetVideoMode(1280, 800, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF);

    int hiiri, x, y;

    for (int i = 0; i < 100; i++)
    {
    	hiiri = SDL_GetMouseState(&x, &y);
    	PiirraKuva(kuva, naytto, x, y);
        SDL_Delay(50);
    	SDL_Flip(naytto);
    }

    SDL_FreeSurface(kuva);

    SDL_Quit();
    return 0;
}

// funktio piirtää parametrina annetun kuvan ruudulle (toinen parametri) tiettyyn kohtaan (3. ja 4. parametri)
void PiirraKuva(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y)
{
  SDL_Rect alue;
  alue.x = x;
  alue.y = y;
  SDL_BlitSurface(kuva, NULL, naytto, &alue); // piirto
}

Metabolix [26.03.2009 20:18:35]

#

Viestit pitää käsitellä tavalla tai toisella, jotta SDL:n sisäinen tila päivittyisi. Jos et tee niillä mitään, voit käyttää funktiota SDL_PumpEvents, muussa tapauksessa sinun täytyy lisätä erillinen silmukka, joka käsittelee kaikki tarjolla olevat viestit funktiolla SDL_PollEvent (ks. funktio viestit tästä vinkistä). Kolmas vaihtoehto on SDL_WaitEvent, joka pysähtyy odottamaan, että jotain tapahtuu.

kayttaja-2791 [26.03.2009 22:31:52]

#

Ok, kiitos. Pitääpä tutkia seuraavaksi noita viestejä tarkemmin.

Vastaus

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

Tietoa sivustosta