Saturday, 26 December 2009

SDL : Deteksi Tabrakan (1)

Hal yang paling vital dalam banyak program game adalah deteksi tabrakan/tubrukan. Dimana satu atau lebih objek bersentuhan secara visual, dan teknik yang paling mudah adalah dengan bentuk kotak (box). Berikut ini contoh program yang akan mengimplementasikannya :

/*
Source Code ini merupakan modifikasi
dari template SDL Code::Blocks dan
Source Code ini adalah bahan/materi
untuk blog:

http://membuatgamedengancpp.blogspot.com/

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

const int lebar_layar = 640;
const int tinggi_layar = 480;

/*membuat fungsi untuk memeriksa terjadinya tabrakan (collision)
    antara kotak pertama (A) dengan kotak kedua (B)
*/
bool f_PeriksaTabrakan(SDL_Rect A, SDL_Rect B)
{
    int kiriA, kiriB;
    int kananA, kananB;
    int atasA, atasB;
    int bawahA, bawahB;

    kiriA = A.x;
    kananA = A.x + A.w;
    atasA = A.y;
    bawahA = A.y + A.h;

    kiriB = B.x;
    kananB = B.x + B.w;
    atasB = B.y;
    bawahB = B.y + B.h;

    if (bawahA <= atasB) return false;
    if (atasA >= bawahB) return false;
    if (kananA <=kiriB) return false;
    if (kiriA >=kananB) return false;

    return true;
}

//clsKotak = class Kotak
class clsKotak
{
    SDL_Rect kotak;
    int red,green,blue;
    int kecX, kecY;

public:
    clsKotak(int,int,int,int,int);
    SDL_Rect getKotak();
    void bergerak(int,SDL_Rect O_[]);
    void tampil(SDL_Surface *_O);
};

//konstruktor kelas kotak
clsKotak::clsKotak(int _red, int _green, int _blue, int _X, int _Y)
{
    //variabel red, green, blue (rgb) untuk
    //membedakan warna dengan kotak yang lain
    red = _red;

    //diperiksa nilainya jika ada kesalahan
    if( red < 0) red = 0;
    else if( red > 255) red = 255;

    green = _green;
    if( green < 0 ) green = 0;
    else if( green > 255) green = 255;

    blue = _blue;
    if( blue < 0 ) blue = 0;
    else if( blue > 255) blue = 255;

    kecX = 5+_X%3;
    kecY = 5+_Y%3;

    kotak.x = _X;
    kotak.y = _Y;
    kotak.w = 20;
    kotak.h = 20;
}

SDL_Rect clsKotak::getKotak()
{
    return kotak;
}

void clsKotak::bergerak(int banyakKotak, SDL_Rect kotakLainnya[])
{
    //menggerakan kotak dengan sumbu x
    kotak.x += kecX;

    //memeriksa apakah sih kotak masih ada dilayar
    //atau sudah keluar dari layar
    if( kotak.x < 0){
        kotak.x = 0;
        kecX = -kecX;
    }
    else if( kotak.x + kotak.w > lebar_layar){
        kotak.x = lebar_layar - kotak.w;
        kecX = -kecX;
    }

    //pemeriksaan terhadap kotak lainnya
    for(int c=0;c<banyakKotak;c++)
    {
        if( f_PeriksaTabrakan( kotak, kotakLainnya[c]))
        {
            kecX = -kecX;
            kotak.x += kecX;
            break;
        }
    }

    //kali ini bergerak searah dengan sumbu Y
    kotak.y += kecY;

    if( kotak.y < 0){
        kotak.y = 0;
        kecY = -kecY;
    }
    else if( kotak.y + kotak.h > tinggi_layar){
        kotak.y = tinggi_layar - kotak.h;
        kecY = -kecY;
    }

    //pemeriksaan terhadap kotak lainnya
    for(int c=0;c<banyakKotak;c++)
    {
        if( f_PeriksaTabrakan( kotak, kotakLainnya[c]))
        {
            kecY = -kecY;
            kotak.y += kecY;
            break;
        }
    }
}

void clsKotak::tampil(SDL_Surface *_screen)
{
    red+=rand()%5;
    if( red>220) red = 0;

    green+=rand()%7;
    if( green>220) green = 0;

    blue+=rand()%9;
    if( blue>220) blue = 0;

    //warna diisi sesuai dengan variabel red, green, blue
    SDL_FillRect( _screen, &kotak, SDL_MapRGB( _screen->format, red, green, blue));
}

int main ( int argc, char** argv )
{
    srand((unsigned)time(NULL));

    // 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(lebar_layar, tinggi_layar, 16,
                                           SDL_HWSURFACE|SDL_DOUBLEBUF);
    if ( !screen )
    {
        printf("Unable to set 640x480 video: %s\n", SDL_GetError());
        return 1;
    }

    //bykKotak = banyak Kotak
    const int bykKotak = 50;
    clsKotak *kotakKu[bykKotak];
    for( int c=0;c<bykKotak;c++){
        int X = c*30%(lebar_layar-40);
        kotakKu[c] = new clsKotak(c*200%255,150,c*100%255,X,c*2);
    }

    //membuat variabel fps (frame per second)
    //dan jumlah frame setiap detiknya adalah 24
    int fps = 0;
    const int frame_per_second = 24;

    // program main loop
    bool done = false;
    while (!done)
    {
        //memperoleh sekian milidetik dari SDL_GetTicks()
        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,255,255,255));

        for( int b=0;b<bykKotak;b++){
            //_ktkLain = kotak lainnya
            SDL_Rect _ktkLain[bykKotak];
            for( int c=0;c<bykKotak;c++){
                if( c != b){
                    _ktkLain[c] = kotakKu[c]->getKotak();
                }
                else{
                    _ktkLain[c].x=0;
                    _ktkLain[c].y=0;
                    _ktkLain[c].w=0;
                    _ktkLain[c].h=0;
                }
            }

            kotakKu[b]->bergerak(bykKotak,_ktkLain);
        }

        for( int c=0;c<bykKotak;c++){
            kotakKu[c]->tampil(screen);
        }

        // DRAWING ENDS HERE

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

        //perhitungan frame rate
        int getDetik = SDL_GetTicks() - fps;
        if( getDetik<(1000/frame_per_second)){
            SDL_Delay((1000/frame_per_second) - getDetik);
        }

    } // end main loop

    for( int c=0;c<bykKotak;c++){
        delete kotakKu[c];
    }

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

// - krofz
Atau download file dibawah ini yang berisi project (Code::Blocks) program diatas dan
hasil build/kompilasi-nya:

Link : http://www.mediafire.com/?nrki2l896hba2vs
Size : 132.17 KB

Program diatas nggak perlu gambar yang aneh-aneh dalam proses "Drawing-nya", cuma memanfaatkan "SDL_FillRect()" dan "SDL_Rect (ini yang penting)". Kotak-kotak tersebut akan memantul setelah tertabrak dengan kotak lain atau ingin keluar dari layar. Buat yang masih bingung , nanti penjelasan lengkapnya nyusul yah... hahaha....

Next Part 2
Update 18 April 2013
- krofz

Thursday, 10 December 2009

SDL : Istirahat Sejenak

Kalau program berikut kita kompilasi/build :

#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 )
{
if( SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
return 1;
}

SDL_Surface *screen = NULL;
screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);

if( screen == NULL)
{
return 1;
}

bool selesai = false;
while( selesai == false)
{
SDL_Event event;
while( SDL_PollEvent(&event))
{
switch( event.type)
{
case SDL_QUIT: selesai = true; break;
case SDL_KEYDOWN:
if( event.key.keysym.sym == SDLK_ESCAPE)
{
selesai = true;
} break;
default:;
}
}
SDL_FillRect(screen,0, SDL_MapRGB(screen->format,0,0,255));
SDL_Flip(screen);
}

