Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: SDL ja kuvan lataaminen pinnalle

tkok [10.12.2008 16:55:24]

#

Hei

Ongelmani koskee kuvan pixi.bmp lataamista kuvapinnalle.


aluksi luon pinnan nimeltä px

SDL_Surface *px =NULL;

Kuva on sekä suoraan kovon juuressa c:\pixi.bmp että projektin omassa kansiossa C:\Projektit\New Folder\3pisteellipsi\pixi.bmp

olen yrittänyt saada kuvaa ladattua px seuraavilla koodiriveillä joista yksikään ei toiminiut

px=SDL_LoadBMP("pixi.bmp");
px=SDL_LoadBMP("C:\Projektit\New Folder\3pisteellipsi\pixi.bmp");
px=SDL_LoadBMP("C:\pixi.bmp");
px=SDL_LoadBMP("C:\\pixi.bmp");
px=SDL_LoadBMP("C:/pixi.bmp");

Että jos joku voisi kertoa kuinka se tehdään oikein?

Metabolix [10.12.2008 17:05:48]

#

Koska \-merkkiä käytetään tekstissä erikoismerkkien (\n, \t, \" jne.) esittämiseen, se täytyy myös itse kirjoittaa muodossa "\\". Poluista ainakin "pixi.bmp", "C:\\pixi.bmp" ja myös "C:/pixi.bmp" ovat oikein. Pelkkä "pixi.bmp" viittaa tiedostoon ohjelman työhakemistossa, joten sen pitäisi toimia, jos ohjelma on käynnistetty jommassakummassa mainitsemassasi hakemistossa. Tämä on tietenkin myös järkevin tapa polun ilmaisemiseen sikäli, että näin ohjelman toiminta ei ole riippuvainen absoluuttisesta sijainnista.

Debug-mielessä voit lisätä ohjelmaan rivin system("dir"), josta saattaa selvitä, missä hakemistossa ohjelma työskentelee ja onko kuva paikallaan. Tarkistuksen voit tehdä myös fopen-funktiolla:

int tiedosto_on(const char *nimi) {
  FILE *f = fopen(nimi, "r");
  if (f) fclose(f);
  return f ? 1 : 0;
}
// ...
if (!tiedosto_on("pixi.bmp")) {
  printf("Tiedosto puuttuu!\n");
  abort();
}

Jos kaikki muu on kunnossa, on toki mahdollista, että kuvatiedostossa on vikaa. Onhan se varmasti ihan oikea BMP-tiedosto?

tkok [10.12.2008 19:11:03]

#

Hei taas

Nyt kuvan sijainti oikea ja ohjelma lataa sen normaalisti.

Ohjelma ei kuitenkaan tulosta mitään.
Alustan näyttöä varten tason

SDL_Surface *naytto;
naytto = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

Alussa määriteltyjen vakioiden pohjalta:

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

Piirron hoidan näin :

// mainissa:
PiirraKuva(px, naytto, 45,45);

//myöhemmin:
void PiirraKuva(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y)
{
  SDL_Rect alue; // mille alueellä näyttöä kuva piirretään
  alue.x = x; // koordinaatit
  alue.y = y;
  SDL_BlitSurface(kuva, NULL, naytto, &alue); // piirto
}

Tämä kaikki on tehty melkein suoraan esimerkkien mukaan, silti ikuna jää mustaksi :(

EDIT: kooditagit

os [10.12.2008 19:26:17]

#

Lisääpä viimeisen SDL_BlitSurfacen perään

SDL_UpdateRect(naytto,0,0,naytto->w,naytto->h);

Se vasta siirtää naytto-pinnassa olevan kuvan näytölle. Asia muuten mainitaan myös täällä.

tkok [10.12.2008 19:30:31]

#

os kirjoitti:

Lisääpä viimeisen SDL_BlitSurfacen perään

SDL_UpdateRect(naytto,0,0,naytto->w,naytto->h);

Se vasta siirtää naytto-pinnassa olevan kuvan näytölle. Asia muuten mainitaan myös täällä.

Joo kappas, ny toimii
Aikoinaan viimeeksi kun SDL tarvitsin niin käytin kaksoispuskurointia niin muistelin ettei "yksöis"puskuroidussa kuvassa tarvita tuollaisia.

Vastaus

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

Tietoa sivustosta