Teen pientä koulutyötä SDL:llä ja törmäsin pieneen ongelmaan. Teen peliä, jossa pitää kirjoittaa sanat, ennenkuin ne kerkeää ruudun alareunaan. Kirjoitan sanat SDL_TTF:n avulla, ja sanan arvattu osuus näkyy sinisellä ja jäljellä oleva osa valkoisella. Teen kaksivärisen sanan siten, että teen ensin surfacen, jossa on valkoinen teksti, jonka jälkeen tyhjennän arvatun tekstin osuuden ja kirjoitan sen kohdalle sinisellä arvatun tekstin. Kaikki ei välttämättä tajunnut selitystäni, joten tässä vielä kuva.
Kuvassa siis sana "riisipuuro" on arvattu puoliksi, käyttäjä on kirjoittanut "riisi", jolloin arvatun sanan osuus näkyy sinisellä. Ongelmana on tuo harmaa tausta, joka kuvassa peittää osan bossisanasta. Kuinkahan saisin tuon aikaisemmin mainitsemani tyhjennysoperaation täyttämään tuon kohdan läpinäkyvällä, tuon harmaan sijaan? Tässä vielä itse funktio.
SDL_Surface *arvattuTeksti(string arvaus, string koko_teksti, TTF_Font *fontti) { // Piirretään valkoinen teksti SDL_Color valkonen = {255, 255, 255}; SDL_Surface *koko = TTF_RenderText_Blended(fontti, koko_teksti.c_str(), valkonen); // Piirretään mahdollinen sininen arvaus-osuus if(arvaus.length() > 0 && arvaus == koko_teksti.substr(0, arvaus.length())) {arvaus.length())) { SDL_Color sininen = {80, 86, 145}; SDL_Surface *arv = TTF_RenderText_Blended(fontti, arvaus.c_str(), sininen); rgb vari = {67,67,67}; tyhjenna(koko, 0, 0, arv->w, arv->h, vari); piirraKuva(arv, koko, 0, 0); SDL_FreeSurface(arv); } return koko; }
SDL-oppaan kakkososan lopusta löytyy tällainen pätkä:
opas kirjoitti:
Äskeinen bittikartan piirto jättää meille erään ongelman: piirrämme jokaisen pikselin bittikartan tietyltä alueelta. Jos esimerkiksi piirrät pelaajahahmon, sen ympärille jää taustaväriä, joka pitää saada pois näkyvistä. Tämä onnistuu asettamalla tietty väri läpinäkyväksi:
SDL_SetColorKey(kuva, SDL_SRCCOLORKEY, SDL_MapRGB(kuva->format,0,0,0));
Funktiolle annetaan parametrina osoitin pintaan, josta tietty väri asetetaan läpinäkyväksi. Tämän jälkeen annetaan ohjausliput. Viimeinen parametri kertoo, mikä väri asetetaan läpinäkyväksi. Tässä tapauksessa se on RGB:nä 0,0,0 eli musta.
muoks. ai hmm, selasin aloitusviestin turhan nopeasti. Kai tuota voi sdl_ttf:äänkin soveltaa?
Ehkä olisi ollut järkevämpää antaa koodista ne olennaiset osat eli rgb-rakenteen esittely ja tyhjenna-funktio. Mutta joka tapauksessa tarvitset rgb:hen lisäksi alfakanavan, ja komponenteista voi muodostaa värin SDL_MapRGBA-funktiolla.
No tuossa rgb:ssä ei ole muuta kuin kolme inttiä (joka värille) ja tyhjenna täyttää annetun kohdan surfacesta annetulla värillä. Pitää yrittää säätää tuon SDL_MapRGBA:n kanssa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.