SDL_Quit();
return 0;
}
Lalu dijalankan dapat dipastikan program akan menggunakan CPU Usage (di Windows dapat dilihat dengan Task Manager - [Ctrl]+[Alt]+[Del]) sebesar 100% alias hampir semuanya digunakan. Bukan berarti program kita amat sangat berat (padahal cuma nampilin layar warna biru polos) tapi karena prosesnya berjalan terus tanpa ada istirahat. Frame yang dihasilkan setiap detiknya sesuai dengan kemampuan komputer untuk mengolahnya, bisa 20, bisa 100 atau 1000 lebih!. Kalau game kita terlalu cepat bisa bikin permainan kurang nyaman begitu pula kalau terlalu lambat (kalau CPU Usage 100% tapi lambat nggak perlu istirahat lagi, soalnya komputer lagi sibuk ngolah! - perlu optimasi!! ). Kalau sudah begitu Frame Per Second (fps) atau Frame Rate harus turun tangan. Membuat fps gampang kok, berikut kodenya:

#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 )
{
if( SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
return 1;
}

SDL_Surface *screen = NULL;
screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);

if( screen == NULL)
{
return 1;
}

//membuat variabel fps (frame per second)
//dan jumlah frame setiap detiknya adalah 20
int fps = 0;
const int frame_per_second = 20;

bool selesai = false;
while( selesai == false)
{
//memperoleh sekian milidetik dari SDL_GetTicks()
fps = SDL_GetTicks();

SDL_Event event;
while( SDL_PollEvent(&event))
{
switch( event.type)
{
case SDL_QUIT: selesai = true; break;
case SDL_KEYDOWN:
if( event.key.keysym.sym == SDLK_ESCAPE)
{
selesai = true;
} break;
default:;
}
}
SDL_FillRect(screen,0, SDL_MapRGB(screen->format,0,0,255));
SDL_Flip(screen);

//perhitungan frame rate
int getDetik = SDL_GetTicks() - fps;
if( getDetik < (1000/frame_per_second)){
SDL_Delay((1000/frame_per_second) - getDetik);
}
}

SDL_Quit();
return 0;
}
Pertama kita membuat variabel (fps) untuk menampung waktu berupa milidetik dari SDL_GetTicks(). Lalu setelah sampai di ujung pengulangan program akan istirahat jika pekerjaannya sudah beres sesuai waktu yang ditentukan. Dalam contoh diatas program harus menampilkan 20 frame (putaran pengulangan) setiap detiknya. Atau sekitar 50 milidetik setiap framenya, jika program menyelesaikannya dalam 15 milidetik itu berarti program punya waktu 35 milidetik untuk istirahat. Tetapi tidak sebaliknya jika program menyelesaikan dalam 50 atau lebih milidetik. Selanjutnya membandingkan dengan variabel getDetik seberapa banyak milidetik yang diperlukan setiap frame. Misalnya fps bernilai 12300 milidetik, lalu getDetik bernilai (misal) 20 didapat dari nilai SDL_GetTicks() saat ini misalnya 12320 dan dikurangi fps (12300). Jika getDetik (20) lebih kecil dari 50 (1000/20) maka program dapat istirahat sebanyak sisa waktu yaitu 30 milidetik (1000/20 - 20). Moga-moga bener perhitungannya hahah... . Berikut deklarasi SDL_GetTicks() :

/* Get the number of milliseconds since the SDL library initialization.
* Note that this value wraps if the program runs for more than ~49 days.
*/
extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void);


- krofz

Friday, 27 November 2009

SDL : Petualangan Pertama (3)

Tulisan ini merupakan lanjutan dari:
SDL : Petualangan Pertama (1)
SDL : Petualangan Pertama (2)

Ayo, kita lanjutkan!, karena lebih cepat itu lebih baik, sehingga membuat kita semakin pro(fesional) *niru-niru slogan pemilu hehehe... nggak jelas *.
...
// DRAWING STARTS HERE

// clear screen
SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
...
Sekarang kita telah memasuki tahap penggambaran (Drawing), yang perlu diperhatikan adalah urutan pengambaran. Jangan sampai gambar kecil dibelakang gambar besar atau gambar background yang menutupi semua permukaan layar (screen) digambar terakhir. SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0)); akan mengisi (fill) permukaan (surface) dengan warna (SDL_MapRGB()) hitam (kode warna yang digunakan adlah RGB - Red Green Blue, setelah screen->format, yaitu 0,0,0), untuk format awal fungsi SDL_FillRect() dan SDL_MapRGB sebagai berikut:

//untuk SDL_FillRect
extern DECLSPEC int SDLCALL SDL_FillRect
(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);

//untuk SDL_MapRGB
extern DECLSPEC Uint32 SDLCALL SDL_MapRGB
(const SDL_PixelFormat * const format,
const Uint8 r, const Uint8 g, const Uint8 b);
SDL_FillRect() juga dapat digunakan untuk menampilkan atau menggambarkan SDL_Rect, contohnya :

/*
mengisi nilai variabel kotak secara langsung dengan
x = 20, y = 30, w = 100, dan h = 80.
*/
SDL_Rect kotak = { 20, 30, 100, 80 };
...

// clear screen
SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
SDL_FillRect(screen,&kotak, SDL_MapRGB(screen->format,255, 0, 0));
Maka akan tercipta sebuah kotak dengan warna merah (R=255,G=0,B=0). Yang perlu diingat dalam proses penggambaran adalah jangan membuat objek yang tak terlihat dilayar misalnya memasukkan nilai x lebih besar dari lebar layar karena hanya akan menambah beban komputer aja untuk menggambarnya. Selanjutnya untuk SDL_BlitSurface berfungsi untuk menggambar surface ke dalam surface lainnya:
...
// draw bitmap
SDL_BlitSurface(bmp, 0, screen, &dstrect);

// DRAWING ENDS HERE

// finally, update the screen :)
SDL_Flip(screen);
} // end main loop
...
Argumen pertama diisi dengan SDL_Surface berpointer (SDL_Surface *src) yang akan digambar ke argumen ketiga. Pada argumen kedua diisi dengan SDL_Rect berpointer (SDL_Rect *srcrect), yang berfungsi untuk mengambil bagian tertentu dari gambar secara kotak(matis?!). Ketiga diisi dengan SDL_Surface berpointer (SDL_Surface *dst) yang menjadi tujuan. Kenapa diisi dengan screen (layar)? Karena screen menjadi jendela utama diaplikasi kita yang terlihat jelas. Tetapi kita juga dapat dapat mengisinya dengan variabel yang lain. Argumen keempat diisi seperti argumen kedua (SDL_Rect *dstrect), berfungsi untuk menempatkan objek pada koordinat (x,y) sesuai nilai dari dstrect.x dan dstrect.y. Terakhir adalah proses memperbaharui (update) screen yang menjadi jendela utama (SDL_SetVideoMode()), selanjutnya kembali lagi keawal pengulangan sampai user menekan tombol Close atau ESC untuk menutup program.
...
// free loaded bitmap
SDL_FreeSurface(bmp);

// all is well ;)
printf("Exited cleanly\n");
return 0;
}
...
Kalau sudah keluar dari pengulangan alias program ditutup kita harus melakukan pembersihan terhadap memory jika tidak akan terjadi memory leak (kebocoran memory) yang nantinya bisa menyebabkan komputer hang. Nggak mau dong, ngeliat orang maenin game kita terus pas selesai komputernya hang, Apa Kata Usernya! (a la Naga Bonar ). Tapi jangan membersihkan variabel yang sudah bersih atau pembersihannya 2 kali atau lebih dan jangan menampilkan gambar (SDL_Surface) yang sudah bersih. Sampai sini kita (mestinya) sudah bisa bereksperimen dengan tombol di keyboard (SDLK_...), memanggil inti (init) SDL, menampilkan gambar dengan koordinat ( SDL_Rect posisi = {x,y,w,h}; ) tertentu, dan menutup program dengan aman. Silahkan berkreasi dengan SDL .

- krofz

Thursday, 19 November 2009

Musibah dari Virus W32/Chir.B

