Eli minulla on nyt tuommonen SDL Surface. Mitenkäs onnistuu sitten toisen pinnan luominen, johon voi piirtää?
SDL_Surface *naytto; naytto = SDL_SetVideoMode(RESOLUUTIO_X, RESOLUUTIO_Y, BPP, SDL_HWSURFACE|SDL_FULLSCREEN);
Kiitos, vaikka kysymys huonosti muotoiltu Heikki hoitaa homman kotiin.
EDIT: Heräsi mieleen kysymys mikä on RGBA maskissa tuon A:n eli Alphan tehtävä?
Se on läpinäkyvyys. 0 on läpinäkyvä, 255 on peittävin.
Muista tuhota kaikki tekemäsi surfacet lopuksi SDL_FreeSurface-funktiolla.
Kiitos. Vielä semmoista että miten saan siirrettyä jostain surfacesta toiseen surfaceen?
Kannattaa noita oppaitakin lueskella.
Mikäs tässä nyt on vikana?
/* Tämän ohjelman idea on luoda hiiren kursorin paikalle rasti ja piirtää janaa leikkauspisteiden kohdalle hiiren vasenta nappia painettaessa. */ #include "omat_funktiot.h" #define RESOLUUTIO_X 1024 #define RESOLUUTIO_Y 768 #define BPP 32 int main(int argc, char *argv[]) { int x_hiiri, y_hiiri; int x_naytto, y_naytto; int hiiri_nappain; if(SDL_Init(SDL_INIT_VIDEO) < 0) { return 0; } //Pinnat: SDL_Surface *naytto; SDL_Surface *piirto; naytto = SDL_SetVideoMode(RESOLUUTIO_X, RESOLUUTIO_Y, BPP, SDL_HWSURFACE|SDL_FULLSCREEN); piirto = SDL_CreateRGBSurface(SDL_HWSURFACE, RESOLUUTIO_X, RESOLUUTIO_Y, BPP, 0, 0, 0, 0); //Kursori piiloon SDL_ShowCursor(0); //Näppäin SDL_Event tapahtuma; Uint8* nappi; for(;;) { SDL_PollEvent(&tapahtuma); hiiri_nappain = SDL_GetMouseState(&x_hiiri, &y_hiiri); //Piirrä leikkauspisteet for(x_naytto = 0; x_naytto < RESOLUUTIO_X; ++x_naytto) { PiirraPikseli(naytto, x_naytto, y_hiiri, 25, 255, 25); } for(y_naytto = 0; y_naytto < RESOLUUTIO_Y; ++y_naytto) { PiirraPikseli(naytto, x_hiiri, y_naytto, 25, 255, 25); } //Jos hiiren vasen nappi pojassa, sytytä punainen pikseli leikkauspisteen kohdalle. if(hiiri_nappain & SDL_BUTTON(1)) { PiirraPikseli(piirto, x_hiiri, y_hiiri, 255, 0, 0); } SDL_BlitSurface(naytto, NULL, piirto, NULL); SDL_Flip(naytto); SDL_FillRect(naytto, NULL, 0x000000); //Jos painetaan ESC niin poistutaan loopista. nappi = SDL_GetKeyState(NULL); if (nappi[SDLK_ESCAPE]) break; } SDL_ShowCursor(1); SDL_FreeSurface(piirto); SDL_Quit(); return 0; }
No mitä se tekee ja mitä sen pitäisi tehdä?
Se piirtää rastin hiiren paikalle, mutta sen pitäisi piirtää rastin lisäksi hiiren vasenta nappia painaessa pikseli leikkauspisteen kohdalle ja siirtää se sitten piirto
surfacelta naytto
surfaceen ja sitten Flipata näyttö esiin mutta sitä se ei tee
Mikset piirrä suoraan naytto-pintaan?
en ole testannut, mutta nyt sen pitäisi toimia oikein
/* Tämän ohjelman idea on luoda hiiren kursorin paikalle rasti ja piirtää janaa leikkauspisteiden kohdalle hiiren vasenta nappia painettaessa. */ #include "omat_funktiot.h" #define RESOLUUTIO_X 1024 #define RESOLUUTIO_Y 768 #define BPP 32 int main(int argc, char *argv[]) { int x_hiiri, y_hiiri; int x_naytto, y_naytto; int hiiri_nappain; if(SDL_Init(SDL_INIT_VIDEO) < 0) { return 0; } //Pinnat: SDL_Surface *naytto; naytto = SDL_SetVideoMode(RESOLUUTIO_X, RESOLUUTIO_Y, BPP, SDL_HWSURFACE|SDL_FULLSCREEN); //Kursori piiloon SDL_ShowCursor(0); //Näppäin SDL_Event tapahtuma; Uint8* nappi; for(;;) { SDL_FillRect(naytto, NULL, 0x000000); SDL_PollEvent(&tapahtuma); hiiri_nappain = SDL_GetMouseState(&x_hiiri, &y_hiiri); //Piirrä leikkauspisteet for(x_naytto = 0; x_naytto < RESOLUUTIO_X; ++x_naytto) { PiirraPikseli(naytto, x_naytto, y_hiiri, 25, 255, 25); } for(y_naytto = 0; y_naytto < RESOLUUTIO_Y; ++y_naytto) { PiirraPikseli(naytto, x_hiiri, y_naytto, 25, 255, 25); } //Jos hiiren vasen nappi pojassa, sytytä punainen pikseli leikkauspisteen kohdalle. if(hiiri_nappain & SDL_BUTTON(1)) { PiirraPikseli(naytto, x_hiiri, y_hiiri, 255, 0, 0); } SDL_Flip(naytto); //Jos painetaan ESC niin poistutaan loopista. nappi = SDL_GetKeyState(NULL); if (nappi[SDLK_ESCAPE]) break; } SDL_ShowCursor(1); SDL_FreeSurface(piirto); SDL_Quit(); return 0; }
Tämän hiiren nappia painaessa piirrettävän pikselin tulisi jäädä näytölle. Sen takia en piirrä suoraan naytto-pintaan.
Piirrät apupinnalle ensin sen pikselin, sitten blittaat apupinnan ruudulle ja lopuksi piirrät suoraan ruudulle kursorin.
Eipä toiminu :/
SDL_BlitSurface(naytto, NULL, piirto, NULL);
Eikös tuossa ole "naytto" ja "piirto" väärinpäin?
No kyllähän se sille vaikuttaa, mutta ei toimi vieläkään vaikka korjasin tuon.
/* Tämän ohjelman idea on luoda hiiren kursorin paikalle rasti ja piirtää janaa leikkauspisteiden kohdalle hiiren vasenta nappia painettaessa. */ #include "omat_funktiot.h" #define RESOLUUTIO_X 1024 #define RESOLUUTIO_Y 768 #define BPP 8 int main(int argc, char *argv[]) { int x_hiiri, y_hiiri; int x_naytto, y_naytto; int hiiri_nappain; if(SDL_Init(SDL_INIT_VIDEO) < 0) { return 0; } //Pinnat: SDL_Surface *naytto; SDL_Surface *piirto; naytto = SDL_SetVideoMode(RESOLUUTIO_X, RESOLUUTIO_Y, BPP, SDL_HWSURFACE|SDL_FULLSCREEN); piirto = SDL_CreateRGBSurface(SDL_HWSURFACE, RESOLUUTIO_X, RESOLUUTIO_Y, BPP, 0, 0, 0, 0); //Kursori piiloon SDL_ShowCursor(0); //Näppäin SDL_Event tapahtuma; Uint8 *nappi; for(;;) { SDL_PollEvent(&tapahtuma); hiiri_nappain = SDL_GetMouseState(&x_hiiri, &y_hiiri); //Jos hiiren vasen nappi pojassa, sytytä punainen pikseli leikkauspisteen kohdalle. if(hiiri_nappain & SDL_BUTTON(1)) { PiirraPikseli(piirto, x_hiiri, y_hiiri, 0, 255, 0); } SDL_BlitSurface(piirto, NULL, naytto, NULL); for(x_naytto = 0; x_naytto < RESOLUUTIO_X; ++x_naytto) { PiirraPikseli(naytto, x_naytto, y_hiiri, 0, 255, 0); } for(y_naytto = 0; y_naytto < RESOLUUTIO_Y; ++y_naytto) { PiirraPikseli(naytto, x_hiiri, y_naytto, 0, 255, 0); } SDL_Flip(naytto); //SDL_FillRect(naytto, NULL, 0x000000); //Jos painetaan ESC niin poistutaan loopista. nappi = SDL_GetKeyState(NULL); if (nappi[SDLK_ESCAPE]) break; } SDL_ShowCursor(1); SDL_FreeSurface(piirto); SDL_Quit(); return 0; }
Piirrät apupinnalle ensin sen pikselin, sitten blittaat apupinnan ruudulle ja lopuksi piirrät suoraan ruudulle kursorin.
Kannattaisi ihan paperilla miettiä rivi riviltä, mitä millekin pinnalle on kunkin toimituksen jälkeen piirretty.
Selvisi: Vaihdo BPP arvoksi joku suurempi (16,24,32)
8 bittisenä on palettivärit:
http://www.libsdl.org/cgi/docwiki.cgi/
"If bitsPerPixel is 8 an empty palette is allocated for the surface, otherwise a 'packed-pixel' SDL_PixelFormat is created using the [RGBA]mask's provided (see SDL_PixelFormat). The flags specifies the type of surface that should be created, it is an OR'd combination of the following possible values."
Noni kiitos ezulille :) Ihmettelinkin jo kun mielestäni toimin Metabolixin neuvon mukaan.
Yleensä vika on siellä mistä sitä ei ymmärrä etsiä.
Näin on. Vielä muuten sellaista että tekeekö tuo BlitSurface jonkun ihme päivityksen, kun selviän ilman SDL_FillRect
iä?
Ei siinä mielessä mitä tarkoitat, mutta tuo "piirto" pintahan on muuten musta, mutta sisältää ne klikatut pisteet. Ja sehän läntätään aina aluksi "naytto":n päälle.
Äh. Olipa huonosti selitetty. Tarkoitin siis, että esim BlitSurface(pinta, NULL, kohde, NULL) siirtää siis pinta -pinnan kohde -pintaan ja kopioi siis itsensä kohde -pintaan pyyhkien entisen tiedot pois sieltä
Ei se pyyhi, vaan tässä tapauksessa "piirto" sattuu peittämään koko "naytto"-pinnan alleen.
No nyt selkis. Kiitoksia
Eikös tuolla pitäisi olla vielä SDL_DOUBLEBUFFER-flagi tjsp, kun kerran SDL_Flip on käytössä?
Jos käyttää tuota doublebuffia niin kyllä silloin pitää olla SDL_Flip.
Itse olen käyttänyt SDL_flippiä ilman SDL_DOUBLEBUFFER-flagia. Mutta jos flippataan tietty recti surfacella niin silloin on käytössä SDL_DOUBLEBUFFER.
Aihe on jo aika vanha, joten et voi enää vastata siihen.