Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SDL] Problem z przezroczystością

Ostatnio zmodyfikowano 2013-10-10 17:35
Autor Wiadomość
kokon
Temat założony przez niniejszego użytkownika
[SDL] Problem z przezroczystością
» 2013-10-02 20:29:30
Witam, piszę grę poldegającą na tej samej zasadzie co cookie clicker w c++ z użyciem SDL. Jak na razie wszystko szło dobrze, lecz stanąłem na przezroczystości. SDL_SetColorKey zawiodło. Przeczytałem mnóstwo poradników (także wątków na tym forum), lecz nic innego działającego nie znalazłem. Jak inaczej sobie z tym poradzić?

Oto kod z powierzchnią:
C/C++
#include <SDL\SDL.h>
#include "SDL\SDL_image.h"
#include <string>

SDL_Rect polozeniemuffinki; //Zmienna odpowiadajaca za polozenie obrazu muffinki
SDL_Rect wielkoscmuffinki; //Zmienna odpowiadajaca za wielkosc obrazu muffinki
SDL_Surface * ekran = NULL; //Powirzchnia "okna"
SDL_Surface * tlo = NULL; //Powierzchnia tla
SDL_Surface * muffinduzy = NULL; //Powierzchnia duzej grafiki muffinki
SDL_Surface * muffinmaly = NULL; //Powierzchnia malej grafiki muffinki
//Inne zmienne...

int main( int argc, char * args[] )
{
    //Inicjalizacja SDL oraz utworzenie okna
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 1280, 720, 32, SDL_SWSURFACE );
   
   
    //Ustawienia polozen obiektow
    polozeniemuffinki.x = 0;
    polozeniemuffinki.y = 185;
    wielkoscmuffinki.w = 408;
    wielkoscmuffinki.h = 350;
   
    //Wczytywanie grafik
    tlo = IMG_Load( "tlo.bmp" );
    muffinduzy = IMG_Load( "muffin1.bmp" );
    muffinmaly = IMG_Load( "muffin2.bmp" );
   
    //Nakladanie grafik przed startem petli
    SDL_BlitSurface( tlo, NULL, ekran, NULL );
    SDL_BlitSurface( muffinduzy, NULL, ekran, & polozeniemuffinki );
    SDL_Flip( ekran );
   
   
    //Petla programu ...
   
    SDL_FreeSurface( muffinduzy );
    SDL_FreeSurface( muffinduzy );
    SDL_Quit();
    return 0;
}

Screen:
http://img545.imageshack.us/img545/7255/nt4a.png
P-93030
Mig
» 2013-10-02 20:44:53
Jesteś pewny że dobrze stosowałeś SDL_SetColorKey ?
tu masz przykładowy TUT -> http://lazyfoo.net/SDL_tutorials/lesson05/index.php
P-93032
kokon
Temat założony przez niniejszego użytkownika
» 2013-10-02 21:04:46
Ich przykład u mnie w ogóle nie działa, tzn. kompiluje się, ale otwierane okienko się zamyka bez wyświetlenia czegokolwiek. Możliwe, że mam po prostu złą wersję tej biblioteki i dlatego mam takie błędy? (Upewniłem się, że grafiki są na swoich miejscach przy uruchamianiu programu.)
P-93033
kokon
Temat założony przez niniejszego użytkownika
» 2013-10-03 22:30:19
Zmieniłem wersję SDL na 2.0 ale nadal mi nie działa nic. Przykład i alpha też. Dodam, że piszę program pod Code:blocks.
P-93073
domin568
» 2013-10-04 21:51:44
Nie lepiej ustawić przezroczystość w photoshopie , zapisać w png , otworzyć w programie jako png ( masz przezroczystosc bez zadnej programistycznej zabawy ) ??
P-93131
kokon
Temat założony przez niniejszego użytkownika
» 2013-10-05 13:18:06
Ponieważ SDL nie obsługuje kanału alpha...
P-93155
DejaVu
» 2013-10-08 23:00:39
W kodzie, który podałeś nie ma ani grama kodu, który wskazywałby na podjęcie próby wykonania przezroczystego koloru.

Frazy, które należy wpisać w wyszukiwarkę google:

/edit:
Coś słabo szukałeś, zważywszy na fakt, że dałem gotowe rozwiązanie:
http://cpp0x.pl/forum/temat/​?id=3606&p=2

C/C++
#include <SDL/SDL.h>
#include <windows.h>

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    SDL_Surface * ekran = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
    SDL_Surface * tapeta = SDL_LoadBMP( "tapeta.bmp" );
    SDL_Surface * obraz = SDL_LoadBMP( "obraz.bmp" );
    Uint32 col = SDL_MapRGB( obraz->format, 0x00, 0x00, 0x00 );
    SDL_SetColorKey( obraz, SDL_SRCCOLORKEY | SDL_RLEACCEL, col );
    SDL_BlitSurface( tapeta, NULL, ekran, NULL );
    SDL_BlitSurface( obraz, NULL, ekran, NULL );
    SDL_Flip( ekran );
    SDL_Delay( 2000 );
    SDL_Quit();
    return 0;
}
W powyższym kodzie przezroczystość u mnie działa.

/edit:
A poniższy kod wycina dziurę w środku:
C/C++
#include <SDL/SDL.h>
#include <windows.h>

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    SDL_Surface * ekran = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
    SDL_Surface * tapeta = SDL_LoadBMP( "tapeta.bmp" );
    SDL_Surface * obraz = SDL_LoadBMP( "obraz.bmp" );
    Uint32 col = SDL_MapRGB( obraz->format, 0x00, 0x00, 0x00 );
    {
        SDL_Rect r;
        r.x = obraz->w / 4;
        r.y = obraz->h / 4;
        r.w = obraz->w / 2;
        r.h = obraz->h / 2;
        SDL_FillRect( obraz, & r, col );
    }
    SDL_SetColorKey( obraz, SDL_SRCCOLORKEY | SDL_RLEACCEL, col );
    SDL_BlitSurface( tapeta, NULL, ekran, NULL );
    SDL_BlitSurface( obraz, NULL, ekran, NULL );
    SDL_Flip( ekran );
    SDL_Delay( 2000 );
    SDL_Quit();
    return 0;
}
P-93384
kokon
Temat założony przez niniejszego użytkownika
» 2013-10-10 17:23:52
1 kod u mnie w ogóle  nie działał, a kod jest tylko z powierzchnią, jak napisałem. Zresztą temat już trochę nie ważny bo zmieniłem bibliotekę na allegro 4.x.
P-93479
« 1 » 2
  Strona 1 z 2 Następna strona