Emang nasib lagi kurang baik bagiku . Gimana nggak ngeselin kena virus (virus apa worm yah? *bingung sendiri*) yang nginfeksi file .exe sama .html. Terpaksa deh scan komputer, mana komputer jadul lagi, scannya lama banget. Pertama pake PCMAV versi 2.2 kalau make PCMAV file yang terinfeksi nggak keditek (detect) kecuali file induk/utama-nya. Tapi kalau make Avira Free versi 9.x (yang udah diupdate) siap-siap dengerin suara merdu (beep) ala Avira kalau komputer banyak file .html, dan tentunya file .exe juga banyak. Virus ini juga ngebikin sebuah file dengan nama readme.eml (sejenis file email), yang menurut sumber yang aku cari file ini akan mengirimkan data pribadi (nggak tau data apaan yang pasti nggak menyenangkan) ke pembuatnya mungkin atau ke tempat tertentu, kalau terhubung ke-internet. File readme.eml ini kebaca dengan nama virus W32/Runouce.B2:


Gambar 1. Setelah selesai Scan

Virus ini emang nggak terlalu berbahaya, nggak ngilangin folder options, disable task manager, dan kegiatan berbahaya lainnya (hapus file) alias low risk.
Cuma aktifitas-nya yang nyari file diharddisk bikin lambat, dan nginfeksi file .exe sama .html yang bikin kesel. Bayangin kalau semua file .exe keinfeksi terus sama avira yang opsi-nya cuma ada Move to Quarantine sama Delete. Move to Quarantine bisa bikin prosesnya sangat lama karena kalau di komputer kita banyak program dan masing-masing program punya banyak file .exe dan .html (terutama program berat seperti Adobe Photoshop yang banyak file tutorial dan helpnya) bisa jadi komputer nge-hang karena RAM/memori (ditambah baca/tulis harddisk yang lama) kepakai untuk pemindahan file asli ke Quarantine itu sangat banyak. Syukur kalau komputernya, komputer super kalau komputernya P4 pertama
bisa nangis darah nungguin prosesnya.

Untuk file .exe yang keinfeksi terpaksa di-instal ulang programnya (kedua udah ada program buat ngebersihin file tersebut, kalau ada bagi dong) kalau udah bersih komputernya. Tapi kalau setup/installer/paket programnya yang keinfeksi siap-siap ke toko cd software atau ke internet jika nggak punya backup-an softwarenya. Tapi untuk file .html yang keinfeksi ada cara untuk menyalamatkan file tersebut dan membuat para antivirus tidak membaca/men-detek (enakan ditek yah? <-ngacauin bahasa) file itu adalah virus. Ini dia caranya , pertama buka file .html itu dengan notepad lalu pergi ke bagian akhir file terus cari teks yang diblok pada gambar:


Gambar 2. Membersihkan file .html

Hapus string <script language="JavaScript">window.open("readme.eml",null,"resizable=no, top=6000,left=6000")</script></html> terus simpan (save). Coba scan lagi file yang diditek sama antivirus (Avira contohnya) sebagai virus. Dijamin Avira akan lupa kalau file itu adalah (mantan) virus habis kau W32/Chir.B . Sip kalau nggak keditek virus lagi berarti anda sudah seperti Arnold dalam film Eraser hehehe . Oh yah, sorry nggak ngupdate blog dengan materi "Membuat Game Dengan C++" maklum lagi sibuk kerja .

- krofz

Wednesday, 4 November 2009

SDL : Petualangan Pertama (2)

Jelajahi Dengan Petamu!

Tulisan ini merupakan lanjutan dari:

SDL : Petualangan Pertama (1)

...
// centre the bitmap on screen
SDL_Rect dstrect;
dstrect.x = (screen->w - bmp->w) / 2;
dstrect.y = (screen->h - bmp->h) / 2;
...
Kode diatas akan menempatkan gambar bitmap tepat ditengah-tengah dengan perhitungan secara matematis. "SDL_Rect" berfungsi untuk membuat sebuah objek berupa kotak/bujur sangkar (Rect - Rectangle) yang memiliki anggota (member) yaitu variabel x untuk koordinat x, y untuk koordinat y, w untuk width (lebar), dan h untuk height (tinggi). Karena yang akan kita buat adalah program 2D maka sumbu yang digunakan hanya x dan y (ya iyalah 2 dimensi). Yang perlu diperhatikan dalam program SDL adalah bahwa nilai koordinat y semakin keatas semakin minus (-) sedangkan umumnya adalah plus (+).

Gambar 1. (A) Nilai koordinat pada umumnya, (B) nilai koordinat pada SDL. (sumber : My SDL Teacher)

Nilai koordinat x (dstrect) didapat dari lebar layar (screen->w) dikurang lebar gambar lalu dibagi 2. Begitu juga dengan koordinat y didapat dari pengurangan tinggi layar dengan tinggi gambar. Cara atau perhitungan ini membuat penempatan gambar lebih efisien dibanding memasukkan nilai x dan y secara manual. Untuk membuktikannya ubah gambar cb.bmp dengan ukuran pixel (lebar dan tinggi) yang berbeda.

"Tanda panah kekanan (->) itu untuk apaan yah?", tanda ini digunakan untuk memanggil anggota (member) dari suatu variabel berpointer yang memiliki tipe data bentukan seperti struct, class, dll. Contoh:
...
struct orang
{
int umur;
};

orang Budi;
orang* Rudi;

Budi.umur = 10;
Rudi = &Budi;

cout<<"Umur Budi = "<<Budi.umur<<endl;
cout<<"Umur Rudi = "<<Rudi->umur<<endl;
...
Karena Rudi bertipe pointer dan menunjuk ke alamat Budi sehingga umur Rudi didapat dari umur Budi. Tetapi untuk pemanggilan anggotanya, Rudi harus menggunakan tanda panah -> dan Budi menggunakan titik. Bayangkan jika kedua variabel tersebut menggunakan titik, kita tidak tau yang mana yang berpointer dan yang tidak, simple kan ;D.
...
// program main loop
bool done = false;
while (!done)
{
// 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
...
Di bagian ini program mulai berjalan terus menerus tanpa henti (yah nge-hang dong?!, nggak ntar bisa ditutup). Karena kita tidak tau kapan program akan dihentikan makan pengulangan yang cocok adalah while, selama done sama dengan false - (!done) atau (done == false). SDL_Event berfungsi untuk menangani suatu kejadian, kejadian disini adalah ketika user memberikan input seperti menekan tombol close (lambang X dipojok kanan window), keyboard, mouse, dll. Selanjutnya kita memasuki fungsi SDL_PollEvent() yang argumennya kita isi dengan alamat variabel event, untuk format awal fungsi SDL_PollEvent():
...
/* Polls for currently pending events, and returns 1 if there are any pending
events, or 0 if there are none available. If 'event' is not NULL, the next
event is removed from the queue and stored in that area.
*/
extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event *event);
...
Fungsi ini akan terus terjadi selama (while) masih ada pemberian (poll) input. Ketika suatu event terjadi maka event itu akan ditaruh didalam suatu antrian (queue) event, antrian ini menyimpan data event untuk setiap event yang terjadi. Selanjutnya pengecekan tipe dari event menggunakan switch, SDL_QUIT berasal dari penekanan tombol X dipojok kanan window. SDL_KEYDOWN untuk penekanan keyboard. Selain kedua tipe tadi ada juga SDL_MOUSEMOTION untuk pergerakan mouse, SDL_MOUSEBUTTONDOWN untuk penekanan tombol mouse. event.key.keysym.sym untuk setiap pengecekan tombol keyboard kita memanggil struktur dengan nama "key" yang memiliki struktur lagi yaitu "keysym", dan struktur terakhir "sym" (panjang yah?!...) dan yang menampung data event (keyboard) adalah "sym". SDL Key (SDLK_..) lainnya:
SDLK_0 - SDLK_9
SDLK_a - SDLK_z
SDLK_F1 - SDLK_F15
//dan beberapa karakter lainnya
SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT
SDLK_DOLLAR
//dan sebagainya
Sedikit kode lagi akan kita bedah.... tapi pembedahan ini menguras banyak tenaga dan pikiran hehehe... rileks-kan tubuh dan pikiranmu dengan bermain game favoritmu. So,.. Masih bersambung... ;)

- krofz

Thursday, 22 October 2009

SDL : Petualangan Pertama (1)



Don't Forget Your Healing Potion!


Kali ini kita akan membedah kode-kode C++ dan SDL yang telah kita buat melalui template Code::Blocks seperti pada tulisan sebelumnya.


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

