Noi kohdat mihin on kommattu niin ne näkyvät oikein, mutta nuo mitä on käännetty tolla rootozoomSurfacella, niin niissä ei mene tausta läpinäkyväksi. :S
Elikkäs mulla on tällainen funktio:
void player::LoadImages() { //Tässä on läpinäkyvätausta //kuvat vasemalle this->Kuvat[0]=IMG_Load("Data/Images/Player/Ukko_w_1.png"); //Kuvat Oikealle this->Kuvat[1]=rotozoomSurface(this->Kuvat[0], 180, 1, 1); //Kuvat ylös this->Kuvat[2]=rotozoomSurface(this->Kuvat[0], -90, 1, 1); //Kuvat alas this->Kuvat[3]=rotozoomSurface(this->Kuvat[0], 90, 1, 1); //kuvat nw this->Kuvat[4]=rotozoomSurface(this->Kuvat[0], -45, 1, 1); //Kuvat sw this->Kuvat[5]=rotozoomSurface(this->Kuvat[0], 45, 1, 1); //Kuvat ne this->Kuvat[6]=rotozoomSurface(this->Kuvat[0], -135, 1, 1); //Kuvat se this->Kuvat[7]=rotozoomSurface(this->Kuvat[0], 135, 1, 1); //Tässä on läpinäkyvätausta //Kuollut pelaaja this->Kuvat[8]=IMG_Load("Data/Images/Player/Ukko_kuollut.png"); //Tässä on läpinäkyvätausta //Veri this->Kuvat[9]=IMG_Load("Data/Images/Player/Ukko_veri.png"); //Tarkistetaan, onko kuva ladattu ja poistetaan peliukon tausta for(int i=0;i<IMAGES;i++) { if (!this->Kuvat[i]) { fprintf(stderr, "Pelaajan kuvan naytto ei onnistunut: %s\n", SDL_GetError()); } else { SDL_SetColorKey(this->Kuvat[i], SDL_SRCCOLORKEY, SDL_MapRGB(Kuvat[i]->format,0,0,0)); } } }
Onko Kuvat[0] läpinäkyvä kun piirrät sen?
On läpinäkyvä, sitä juuri tarkoitin.
Hmmm ei voinut enään muokata. :(
No kuitenkin oisko mahdollista, että tuo rotoozom-funkkari sekottaisi niitä värejä samalla kun kääntää sitä kuvaa?
Rotozoom ei ilmeisesti välitä luomalleen pinnalle taustaväriä, joten joudut tekemään sen itse
SDL_SetColorKey(kuva, SDL_SRCCOLORKEY, SDL_MapRGB(kuva->format,0,0,0));
rotozoom-funktion viimeinen parametri täytyy myös asettaa nollaksi, koska muuten kuvan reunoille tulee lähellä taustaväriä olevat "kehykset".
Edit: Oho! Ei tullut taas luettua koko koodia. Olitkin näemmä yrittänyt asettaa colorkeyn :/
Ja se colorkey toimii kaikissa muissa paitsi noissa rotozoomatuissa surfaceissa... :S
Edit: kokeilin myös ilman smoothia, mutta sama tulos.
Löysin tällaisen funktion:
// matchColorKeys: This copies the transparency data from one // surface to another. void matchColorKeys( SDL_Surface* src, SDL_Surface* dest ) { // If the original had an alpha color key, give it to the new one. if( src->flags & SDL_SRCCOLORKEY ) { // Acquire the original Key Uint32 colorkey = src->format->colorkey; // Set to the new image SDL_SetColorKey( dest, SDL_SRCCOLORKEY, colorkey ); } }
Käytä tuota siinä ennen kuin laitat tempistä surfacen osoittimen siihen alkuperäiseen. Jospa tämä auttaisi?
Niin, siis missä kohtaa kutsun tota funkkaria?
Edit: niin ja koodi näyttää nyt tältä:
int player::Draw() { SDL_Rect alue; alue.x=this->x; alue.y=this->y; if(state==false) { SDL_BlitSurface(this->Kuvat[1],NULL, naytto, &alue); } else { this->Kuvat[3]=rotozoomSurface(Kuvat[0], this->suunta, 1, 0); matchColorKeys( Kuvat[0], Kuvat[3] ); SDL_BlitSurface(this->Kuvat[3] ,NULL, naytto, &alue); } return 1; }
Ehh, ainakin omasta mielestäni kannattaisi pyöritellä kuvat alussa ja sitten käyttää taulukosta niitä pyöriteltyjä. Linkitetään tänne nyt vielä se sama sivu josta sen löysin, siellä se näkyy hyvin missä kohtaa se pitää käyttää: http://snippets.dzone.com/posts/show/5939
// resizeImage: Resizes an image at its current place in memory. This means // that if you skew and stretch, you'll lose quality, but it also // means no worrying about new pointers. This uses the zoomSurface functions // in SDL_rotozoom.h ( SDL_gfx package ) void resizeImage( SDL_Surface*& img, const double newwidth, const double newheight ) { // Zoom function uses doubles for rates of scaling, rather than // exact size values. This is how we get around that: double zoomx = newwidth / (float)img->w; double zoomy = newheight / (float)img->h; // This function assumes no smoothing, so that any colorkeys wont bleed. SDL_Surface* sized = zoomSurface( img, zoomx, zoomy, SMOOTHING_OFF ); // Copy transparency data. matchColorKeys( img, sized ); // The original picture is no longer needed. SDL_FreeSurface( img ); // Set it instead to the new image. img = sized; }
Kopioitu tuolta. Tuossa samantyylinen tilanne (käytetään rotozoomin tilalla vaan zoomsurfacea) ja siinä näkee missä kohtaa sitä käytetään.
EDIT: Nyt katsoin vielä tuolla ylhäällä olevaa koodiasi, eikö kannattaisi pyörittämistä varten tehdä for-looppi jossa tuon matchColorKeysinkin käyttö helpottuisi aika lailla?
Muutin ton pelin ohjaussyteemin 360 asteiseksi, joten tarviis tehdä aika monta tollasta surfacea.
Edit: ja surfaceja tarvitaan siis enään vain 2, kun alunperin niitä tarvittiin 8.
Edti2: tässä kuva ongelmasta http://fpaste.dy.fi/?KJt , ei tarvii huomauttaa noista vihuista, koska ne korjataan sitten samalla tekniikalla. :P
Aihe on jo aika vanha, joten et voi enää vastata siihen.