Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Miten tausta läpinäkyväksi (C++ ja SDL)

Sivun loppuun

vehkis91 [12.01.2009 15:23:48]

#

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));
        }
    }

}

User137 [12.01.2009 17:04:00]

#

Onko Kuvat[0] läpinäkyvä kun piirrät sen?

vehkis91 [12.01.2009 17:18:54]

#

On läpinäkyvä, sitä juuri tarkoitin.

vehkis91 [12.01.2009 18:46:15]

#

Hmmm ei voinut enään muokata. :(

No kuitenkin oisko mahdollista, että tuo rotoozom-funkkari sekottaisi niitä värejä samalla kun kääntää sitä kuvaa?

Gaxx [12.01.2009 18:56:26]

#

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 :/

vehkis91 [12.01.2009 19:13:09]

#

Ja se colorkey toimii kaikissa muissa paitsi noissa rotozoomatuissa surfaceissa... :S

Edit: kokeilin myös ilman smoothia, mutta sama tulos.

temu92 [14.01.2009 20:01:40]

#

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?

vehkis91 [14.01.2009 20:14:04]

#

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;
}

temu92 [14.01.2009 20:22:36]

#

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?

vehkis91 [14.01.2009 20:26:19]

#

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


Sivun alkuun

Vastaus

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

Tietoa sivustosta