Jika kita akan membuat program dengan SDL pastikan bahwa pada fungsi utama (int main()) memiliki argumen seperti diatas. Jika tidak maka program tidak akan berjalan. Selanjutnya adalah memulai memanfaatkan SDL dengan "SDL_Init(Uint32 flags)" dengan nilai "SDL_INIT_VIDEO" pada "Uint32". Ini berarti kita hanya menggunakan subsistem SDL yaitu video. Subsistem lainnya seperti audio, waktu dan lainnya belum kita berikan, untuk itu sebaiknya diganti dengan "SDL_INIT_EVERYTHING". Tenang aja untuk performance-nya tidak akan berubah drastis jika kita gunakan seluruh (Everything) subsitem. Jika SDL_Init tidak dapat melakukan inisiliasi maka nilai kembaliannya akan lebih kecil dari 0 sehingga jika program dijalankan di command prompt akan terdapat baris output berupa pesan error. Pesan error tergantung dari permasalahan yang didapat oleh SDL_GetError(). Selanjutnya program akan ditutup dengan nilai 1 (pertanda bahwa program ada masalah). Berikut ini subsistem yang dapat digunakan:


SDL_INIT_TIMER
SDL_INIT_AUDIO
SDL_INIT_VIDEO
SDL_INIT_CDROM
SDL_INIT_JOYSTICK
SDL_INIT_NOPARACHUTE
SDL_INIT_EVENTTHREAD
SDL_INIT_EVERYTHING

Selanjutnya adalah:


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

Dari baris komentar-nya saja mungkin kita sudah tau fungsi baris ini. Setelah kita meng-inisialisasi SDL saat awal program dimulai maka setelah program ditutup, kita harus menutup terlebih dahulu SDL agar terjadi proses bersih-bersih. Dapat juga menggunakan "SDL_Quit();" sebelum kode "return 0;" pada akhir fungsi main (akhir kode).


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

Kita membuat variabel ber-pointer dengan nama screen dan tipe data SDL_Surface. SDL_Surface ini menampung data berupa gambar, yang tentunya sebelum dimasukkan ke variabel bertipe surface (permukaan - SDL_Surface) harus diproses terlebih dahulu. SDL_SetVideoMode akan membuat sebuah jendela layaknya aplikasi lainnya sehingga dapat menampilkan gambar ke pengguna. Argumen pertama berisi tentang lebar jendela aplikasi kita berjumlah 640 pixel, yang kedua berisi tinggi aplikasi berjumlah 480 pixel, yang ketiga berisi jumlah bit yang terdapat pada pixel (bit per pixel) berjumlah 16 bit. Sedangkan yang keempat akan membuat permukaan layar (jendela) pada sistem memory tanda (flag) lainnya untuk mengisi argumen keempat adalah SDL_SWSURFACE. Selanjutnya akan memeriksa apakah screen bernilai false, karena screen bertipe pointer maka nilai falsenya adalah NULL, kalau pada int(eger) nilai falsenya adalah 0. Sehingga kode sebelumnya dapat dirubah menjadi seperti berikut:


...
//menge-set pointer screen ke NULL
//sangat tepat digunakan jika pointer tidak menunjuk kemanapun
SDL_Surface* screen = NULL;

screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);

if ( screen == NULL )
{
...

Jika ingin melihat fungsi SDL_SetVideoMode() dan beberapa flag untuk argumen keempat (Uint32 flag), silahkan buka file header video "(video.h)". Ok kode selanjutnya :


...
// load an image
SDL_Surface* bmp = SDL_LoadBMP("cb.bmp");

// sama dengan fungsi "if ( bmp == NULL)"
if (!bmp)
{
printf("Unable to load bitmap: %s\n", SDL_GetError());
return 1;
}
...

Membuat variabel untuk menampung gambar dalam hal ini adalah gambar bitmap dengan menggunakan fungsi SDL_LoadBMP (BitMaP), dan nama file yang dituju adalah cb.bmp. File yang dituju harus satu folder dengan file aplikasi (.exe) yang akan dijalankan. Umumnya file pendukung program seperti gambar, suara, huruf, dll, diletakkan pada folder masing-masing sehingga terlihat lebih rapi. Nah agar program menunjuk kesuatu folder misalnya folder gambar, kodenya dapat dirubah menjadi "SDL_LoadBMP("Gambar/cb.bmp");".

Bersambung... ;)

- krofz

Thursday, 8 October 2009

Setting SDL di Code::Blocks v8.02 (2)


Ini Adalah Sebuah Awal..

Tulisan ini merupakan lanjutan dari:
Setting SDL di Code::Blocks v8.02 (1)

Sudah OK semuanya? selanjutnya men-setting SDL pada IDE, untungnya di Code::Blocks cuma klik sana klik sini doang. Jalankan Code::Blocks, lalu pilih menu "File-> New-> Project...", lalu pilih kategori "SDL Project", lalu pilih "Go":

Gambar 1. Membuat SDL project

Next, jika muncul gambar seperti berikut:

Gambar 2. Lokasi project

