Friday, 24 September 2010

Efek Transparan pada Gambar

Gambar 1. Penampakan Code::Blocks, hihihihi...


Andi:"Sial kepalaku kejedot kaca, habis bening banget sih jadinya nggak kelihatan."
Budi:"Oh itu berarti nilai Alpha pada kaca adalah 0."
Andi:"Hah, apaan?"


Seperti cuplikan perbincangan 2 orang diatas, nilai Alpha pada suatu gambar (image) akan mengatur nilai transparannya. Sehingga objek yang berada dibelakangnya dapat terlihat dengan (sangat) jelas jika nilai Alphanya rendah. Semakin rendah nilai alpha maka semakin transparan dan bahkan tidak kelihatan sama sekali, begitu pula sebaliknya. Berikut link download filenya (source code dan program jadi) dan yang dibawahnya contoh kodenya:

Link : http://www.mediafire.com/?17j66h6z2b3igij
Size : 144 KB
Code :

/*/
*****  *****  *****  *****  *****

---------------------------------
    Efek Transparan pada Gambar
---------------------------------
You can modified, and distribute this
source code, but please don't remove this link:

http://membuatgamedengancpp.blogspot.com/

Thank you for your attention.
---------------------------------

- krofz
*****  *****  *****  *****  *****
/*/
#ifdef __cplusplus
    #include <cstdlib>
#else
    #include <stdlib.h>
#endif
#ifdef __APPLE__
#include <SDL/SDL.h>
#else
#include <SDL.h>
#endif

int main ( int argc, char** argv )
{
    // initialize SDL video
    if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "Unable to init SDL: %s\n", SDL_GetError() );
        return 1;
    }

    // make sure SDL cleans up before exit
    atexit(SDL_Quit);

    // create a new window
    SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,
                                           SDL_HWSURFACE|SDL_DOUBLEBUF);
    if ( !screen )
    {
        printf("Unable to set 640x480 video: %s\n", SDL_GetError());
        return 1;
    }
    SDL_WM_SetCaption("Efek Transparan pada Gambar",NULL);

    // load an image
    SDL_Surface* bmp = SDL_LoadBMP("cb.bmp");
    if (!bmp)
    {
        printf("Unable to load bitmap: %s\n", SDL_GetError());
        return 1;
    }

    // centre the bitmap on screen
    SDL_Rect dstrect;
    dstrect.x = (screen->w - bmp->w) / 2;
    dstrect.y = (screen->h - bmp->h) / 2;

    // program main loop
    bool done = false;

    int alpha = 1, fps = 0;    // program main loop
    const int frame_perdetik = 20;
    while (!done)
    {
        fps = SDL_GetTicks();

        // message processing loop
        SDL_Event event;
        while (SDL_PollEvent(&event))
        {
            // check for messages
            switch (event.type)
            {
                // exit if the window is closed
            case SDL_QUIT:
                done = true;
                break;

                // check for keypresses
            case SDL_KEYDOWN:
                {
                    // exit if ESCAPE is pressed
                    if (event.key.keysym.sym == SDLK_ESCAPE)
                        done = true;
                    break;
                }
            } // end switch
        } // end of message processing

        // DRAWING STARTS HERE

        // clear screen
        SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));

        alpha++;
        SDL_SetAlpha( bmp, SDL_SRCALPHA, 100+(alpha%150));

        // draw bitmap
        SDL_BlitSurface(bmp, 0, screen, &dstrect);

        // DRAWING ENDS HERE

        // finally, update the screen :)
        SDL_Flip(screen);

        int getDetik = SDL_GetTicks() - fps;
        if( getDetik < (1000/frame_perdetik)){
            SDL_Delay((1000/frame_perdetik) - getDetik);
        }
    } // end main loop

    // free loaded bitmap
    SDL_FreeSurface(bmp);

    // all is well ;)
    printf("Exited cleanly\n");
    return 0;
}

// ******************************* //
//      Source Code by Krofz       //
// ******************************* //

Kode diatas akan mengatur nilai alpha surface bmp, sehingga tampak seperti animasi munculnya gambar logo Code::Blocks dari kegelapan. Karena transparan sehingga warna pixel pada gambar akan tercampur dengan warna pixel gambar dibelakangnya, dalam hal ini adalah warna hitam pada layar (screen). Yah kurang lebih seperti itulah. Fungsi untuk mengatur nilai alpha ini, namanya sangat jelas dan mudah diingat, yaitu "SDL_SetAlpha(SDL_Surface *surface, Uint32 flag, Uint8 alpha)". Argumen pertama diisi dengan variabel surface berpointer (SDL_Surface *). Argumen kedua adalah flag atau method yang akan digunakan, dan terakhir nilai Alpha. Salah satu contoh yang sangat mudah untuk menpraktekkan nilai alpha adalah pada bayangan seperti gambar berikut:

Gambar 2. (a) Tanpa mengatur nilai Alpha atau nilai Alphanya tinggi (>250), dan (b) dengan mengatur nilai Alpha rendah.

Bisa dilihat pada gambar diatas, ada bayangan tapi nggak ada orangnya? ih.. serem (Zzz.. ngaco). Perlu diketahui bahwa untuk memproses atau men-setting nilai Alpha memerlukan resource yang cukup besar. Ini dikarenakan program SDL dalam mengolah dan menampilkan nilai Alpha memanfaatkan kerja Processor, dan bukan perangkat keras seperti Graphic Card. Jika program (game) kita sudah semakin kompleks dengan banyaknya proses transparansi dan penggambaran, sepertinya sudah saatnya beralih ke OpenGL (atau SDL + OpenGL). Tapi untuk saat ini program yang kita buat masih sangat sederhana, ditambah lagi dengan spesifikasi komputer umum saat ini yang sudah sangat canggih. Sepertinya belum saatnya.

- krofz

5 comments:

  1. master bisa ga kalo cuma bagian2 yang tidak diinginkan menjadi transparan?
    misalna cuma warna putih?

    ReplyDelete
  2. gan punya file SDL.h ngga??di link cuma ada SDL.dll soalnya..kalo ada kirim ke ferawati.10109266@gmail.com yaa..makasih gan..
    semoga blognya makin sukses..

    ReplyDelete
    Replies
    1. bisa di donlot di http://www.libsdl.org/download-1.2.php , pilih yg SDL-devel-1.2.15-mingw32.tar.gz (Mingw32) untuk pengguna Windows

      atau dapat di donlot di http://www.mediafire.com/download/d061fyvhgitfvly/SDL_Lib_1.2.7z , upload-tan saya :D

      Delete
    2. oya gan..kalo di paramater projectnya mesti kita isi apa??
      soalnya ada pesan warning [Linker error] undefined reference to 'SDL_Init'..'SDL_GetError', dll..

      Delete
    3. Coba klik kanan projectnya (dibawah Workspace) , pilih build options , pilih nama project (diatas Release/Debug) , pilih Linker Settings, pastikan Link libraries-nya terdapat SDL.dll, dan SDLmain.

      Delete

Maaf jika komentar anda lama terbitnya ^__^, penulis berusaha OL sesering mungkin. Komentar anda adalah semangat blog ini, dan juga semangat para blogger lainnya. You can use XHTML tags: <a href="" rel="link"> </a>, <strong> </strong>, <b> </b>, <em> </em>, <i> </i>.

Spesial character use :
&lt; for <
&gt; for >


Use Pastebin.com for alternative to display your code :) .

 

back to top

back to top