Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL:n grafiikkapintaan piirtäminen

Sivun loppuun

sqwiik [29.05.2005 07:40:06]

#

Menenpä suoraan asiaan eli ongelmani on se, että en jostain syystä kykene käsittelemään graafisesti SDL:n grafiikkapintaa (SDL_Surface) joka on luotu SDL_CreateRGBSurface-komennolla. Lisäksi sille luontivaiheessa määrittelemäni liput eivät "mene päälle". Luon grafiikkapinnan seuraavalla koodilla:

SDL_Surface dbl_buffer;
...
/* r,g,b ja t ovat maski (0xFF alenevassa järjestyksessä, BIG_ENDIAN). */
screen = SDL_SetVideoMode (ScrW, ScrH, ScrBB, SDL_SWSURFACE | SDL_DOUBLEBUF);
dbl_buffer = SDL_CreateRBGSurface(SDL_SWSURFACE, ScrW, ScrH, ScrBB,
                                  r, g, b, t);

Huomasin että en pysty blittaamaan mitään tuohon grafiikkapintaan (ainakaan mitään ei näy), mutta SDL_BlitSurface ei palauta virhekoodia eli se 'onnistuu'. Olen myös tarkistanut, että muistin varaus pinnalle onnistuu. Tietääkö kukaan, mistä tällainen voisi johtua? Pelkälle screen:lle piirtäminen kyllä onnistuu.

Gaxx [29.05.2005 10:51:42]

#

Ei antamassasi pätkässä pitäisi olla mitään vikaa(paitsi pari typoa: RBG->RGB ja dbl_surface->*dbl_surface :P).
Kokeile toimiiko alla oleva koodi. Itselläni se aikankin kääntyi ja toimi(Dev-cpp v4.9.8.0 & MinGW).

Ja muista laittaa se kuva sinne c:n juureen!

#include <SDL/SDL.h>

#define rmask 0xff000000
#define gmask 0x00ff0000
#define bmask 0x0000ff00
#define amask 0x000000ff

const int ScrW = 800;
const int ScrH = 600;
const int ScrBB = 32;

int DSprite(SDL_Surface *Picture, SDL_Surface *Screen, int x, int y) {
    SDL_Rect Area;
    Area.x = x;
    Area.y = y;

    SDL_BlitSurface(Picture, NULL, Screen, &Area);
    return 0;
}

int main (int argc, char *argv[]) {
    SDL_Surface *dbl_buffer;
    SDL_Surface *screen;
    SDL_Surface *load;

    screen = SDL_SetVideoMode (ScrW, ScrH, ScrBB, SDL_SWSURFACE | SDL_DOUBLEBUF);
    dbl_buffer = SDL_CreateRGBSurface(SDL_SWSURFACE, ScrW, ScrH, ScrBB, rmask, gmask, bmask, amask);

    load = SDL_LoadBMP("c:\\kuva.bmp");
    DSprite(load, dbl_buffer, 0, 0);
    DSprite(dbl_buffer, screen, 0, 0);
    //DSprite(load, screen, 0, 0);

    SDL_Flip(screen);

    SDL_Delay(2000);

    SDL_Quit();
    return 0;
}

sqwiik [29.05.2005 11:01:57]

#

Gaxx: koodisi kääntyy ja toimii muuten, mutta ruutu pysyy tyhjänä -_-. Jos tuosta jättää tuon tuplapuskuriin piirron välistä pois niin toimii (eli piirretään suoraan screen-pintaan).

Gaxx [29.05.2005 11:15:53]

#

Joo-o... Sitten en kyllä osaa sanoa, mikä on vialla. Itselläni kun kuva näkyy miten päin vain.

sqwiik [29.05.2005 11:33:07]

#

Hmm. Sain kuvan osittain näkyviin, kun laitoin alphamaskin 0:ksi, mutta sininen väri ei tällöin näy?

Muoks: käytössä olikin small-endian, mutta ongelma ei miksikään ole muuttunut.

Muoks 2: Ongelma ratkesi, kun laitoin puskurin värisyvyydeksi 32. 16 oli ilmeisesti kestämätön 32-bittisille väreille ^^

Gaxx [29.05.2005 12:12:40]

#

Krhmm... Muokkasit siis koodiani? Toimiiko se nyt(32-bittisenä) tuollaisenaan, vai mitä muutoksia teit? Vaihdoitko kenties värisyvyyttä? :D

sqwiik [29.05.2005 12:14:23]

#

En käyttänyt sinun koodiasi, vaan muokkasin omaani...

Putkan kaistan säästämiseksi vastaan allaolevaan viestiin tässä:
koodisikin toimii, kun käytän värisyvyytenä 32. Se oli alunperin 16, sillä sen käyttäminen on nopeampaa kuin 32-bittisen.

Gaxx [29.05.2005 12:17:52]

#

Tarkoitin lähinnä sitä, kun testasit tuota koodia. Ajoitko sen tuollaisenaan? Tuli vain mieleen kun sait omasi toimimaan vaihtamalla värisyvyyden 32-bittiseksi. Omassani kun se on 32-bittinen.

Mutta samapa tuo. Pääasia on, että sait toimimaan.


Sivun alkuun

Vastaus

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

Tietoa sivustosta