Masukkan alamat folder yang akan ditempati proyek (project) lalu masukkan nama proyek-nya, isi sesuai gambar juga nggak masalah (asal drive "D:\" ada). Selanjutnya klik next, sampai muncul gambar berikut:

Gambar 3. Memilih lokasi SDL

Jika setelah next nggak muncul seperti gambar diatas pilih cancel, biasa-nya kalau pertama kali setting SDL di Code::Blocks (v8.02) gambarnya bukan kaya diatas (niatnya mau diambil screenshot-nya, eh udah instal ulang programnya masih nggak muncul juga gambarnya XD ). Udah muncul gambarnya, seperti diatas? Kalau sudah pilih button/tombol browse (yang gambarnya titik-titik tiga) jika belum memilih lokasi SDL. Selanjutnya memilih output dari SDL, ada 2 jenis output yaitu "Debug", dan "Release". Bisa keduanya kita centang sesuai atau salah satu, seperti gambar berikut:

Gambar 4. Pilihan output program SDL

Perbedaan release dengan debug .... eh... eh.... *Mikir dulu, lama.. banget*
Pada release ukurannya lebih kecil dari debug karena tidak disematkan/dimasukkan intruksi-intruksi untuk proses debug (pencarian kesalahan program atau bug) kali *siul siul*.
Selanjutnya pilih finish, dan isi dari project (pada panel "Management" bagian kiri) yang kita buat adalah sebagai berikut:

Gambar 5. Isi project SDL

  1. "main.cpp", berisi kode-kode bahasa C++ yang berasal dari template project SDL-nya Code::Blocks. Nanti kita akan bahas setiap kode-nya ( kalau sempet yah ;D ).

  2. "cb.bmp", merupakan gambar dengan format .bmp (Bitmap) yang akan ditampilkan oleh program GUI kita.
Kalau sudah di-finish pilih "Build -> Build and run (F9)". Kalau kita sudah mensetting file .dll (SDL). maka program dapat langsung berjalan dan hasil akhirnya adalah sebagai berikut dengan lebar window (jendela program) sebesar 640 pixel dan tinggi sebesar 480 pixel:

Gambar 6. Program SDL pertama kita!

Tapi jika file .dll-nya belum disetting atau diatur sistem akan menampilkan pesan kesalahan seperti pada gambar dibawah ini:

Gambar 7. Dimana SDl.dll-nya?


Sekarang tau kan fungsi file .dll :D . Sampai disini kita baru mengatur agar file SDL yang kita download dapat digunakan oleh compiler/IDE dan menggunakan template program SDL sebagai awal pembuatan program SDL kita. Selanjutnya kita akan bedah satu persatu setiap kodenya hehehe...

- krofz

Thursday, 1 October 2009

Setting SDL di Code::Blocks v8.02 (1)


Move... Move..!!

IDE yang aku gunakan adalah Code::Blocks mungkin akan berbeda cara mensetting-nya dengan IDE yang lain (contoh: MS Visual C++, Dev-C++, dll) tapi intinya mungkin sama. Sudah donwload file SDL-nya? coba ikuti tutorial di link ini. Yang akan di download pada tutorial tersebut adalah "SDL Main", yang artinya hanya bagian-bagian terpenting dalam aplikasi SDL saja, tapi cukup untuk membuat sebuah aplikasi (game) yang menarik dan fast (dalam kinerja-nya).

OK, sekarang kita akan men-setting SDL di Code::Blocks (v8.02). Jika meng-instal Code::Blocks seperti biasa dengan meng-klik "Next, Next, Next" aja maka secara default path atau lokasi program ada di "C:\Program Files\CodeBlocks", tapi kalau pada saat instalasi memilih meletakkan dilokasi tertentu silahkan cari folder program tersebut. Sudah ketemu? lalu buka folder tersebut sehingga terlihat seperti gambar berikut:

Gambar 1. Lokasi program Code::Blocks

Buat folder baru dengan nama "SDL" lalu copy-paste folder "include", dan "lib" dari library SDL yang sudah didownload kedalam folder SDL tersebut. Sehingga hasilnya seperti gambar berikut:

Gambar 2. Subfolder didalam folder SDL

Selanjutnya untuk folder bin yang berisi file .dll (Dynamic Link Library), digunakan untuk untuk menjalankan rutin-rutin atau fungsi-fungsi yang bersifat general (umum). Aplikasi SDL akan mencari file tersebut dalam direktori atau didalam sistem. Tanpa file .dll ini program SDL tidak dapat berjalan. Kalau nggak tau file dengan format .dll itu seperti apa, berikut screenshot-nya:

Gambar 3. Dynamic Link Library (.dll)

Penempatannya (file .dll) dalam program SDL terdapat beberapa cara, yaitu:
  1. Meletakkan file .dll satu folder dengan file program (.exe) SDL yang sudah jadi.

  2. Jika menggunakan SO Windows XP dapat meletakkannya di dalam folder "C:\WINDOWS\system32".

Kelebihan cara pertama adalah ketika menjalankan program di komputer lain yang tidak memiliki file .dll (SDL) dalam sistemnya maka program tetap dapat berjalan, sedangkan kekurangannya adalah ukuran size program akan membengkak jika terdapat 2 atau lebih program yang membutuhkan file .dll tersebut dan 2 atau lebih program tersebut disimpan dalam direktori (folder) yang berbeda satu sama lain. Ini biasanya terjadi pada aplikasi SDL yang proses instalasinya hanya melalui copy-paste atau ekstrak arsip (archive) atau folder program (gampangan copy-paste kan? Setuju..!). Paling bengkaknya cuma 1 MB doang, kan Harddisk sekarang daya tampungnya gede-gede :p.

Tapi tetep ngk suka dengan membengkaknya program walaupun hanya 1 MB atau lebih? buat aja semacam setup instalasi. Bisa menggunakan program ketiga atau buat sendiri dengan C++ (hayo.. jangan nanya caranya sekarang yah ke aku... XD ) yang tujuannya adalah hanya mengkopi file .dll (SDL) ke system ("C:\WINDOWS\System32\") sedangkan 2 atau lebih program aplikasi SDL tersebut akan diletakkan dalam direktori yang telah ditentukan (itu loh kaya instal-instal program seperti biasa kan ada browse-nya). Kelebihan cara kedua yah seperti dijelasin diatas, tidak perlu lagi menyertakan file .dll pada masing-masing folder aplikasi SDL.

Tapi berhubung kita belum membuat sebuah program dengan SDL (yang baru belajar SDL) jadi nggak perlu pusing-pusing dulu (emang memusingkan penjelasan diatas? >.< ). Yang penting sekarang ada folder SDL dengan subfolder "include" dan "lib", seperti pada gambar sebelumnya.

- krofz

Monday, 21 September 2009

Download SDL


Download Speed = 1 byte/s ?!!

Sebelum memulai memrograman dengan SDL kita perlu mendownload library (pustaka) SDL terlebih dahulu. Caranya gampang kok.. cukup kunjungi www.libsdl.org terus pilih link bagian SDL 1.2 pada kategori Download pada panel sebelah kiri, kalau bingung lihat gambar dibawah ini:

Gambar 1. Link untuk download SDL

Sudah? Nah, disitukan ada banyak pilihan seperti "Source Code", "Runtime Libraries", dan "Development Libraries" yang akan kita download adalah yang terakhir "Development Libraries". Karena rata-rata SO (Sistem Operasi) pada sebuah PC adalah Windows (SO yang nulis juga sama) maka kita pilih "Win32" bagian "SDL-devel-1.2.13-mingw32.tar.gz (Mingw32)" untuk pengguna Linux silahkan pilih pilihan yang tersedia, lihat gambar:

Gambar 2. Download library untuk pengguna Windows

Tunggu sampai proses downloadnya selesai, setelah selesai isi dari file arsip (archive) tersebut dibuka (kalau nggak bisa dibuka instal aplikasi seperti 7-zip - ringan, kecil dan Free!) akan tampak seperti gambar dibawah ini:

Gambar 3. Isi file arsip

Jika hasilnya sama seperti gambar diatas berarti file download-an sudah OK. Yang terpenting adalah folder "bin", "include", dan "lib" kalau ketiga folder itu tidak ada silahkan download lagi :p . Selanjutnya kita akan men-setting SDL agar bisa digunakan, tenang aja mudah kok!.

Thursday, 3 September 2009

War of Helm v0.2.6


[GAMBAR]

Ini merupakan salah satu game pertama buatanku dengan menggunakan library SDL dan bahasa pemrograman C++.


[GAMBAR]

Saat awal program dijalankan.


[GAMBAR]

Judulnya 'War of Helm', hehehe.. keren ngk? dibuatnya sih udah lama. Game ini sejenis Pacman, ngumpulin bola-bola kuning (kalau di game ini ngumpulin emas). Disini juga ada musuhnya, jadi hati-hati dengan mereka. Mereka bisa melempar lembing untuk ngemusnahin player (pemain). Bukan berarti kita harus pasrah saat dikejar mereka, gunakan D untuk Dash semacam kemampuan untuk menabrak musuh. Dan kalau udah ketabrak kita akan dapet poin + gold, penggunaan Dash memerlukan 1 energy. Ada juga kemampuan kedua, yaitu Invisible (tak terlihat), penggunaannya memerlukan 2 energy.


[GAMBAR]

Setiap level yang kamu lewatin, akan ada upgrade kemampuan seperti nambahin jumlah nyawa, mempercepat penambahan energi, memperbanyak jumlah energi, dan menambah speed (kecepatan). Dan banyaknya level dalam game ini ada 8. Kalau udah selesain seluruh atau mati (game over) dengan skor (score) yang tinggi akan muncul semacam tempat untuk memasukkan highscore (skor-skor tertinggi) dalam game ini.


Programming, and Graphic by :
- Krofz

Game Tester by:
- Cruxblack

Sound and Music from another games! (thanks a lot).


Silahkan download melalui link dibawah ini:
Link : MediaFire
Size : 1.34 MB
*NB: Last update download link 24 April 2014

Selamat Bermain!

- krofz

Thursday, 20 August 2009

SDL, The First Hero

Hello Hero!

"Mana nih posting, tutorial atau latihan buat bikin game-nya katanya blognya 'Membuat Game Dengan C++'?", mungkin keluhan dari salah satu pembaca blog ini. Tapi mungkin keluhan itu belum muncul karena masih sedikitnya pembaca atau mereka takut dituntut dengan UU IT :p hehehe... tenang aja jika kamu sudah bisa jurus 'if' dan 'for' maka semuanya akan menjadi lebih mudah. Kali ini aku akan perkenalkan salah satu library (pustaka) yang powerfull, yaitu SDL.

SDL merupakan singkatan dari Simple Directmedia Layer, yang merupakan sebuah libary dalam pemrograman untuk menciptakan sebuah program berbasis GUI (Graphic User Interface)
2D (2 Dimensi). Library-nya dapat didownload dari situs resminya, yaitu www.libsdl.org. Library ini mendukung banyak bahasa pemrograman (dapat dilihat dari situs resminya).

"Kok 2D, sekarangkan sudah jamannya 3D (*lirik game-game terbaru*)?", Sabar dong yang 2D aja belum bisa apalagi 3D (*dengan nada menghakimi, padahal yang dihakimi mungkin lebih ahli :P). Memang kalau kita membuat game dari awal (mulai dari programming) tanpa menggunakan tool/engine atau aplikasi seperti GameMaker, RPGMaker, dll, hasilnya bakal sangat lamaaaaa......... Ditambah lagi membuat-nya sendiri mulai dari art/graphic/gambar, sound/suara, design, music, dll, tapi setelah selesai membuat (game)-nya pasti akan terasa sangat puas ^_^ (ciye... yang udah ngerasain bikin game pake SDL *siul-siul* , buahahahahha... oops :P ).

Dan mengenai game 2D atau 3D. Kalau kalian ingin membuat game 3D dapat menggunakan API (Application Programming Interface) seperti OpenGL, atau DirectX yang mungkin nanti akan dihabas disini :) . Silahkan Googling aja kalau ingin tau lebih lanjut.

Jadi, tetap tunggu postingan selanjutnya tentang SDL :D dan tentunya Jurus-jurus C++ lainnya.

- krofz

( Updated 23 September 2013 )

Sunday, 9 August 2009

Melatih Jurus Kedua (2)

Bersiap!!

Kalau mau lebih lengkapnya tentang kode di Postingan Melatih Jurus Kedua (1) dapat didownload kodenya melalu link yang ada diakhir kalimat. Tapi tenang aja aku akan jelaskan lebih lanjut lagi, kita ambil contoh bentuk kode for yang sering dipakai untuk pembelajaran atau tutorial (hehehe... ngk kreatif yah ~_~), seperti berikut:


...
for( int A = 0;A < 5;A++){
printf("A = %d\n",A);
}
...


Kira-kira maksud dari kode diatas adalah Pertama dia akan ngebuat variabel A (tipe data int) dengan nilai awal = 0, nah dibagian ini cuma dijalanin atau dibuat sekali doang. Kedua dia meriksa apakah A (awalnya dikasih nilai 0) lebih kecil dari 5? Kalau yah maka pengulangan terjadi dan masuk ke tubuh pengulangan yang ada fungsi 'printf()'-nya, tau kan fungsi printf() kalau belum lihat posting sebelumnya.

Selanjutnya ngapain setelah pernyataan dijalankan? Kita masuk ke proses 'inisialisasi kembali' yaitu pada bagian A++. Buat apaan sih A++? buat naikin nilai sih A sebanyak 1, karena si A bilangan bulat jadi kalau sih A nilai 0 maka naik 1 jadi 1. Bisa juga seperti ini 'A += 5' itu berarti A ditambah 5 beda loh sama 'A = +5', kalau yang ini A sama dengan +5 (ples lima). Nah proses penambahan ini biasa disebut increment sedangkan pengurangan disebut decrement ( Zzz. kayanya bukan istilah de.. tapi nerjemahin bahasa Indonesia ke Inggris, masa bodoh ah.. ^_^ ).

"Tujuannya buat apa sih ditambah gitu?", Ini karena pengulangan baru berhenti kalau si A lebih besar atau sama dengan 5. Tapi pengulangan terus berjalan selama A < 5. Pada bagian ketiga ('inisialisasi kembali') bisa saja tidak ditulis tapi ditulis didalam tubuh for-nya ( kecuali emang ingin bikin hang komputernya @_@ ), sehingga bentuk kodenya jadi seperti pada bentuk for dengan variabel B (lihat posting sebelumnya).

"Kalau break itu fungsinya?", break berfungsi untuk keluar dari pengulangan juga. Kalau main tulis break tanpa kondisi tertentu, yah pengulangan bakal langsung keluar (lihat bentuk for dengan variabel C). Misal ada kode berikut:


...
for( int A = 0;A < 5;A++){
printf("A = %d\n",A);
break; //kode 1
}

for( int A = 0;A < 5;A++){
break; //kode 2
printf("A = %d\n",A);
}
...


Kalau yang kode 1 printf()-nya dijalanin dulu, tapi kalau kode 2 langsung keluar dari pengulangan, nah ini yang disebut algoritma kalau emang mau nampilin output dulu dengan fungsi printf().

Selain for, pengulangan di C++ juga ada 2 lagi (jadi totalnya 3), yaitu while dan do-while. Kedua bentuk lainnya punya kelebihan dan kelemahan. Contoh kalau for untuk pengulangan yang jumlah pengulangannya sudah diketahui sedangkan while dan do-while belum diketahui. Kalau mau lebih lengkap cari aja di google ;) hehehehe. Tapi tenang (tenang melulu dari setadi) source code dibawah ini aku sertakan pengulangan dengan bentuk while kalau do-while cari aja yah >.<.

Kalau bingung nih ada link untuk download source code-nya... sizenya cuma 109 KB.

- krofz

Friday, 24 July 2009

Melatih Jurus Kedua (1)

Setelah kita menguasai jurus 'if', sekarang kita akan belajar jurus baru yaitu namanya 'for'.

Wattau..!!!

For yang kalau diartikan 'untuk' ini adalah sebuah pengulangan (loop). Pengulangan berfungsi untuk menyederhanakan kode kita agar dilihatnya nggak panjang/ banyak baris kode (siapa bilang banyak baris kode bagus?!) dan memperkecil ukuran source code (kode sumber, itu loh file yang berisi kode2-nya). Jadi intinya penggunaan 'for' berfungsi untuk membuat program se-efisien mungkin.

Bentuk umum pengulangan for:
...
for( inisialisasi; kondisi; inisialisasi_kembali){
...
}
...


  1. Inisialisasi, berfungsi sebagai awal proses pengulangan. Biasanya diisi dengan membuat variabel sebagai penanda pengulangan telah sampai dimana. Tapi bisa juga tidak diisi.

  2. Kondisi, berfungsi sebagai pemeriksaan diakhir pengulangan, jika kondisinya sudah tidak terpenuhi lagi maka pengulangan akan selesai. Ini merupakan bagian terpenting karena kalau salah membuatnya maka akan terjadi 'infinitive loop' atau pengulangan tanpa akhir (bisa-bisa nge-hang komputernya >_<).

  3. Inisialisasi kembali, berfungsi untuk inisialisasi kembali, wew.. kata-katanya diulang-ulang.. ~_~ , tapi maksudnya yah itu.



Bingung dengan penjelasan diatas? nggak perlu pusing-pusing mikirin apalagi sampe ngingetin semaleman ( apa coba, hehehe.. ^_^ ). Yang pentingkan mengerti pola dan kegunaannya beres kan?!.

Sehingga kalau nanti ketemu kode seperti berikut:


...
#include < stdio.h >

int main(){
for( int A = 0;A < 5;A++){
printf("A = %d\n",A);
}
printf("\n\n");

int B;
for(B=0;B < 5;){
printf("B = %d\n",B);
B++;
}
printf("\n\n");

int C=5;
for(;;C--){
char D=45+C;
printf("C = %d, dan D = %c\n",C,D);
if(C < 1){
break;
}
}
printf("\n\n");

return 0;
}
...

Err.. moga- moga kodenya kebaca.. heheh. soalnya ngk tau caranya bikin spasi/hirarki kode @_@ ( itu loh jarak isi kode). Ok, setelah penjelasan diatas maka kita tidak perlu cemas, dan gelisah hehehe.. karena sudah mengerti dasarnya ^^.

"Hmm... printf itu fungsinya untuk apa yah?", printf berfungsi sama seperti halnya 'cout', printf merupakan fungsi dari library bahasa C (kakaknya C++). Dan penggunaannya harus mengikuti pola tertentu. Misal untuk menampilkan variabel bertipe int menggunakan '%d', untuk char '%c', dan string '%s', Ribet deh.. ^^ .

Ntar kita lanjutin pembahasannya...

Friday, 10 July 2009

Melatih Jurus Dasar Pertama

Untuk mewujudkan impian yang akan kita capai, *dengan diiringi musik pembawa semangat jeng... jeng.. jeng... se ilah*

yaitu membuat game dengan menggunakan bahasa pemrograman C++ kita harus menguasai terlebih dahulu beberapa jurus / kata kunci (keyword) yang umum digunakan, diantaranya 'if' dan 'for'. Tapi saat ini kita latihan 'if' terlebih dahulu.

Jurus pertama ciat!!...
if atau kalau diartikan 'jika', merupakan suatu percabangan. Percabangan yang dimaksud adalah Proses menjalankan statement / pernyataan berdasarkan kondisi tertentu. Sederhanakan? he..he..he.. Misal ada kode seperti berikut:


...
int nilaiBudi = 80;
if( nilaiBudi > 80){
std::cout<<"Budi Lulus Ujian";
}
else {
std::cout<<"Budi gagal Lulus Ujian";
}
...


Kode diatas berarti memeriksa variabel " nilaiBudi " apakah lebih besar ('>') dari 80, Jika iya maka akan tampil keluaran (output) berupa kalimat "Budi Lulus Ujian". Tapi kalau nilainya lebih kecil atau sama dengan 80 maka akan tampil output kedua yaitu kalimat "Budi gagal Lulus Ujian", wah sadis juga nih ujian mesti diatas 80 :D. Hasil yang akan diperoleh adalah kalimat Budi gagal Lulus Ujian, Kenapa? karena nilai budi harus lebih besar dari 80, misalnya 81, 82, dst.

"Bagaimana kalau nilai Budi 80 tapi tetap lulus? Apakah ditulis: if(nilaiBudi>79)?", bisa saja tapi lebih baik menggunakan operator ">=" yang berarti "Lebih besar atau sama dengan", ini contoh kodenya:

...
if( nilaiBudi >= 80){
...
}
...


"Kalau kode nya begini: if( nilaiBudi == 80){ ... }, apa yang terjadi?", ini berarti nilaiBudi harus benar-benar 80 tidak boleh kurang atau lebih jika ingin menjalankan statement yang ada dalam if.

"Ngomong-ngomong else itu apa yah?", else (indonesia: lain/selain) yaitu pernyataan jika kondisi / persyaratan-nya tidak terpenuhi.

"Kalau ada kode seperti berikut bagaimana?"

...
//memeriksa nilai Budi
if( nilai >= 80){
std::cout<<"Budi Lulus, terus dikasih Laptop";
}
else if( nilai >= 70){
std::cout<<"Budi Lulus, terus dikasih HP";
}
else if( nilai >= 50){
std::cout<<"Budi Lulus, terus dikasih Es Krim";
}
else if( nilai >= 30){
std::cout<<"Budi tetap lulus, karena ujiannya ngk sadis";
}
else{
std::cout<<"Budi gagal Lulus";
}
...


Kalau pada else tidak perlu ada kondisi / persyaratan untuk menjalankan pernyataan didalamnya jika if sebelumnya tidak terpenuhi. Sedangkan " else if " persyaratannya harus terpenuhi terlebih dahulu. Agar program kita menjadi lebih dimanis, artinya variabel nilai Budi tak selalu itu-itu aja nilainya ketika program dijalankan maka kita perlu menambahkan fungsi yang berguna untuk meminta input (masukkan) kepada user. Berikut ini contoh kodenya:

...
int nilai = 0; //nilai Ujian Budi
std::cout<<"Masukkan Nilai Budi : ";
std::cin>>nilai;

//selanjutnya memeriksa nilai Budi
if( nilai >100){
std::cout<<"Batas Nilai Ujiannya cuma sampai 100 bro";
}
else if( nilai >= 80){
std::cout<<"Budi Lulus, terus dikasih Laptop";
}
else if( nilai >= 70){
std::cout<<"Budi Lulus, terus dikasih HP";
}
else if( nilai >= 50){
std::cout<<"Budi Lulus, terus dikasih Es Krim";
}
else if( nilai >= 30){
std::cout<<"Budi tetap lulus, karena ujiannya ngk sadis";
}
else{
std::cout<<"Budi gagal Lulus";
}
...


"Bagaimana kalau kondisi-nya ada dua? Seperti nilai pertama harus diatas atau sama dengan 80 dan nilai kedua diatas / sama dengan70?", Disini kita memerlukan dua variabel untuk melakukannya dan menggunakan operator tambahan " && ". Berikut contohnya:

...
int nilaiPertama = 0, nilaiKedua = 0;
std::cout<<"Masukkan Nilai Pertama Budi : ";
std::cin>>nilaiPertama;

std::cout<<"Masukkan Nilai Kedua Budi : ";
std::cin>>nilaiKedua;

char *kalimat="";
if( !(nilaiPertama >=80 && nilaiKedua >= 70)){
kalimat = "Tidak";
}
std::cout<<"Budi "<<kalimat<<" Lulus";
...


"Wah char-nya kok ada tanda bintang (*)?", sebentar kita flashback hehehe... sebelumnya char hanya dapat menampung satu huruf / karakter (misal 'a', 'd', '1', dst) dengan * berarti variabel tersebut akan menempati memori secara dinamis (sesuai jumlah memori yang kosong) sehingga dapat menampung lebih banyak karakter yang akan membentuk kata / kalimat.

"Terus tanda seru (!) itu fungsi-nya apaan yah?", tanda seru itu berarti negasi dari pernyataan "(nilaiPertama >=80 && nilaiKedua >= 70)".

"Negasi itu apaan yah?", negasi merupakan istilah dalam logika matematika yang berarti ingkaran (itu loh lagu anak-anak, "Ingkaran besar.. ingkaran besar.. ingkaran kecil.." itu Lingkaran!) atau lawannya dari suatu pernyataan dilambangkan dengan ~. Istilah-istilah umum lainnya dalam logika matematika, yaitu Dan (^), Atau (V), Implikasi (->), dsb.

"Pernyataan? Yang mana sih?", kondisi " nilaiPertama >=80 " sebetulnya adalah sebuah pernyataan juga *dengan nada sok tau*, tidak hanya yang diakhiri titik koma (;). Jika "nilaiPertama >=80" adalah p, dan "nilaiKedua >= 70" adalah q maka logika matematikanya akan seperti ini " ~(p^q) ". Apa yang akan terjadi selanjutnya? Jika nilai pertama kurang dari 80 maka p = false karena bernilai salah, nilai dari p^q jika p false adalah false.

"Kok bisa bergitu?", ini sesuai dengan tabel kebenaran! (se ilah..) berikut tabel kebenarannya ( B/Benar mewakili True dan S/Salah mewakili False) :



























p
q
p^q
B
B
B
B
S
S
S
B
S
S
S
S


Dari tabel tersebut dapat disimpulkan bahwa dua pernyataan yang sedang dibanding dengan operator Dan (&& atau ^) harus sama-sama bernilai true. Kita kembali lagi ke kode "if( !(nilaiPertama >=80 && nilaiKedua >= 70))" jika kedua nilai tersebut memenuhi syarat maka akan dilakukan ingkaran / negasi-nya. Sehingga yang terjadi adalah nilai kondisinya false dan penambahan kata "Tidak" tidak (dibacanya aneh ngk? --' ) dimasukkan ke dalam variabel char.

Kalau masih kurang jelas dengan kode diatas silahkan download file melalui link ini, sizenya 129 KB. Mohon maaf kalau ada kesalahan dalam penulisan ^_^ .

- krofz

Sunday, 5 July 2009

IDE adalah Persiapan Sebelum Berperang

(Update : 7 Juli 2009)

Ini adalah tulisan pertamaku dalam blog ini tapi bukan yang terakhir lho.. :)

Ok, kita mulai aja seperti judul pada blog ini yaitu "Membuat Game Dengan C++" itu berarti kita akan menyentuh bagian programming dalam proses pembuatan game. Kenapa C++? Karena C++ adalah salah satu bahasa pemrograman (inggis:programming) yang sangat powerfull sama seperti Basic, Python, dll. Jika banyak bilang pemrograman itu sulit mungkin mereka belum merasakannya dari awal. Karena jika kita sudah mengerti dasarnya dan dapat membuat sebuah game mini dijamin bakal "Nagih!". Tujuan dari blog ini (mudah-mudah kesampean :D doain yah) adalah membuat sebuah game-game sederhana (niatnya sih game RTS/Real Time Strategy *siul-siul*) dengan tutorial-tutorial yang moga-moga dapat dimengerti dan dipahami hehehe.., maklum aku termasuk orang yang sulit menyampaikan maksud dan tujuan dari suatu hal (lah malah curhat @_@ ).

Persiapan
"Apa yang harus saya lakukan pertama kali?", mungkin itu pertanyaan pertama Anda jika baru ingin mengenal pemrograman. Yang harus dilakukan adalah mempunyai IDE (Integrated Development Environment, bahasa Indonesianya "Lingkungan Pengembangan Terpadu") bukan IDE pada kabel data Harddisk. IDE adalah semacam program yang dapat membantu kita membuat program, banyak yang menyebutnya sebagai compiler tapi IDE lebih kompleks karena memiliki Editor, Compiler, Linker, dan Debugger yang memiliki fungsi masing-masing (lebih lengkapnya lihat "IDE - Wikipedia").

Di situ mungkin banyak pilihan IDE untuk C++ (lihat IDE C++ di Wikipedia) yang tersedia, tapi disini penulis akan menggunakan Code::Blocks (versi 8.02) sebagai IDE-nya, karena bersifat opensource (Gratis!) mungkin hahaha.. :D .












[ GAMBAR ]

Sebelumnya penulis menggunakan Dev-C++ tapi kayanya IDE tersebut sudah berhenti dikembangkan (*sambil ngecek situs resminya*). Ok, sudah download Code::Blocks-nya? Ini linknya jika belum, http://www.codeblocks.org/downloads/ silahkan di-install seperti biasa karena prosesnya sangat mudah tinggal Next-Next-Next!... dengan beberapa opsi yang dapat diatur Lalu jalankan program tersebut.

hmm... hmm.... Bingung selanjutnya mau ngapain setelah program dijalankan? mungkin Anda bisa download materi-materi di-Internet tentang C++ melalui Goggle. Dan mungkin blog ini tidak terlalu menjelaskan secara detail teori-nya (mungkin karena yang nulis kurang paham :p ? tapi untung praktiknya bagus ;D ). Sebagai awal kita dengan C++ dan IDE Code::Blocks kita akan mencoba langkah-langkah berikut:

1. Buka program Code::Blocks, pilih File > New > File... akan terdapat tiga pilihan, yaitu file C/C++ Header, C/C++ Source, dan Empty File.


[ GAMBAR ]


2. Pilih C/C++ Source ketika muncul dialog wizard pilih C++ lalu masukkan path ( lokasi file ) kalau bingung nulis path-nya tekan objek kotak dengan gambar titik-titik (semacam Browse) untuk memudahkan penyimpanan dan jangan lupa menuliskan nama file C++-nya plus nama extensinya (.cpp). Dalam contoh ini penulis menyimpannya di My Document, contoh: C:\Documents and Settings\%username%\My Documents\namafile.cpp


[ GAMBAR ]


3. Setelah itu masukkan kode berikut: (sebaiknya dalam menulis setiap kode jangan terbiasa melakukan "Copy-Paste" jika belum hafal :D )


#include <iostream>

// tanda garis miring dua ini adalah sebuah
// komentar yang hanya dapat ditulis 1 baris

/*
Jika ingin dua baris atau lebih tanpa membuat garis
miring lagi dapat menggunakan tanda /* sebagai awal
dan diakhiri dengan tanda berikut */

// komentar tidak akan dikompilasi oleh compiler
int main(){

//membuat variabel dengan tipe data int dan nama "angka"
//data yang dapat ditampung berupa bilangan bulat
//baik positif maupun negatif seperti 100, 50, -25, -50


int angka;
angka = 10;
std::cout<<"Nilai Angka = "<<angka<<"\n\n";

//membuat variabel dengan tipe data char dan "nama karakter"
//data yang dapat ditampung berupa huruf 'a', 'b', 'c'
//atau karakter lainnya.
char karakter;
std::cin>>karakter;

//mengembalikan dengan angka 0, sistem akan
//merespon bahwa program tidak mengalami masalah
return 0;
}



4. Selanjutnya kita akan melakukan kompilasi (compile) atau proses membangun (build), dengan memilih menubar Build > Build and Run atau dapat menekan F9. Pilihan ini berfungsi agar program kita diterjemahkan kedalam kode biner lalu menjalankan pada saat selesai di-bangun (build).

[ GAMBAR ]

5. Hasil yang akan diperoleh saat program dijalankan:

[ GAMBAR ]

Penjelasan Singkat :

#include <iostream>, berarti source kode akan memanggil / menyertakan file bernama iostream. " Iostream apaan tuh? " iostream adalah file dengan ekstensi .h (iostream.h)/ header yang berisi fungsi-fungsi penting dalam urusan input output stream (makanya disingkat iostream). " Kenapa tidak ditulis #include <iostream.h> dengan menambahkan ekstensi .h?
", ini karena iostream merupakan salah satu Standar Library dalam C++. Jadi semua library / file header standar dalam C++ tidak perlu menambahkan akhiran .h.

" Dalam kode tersebut fungsi yang bagaimana yang terdapat dalam iostream? ", fungsi yang terdapat dalam namespace std, yaitu cout dan cin. Cout (baca-nya C-out) untuk proses output dan Cin (baca-nya C-in) untuk proses Input.

Selanjutnya yang dimaksud dengan int main() adalah sebuah fungsi dengan tipe data int, dalam sebuah kode C/C++ kita harus membuat fungsi ini sebagai induk dari fungsi-fungsi lainnya. Dalam C++ modern kita harus menuliskan fungsi utama ini dengan tipe data int agar sistem menangani program dengan baik

"Lho bedanya int namaVariabel; dengan int namaVariabel(){} yang ada tanda kurung ("()") dan bracket ("{}") apaan yah?" Ok, ok... kalau pada int namaVariabel yang diakhiri tanda titik koma (;) itu berarti suatu statement/pernyataan. Dalam C++ setiap pernyataan harus
diakhiri dengan ';' berbeda dengan Visual Basic jika Anda pernah melihat kode Visual Basic. Sedangkan pada int namaVariabel(){} itu berarti membuat sebuah fungsi dengan nama "namaVariabel" dan tipe data "int" dan tidak memiliki argumen.

"Tidak memiliki argumen? Maksudnya?", argumen pada fungsi berfungsi agar memproses data dengan nilai-nilai tertentu. "Argumen yang mana sih?", argumen itu yang berada dalam tanda kurung ("()"), contoh fungsi yang memiliki argumen:
...
int perkalian(int a, int b){
return a*b;
}
...

"Fungsi diatas buat apaan tuh?", fungsi tersebut akan mengalikan variabel a dan variabel b dengan bantuan operator '*', karena fungsi perkalian memilki tipe data int (bilangan bulat) maka fungsi/variabel tersebut dapat menyimpan data berupa bilangan bulat, dan penggunaan return dapat digunakan. 'return' berfungsi sebagai nilai kembalian (bukan habis belanja ... :p ).

"Memang ada fungsi tanpa nilai kembalian?", ada contohnya fungsi berikut:
...
void hanyaNampilinAngka(int a){
std::cout<<a<<" + "<<a<<" = "<<a+a;
}
...


OK, kita lanjutkan dengan kode berikut:
...
char kar;
std::cin>>kar;
...


berfungsi agar program meminta masukkan (input) ke pada user yang menjalankan program tersebut. Tujuan dari masukkan agar program tidak langsung menutup karena jika baris kode masukkan tersebut dihapus program hanya menampilkan keluaran (output) dan langsung menutup dikarenakan tugas program hanya untuk menampilkan keluaran kepada user dan tak ada statement apapun untuk menunggu program ditampilkan dilayar.

Kalau kurang jelas mengenai kodenya dapat didownload melalui link ini, sizenya cuma 136 KB kok hehehe. Tapi itu tidak termasuk IDE Code::Blocks.

Fiuh.... Panjang juga... hehehe... hari ini mungkin cukup di sini dulu... kita kendurkan dulu otot-otot yang tegang dan saatnya istirahat... karena istirahat juga bagian dari suatu latihan... *hoamm.. ngatuk, tidur dulu sebentar*

- krofz

 

back to top

back to top