Tuesday, 10 December 2013

Kunci Jawaban Tebak Gambar (Android) Level 8 dan 9



Berikut ini kunci jawaban game Tebak Gambar Level 8 dan 9. Saya hanya menulis 6 jawaban (level 8), 2 gambar clue (level 8), dan 8 jawaban (level 9) untuk intensitas soal yang sulit dan tidak termasuk pertanyaan terakhir :

Dengan tidak mengurangi kenikmatan saat bermain, pergunakan kunci jawaban berikut ketika anda sudah benar-benar stres hehehe  !

Level 8.
- Keset Rumah
- Aborsi Langsung
- Semesta Abadi
- Tendang Selangkangan
- Harga Lontong
- Patroli Gabungan

2 gambar jawaban berbentuk clue :


Gambar 1. S _ _ _ _ G - P _ _ _ _ _ N


Gambar 2. J _ _ _ A - G _ _ _ T


Level 9.
- Kurang Garam
- Energi Gitaris
- Kebelet Pipis
- Perempuan Tinggi
- Isu Pengasingan
- Suara Ketapel
- Pelumas Kereta
- Pemicu Acara


- krofz

Friday, 29 November 2013

SDL Tebak Gambar v0.0.9




Tulisan ini bagian dari:
(SDL) Tebak Gambar! (Part I)


Disini saya cuma mau share hasil programnya saja , tetapi tidak berikut source codenya. Silahkan di download :

Link : http://www.mediafire.com/download/hui8fg9dnqd9vw6/SDL+Tebak+Gambar+v0.0.9.7z
Ukuran : 2.89 MB

Program ini masih terus dikembangkan terutama penambahan jumlah soalnya. Pada artikel selanjutnya saya akan buatkan tutorial cara pembuatannya. Akhir kata semoga terhibur!

- krofz

Monday, 11 November 2013

Kunci Jawaban Tebak Gambar (Android) Level 6 dan 7



Ternyata sudah keluar level terbarunya . Berikut ini kunci jawaban game Tebak Gambar Level 6 dan 7. Saya hanya menulis 8 jawaban (urutan acak) untuk setiap levelnya dengan intensitas soal yang sulit dan tidak termasuk pertanyaan terakhir :

Dengan tidak mengurangi kenikmatan saat bermain, pergunakan kunci jawaban berikut ketika anda sudah benar-benar stres hehehe  !

Level 6.
- Kolak Pisang
- Gembok Rumah
- Kertas Hias
- Bau Tanah
- Dua Anak
- Rumput Liar
- Nafas Cinta
- Gulali Matang


Level 7.
- Bunga Sakura
- Keselamatan Presiden
- Sedot Upil
- Ruang Karaoke
- Panjang Karet
- Malam Kelabu
- Baling Pesawat
- Solidaritas Buruh


- krofz

Wednesday, 30 October 2013

Tebak Gambar game Android


Screenshot menu utama game Tebak Gambar (Android) download version 1.0.1
Official Website : http://tebakgambar.com/

Well, beberapa hari ini mungkin ada pengunjung yang mencari beberapa jawaban mengenai game Tebak Gambar (Android) melalui Google atau mesin pencari lainnya. Dan menemukan blog ini dengan kata kunci pencarian yang mirip hahaha, yaitu "Tebak Gambar". Setelah di klik berharap dapat kunci jawaban eh malah dialihkan ke artikel berikut http://membuatgamedengancpp.blogspot.com/2013/07/sdl-tebak-gambar-part-i.html .

Karena penasaran saya juga ingin mencoba game tersebut. Setelah dicoba memang menarik, menguji imanijasi dan kreatifitas kita. Untuk kunci jawabannya sendiri sulit dibagikan karena kemungkinan beberapa urutan soalnya akan diacak sesuai tingkatan (level) atau ada beberapa soal yang berubah terutama saat penambahan versi program. Yang perlu diperhatikan saat bermain game ini adalah beberapa kata harus baku, contoh "Tai" menjadi "Tahi", lalu "Duit" menjadi "Uang". Untuk setiap levelnya kita diberikan sebuah opsi bantuan sebanyak tiga kali (dilambangkan dengan bintang lima). Beberapa soal memang kadang cukup sulit tergantung daya imanijasi anda, sehingga perlu klik tombol bantuan

Beberapa stage mungkin agak sulit tergantung imajinasi anda @_@

Tips dari saya jika anda memang kesulitan mencari jawaban pada stage di level tertentu, sebisa mungkin saat bermain tidak menggunakan bantuan untuk dipergunakan di stage yang benar-benar sulit. Tetapi jika bantuan sudah habis terpaksa meminta bantuan teman atau terus mencoba beberapa kombinasi kata walaupun resikonya akan kedepak ke awal stage jika salah dan nyawa dalam permainan habis. Tapi setidaknya anda sudah tahu jawaban setiap stage yang sudah dilewati saat memulai dari awal, hahahaha . Selamat bermain!

- krofz

Friday, 25 October 2013

Deret Angka berbentuk Spiral



Kali ini kita akan mencoba membuat deret angka berbentuk spiral. Pertama-tama kita lihat deret angka berikut :
Gambar 1. Deret angka, dengan lebar = 5 dan tinggi = 5

Deret sederhana diatas dapat dibentuk dengan menggunakan for loop bercabang atau hanya loop biasa, berikut contoh codenya :
    
    ...
    // untuk MaxA = Tinggi, dan MaxB = Lebar 
    // loop bercabang
    for(int i=0;i < maxA;i++){
        for(int j=0;j < maxB;j++){
            std::cout << std::setw(2) << std::setfill(' ') << (i*maxA)+j+1 << " ";
        }
        std::cout << "\n";
    }
    std::cout << "\n\n";

    // loop biasa
    for(int i=0;i < (maxA*maxB);i++){
        std::cout << std::setw(2) << std::setfill(' ') << i+1 << " ";
        if( (i+1)%maxA == 0 ) std::cout << "\n";
    }
    /*
    output :
    input 5 x 5
    1  2  3  4  5
    6  7  8  9  10
    11 12 13 14 15
    .... dst
    */
    ...

Seperti judul artikel ini, kita akan membuat deret angkat tersebut menjadi Spiral sehingga terlihat seperti gambar berikut :

Gambar 2. Deret angka berbentuk Spiral

Sayangnya saya belum bisa membuat dengan 1 for loop atau bercabang tanpa bantuan array dan beberapa variabel lainnya . Berikut ini variabel yang digunakan :
  
    ...  
    int lastX = maxX-1, lastY = maxY-1, minX = 0, minY = 1;
    int curX = 0, curY = 0;

    const int KANAN = 0, BAWAH = 1, KIRI = 2, ATAS = 3;
    int arah = KANAN;
    int mySpiral[maxY][maxX];
    ...

Cukup banyak variabel yang diperlukan hehehe . Logicnya sederhana, pertama siapkan array 2 dimensi yang akan menampung deret spiral kita (array MySpiral). Variabel arah yang akan membantu kita dalam mengisi array Spiral sesuai arah yang ditentukan. Lalu pertanyaanya bagaimana membuat arah ini sesuai dengan yang diharapkan? Contoh dimensi 3 x 3 :
  .
     1  2  3
     8  9  4
     7  6  5
  .
Kita akan mengisi nilai array spiral dengan menggunakan "for loop" dari 0 sampai (Tinggi*Lebar). Dengan menggunakan koordinat dari CurX (current X) dan CurY (current Y). Urutan koordinat yang harus diisi dimulai dari titik 0 untuk x dan y sesuai indeks awal array yaitu nol. Jadi dari kiri ke kanan adalah (0,0), (1,0), (2,0). Lalu saat mentok kanan (sama dengan lebar dikurang 1) arah berubah menjadi ke bawah, (2,0), (2,1), (2,2) mentok pada tinggi dikurang 1. Lalu ke kiri dan seterus sesuai arah yang telah ditentukan. Jika dilihat dari pola 3 x 3 diatas, jika saat proses arah ke atas dari (0,2),(0,1),(0,0) maka akan mengacaukan pola spiral. Jika perhitungan sampai mentok keatas, karena nilai (0,0) telah terisi, ini juga berlaku untuk dimensi 4x4 , 5x5 dst yang akan membentuk pola bingkai atau mengisi sekeliling array.

Untuk itu kita gunakan variabel lastX, lastY, minX, dan minY dengan nilai "int lastX = Lebar-1, lastY = Tinggi-1, minX = 0, minY = 1;", sebagai pembatas agar pola dapat tercipta. Bagaimana variabel tersebut bekerja? lastX dimaksudkan untuk batas kanan atau posisi terakhir koordinat X, lalu lastY adalah batas bawah, minX adalah batas kiri, dan minY adalah batas atas. Contoh spiral 4x4:
  
    .
     1  2  3  4 
    12 13 14  5
    11 16 15  6
    10  9  8  7

     1  2  3  4 < --- lastX dengan nilai pertama
    12 13 14  < --- lastX dengan nilai kedua
    11 16 15  6
    10  9  8  7
    .
Saat posisi X saat ini (CurX) mencapai lastX pertama yaitu maxX (Lebar) dikurang 1 (untuk menyesuaikan indeks array yang dimulai dengan nol), yaitu maxX = 3 maka selain arah dirubah, nilai LastX juga dikurangi 1. Ini juga berlaku untuk lastY, minX, dan minY, setelah perubahan array, dirubah juga nilai pembatasnya. Terus berulang sampai pengulangan selesai. Berikut ini kode pengulangannya:
    
    ...    
    for(int i=0;i < (maxY*maxX);i++){
        mySpiral[curY][curX] = i+1;

        switch( arah)
        {
            case KANAN:
                if( curX < lastX){
                    curX++;
                }else{
                    arah = BAWAH;
                    curY++;
                    lastX--;
                } break;
            case KIRI:
                if( curX > minX){
                    curX--;
                }else{
                    arah = ATAS;
                    curY--;
                    minX++;
                } break;

            case ATAS:
                if( curY > minY){
                    curY--;
                }else{
                    arah = KANAN;
                    curX++;
                    minY++;
                } break;

            case BAWAH:
                if( curY < lastY){
                    curY++;
                }else{
                    arah = KIRI;
                    curX--;
                    lastY--;
                } break;
            default:;
        }
    }
    ...
Akhirnya proses pembuatan spiral selesai! . Untuk proses input dan output silahkan ditambahkan sendiri . Salah satu contoh game yang menggunakan proses ini adalah Bomberman dimana saat terjadi Sudden Death. Yaitu saat waktu permainan berakhir dan masih saling bertarung, muncul kotak-kotak batu besar yang muncul dari atas dan jatuh secara Spiral! :
Gambar 3. Sudden Death pada Bomberman ( Courtesy of Youtube, Channel : BrezenMafiaJoe, link video : http://www.youtube.com/watch?v=c7VOfJuVNT8 )



- Krofz

Monday, 16 September 2013

Rumus Sakti Grayscale untuk RGB


Gambar grayscale adalah gambar yang memiliki warna piksel pada rentang gradasi hitam dan putih, jadi bukan cuma hitam (pekat) dan putih (pekat) saja. Dengan menggunakan rumus sakti berikut warna RGB dapat mudah dijadikan grayscale dengan mudah :

Warna RGB Normal

  • Menggambil nilai rata-rata dari warna RGB lalu letakkan masing-masing dengan hasil yang didapat. Contoh R=150,G=20,B=50, maka Y = (150 + 20 + 50) / 3. Lalu kita letakkan variabel Y pada warna R, G, dan B sehingga hasilnya seperti berikut :

    Warna Grayscale dengan metode rata-rata (Average)

  • Selain nilai rata-rata seperti diatas, ada juga rumus yang lebih sakti , yaitu menggalikan nilai R dengan 0.2126 (nol koma dua sekian) , G dengan 0.7152 (nol koma tujuh sekian), dan B dengan 0.0722 (nol koma nol tujuh sekian). Sehingga dirumuskan menjadi Y = (R*0.2126) + (G*0.7152) + (B*0.0722) . Terakhir letakkan nilai tersebut ke variabel R,G, dan B. Sehingga akan tampak seperti gambar berikut:

    Grayscale dengan metode Luminosity
Untuk programnya menyusul.

- krofz

Friday, 13 September 2013

Pathfinding, agar tidak Kesasar


Ada banyak algoritma untuk pencarian jalur tercepat. Pencarian jalus alias Pathfinding bukan hanya sekedar mencari jalur tercepat tapi juga jalur yang dapat dilalui. Jika kita hanya berdasarkan pengecekkan biasa seperti jika koordinat X kotak A, lebih kecil dari koordinat X kotak B maka koordinat X kotak A, akan ditambah untuk mencapai target tujuan. Permasalahannya muncul jika ada sebuah penghalang seperti tembok, maka kotak A tidak akan pernah mencapai kotak B, kecuali ada yang ngangkut .

Karena saya juga dalam tahap belajar sehingga masih perlu belajar untuk struktur data pada pemetaan Node. Sejauh ini saya cukup menggunakan beberapa tipe data bentukan seperti berikut:

//Koordinat struct Koor { int X,Y; }; //Node atau Tile struct Node { int tekstur; int biaya; bool Bebas; }; struktur Koor untuk menyimpan koordinat (X,Y) , untuk keperluan jalur yang harus dilalui, misal dari A ke B, melalui koordinat (0,1), (0,2), (1,2), dst. Jika ditambah dengan kombinasi std::vector<Koor> myTrack dijamin rekaman untuk jalur yang harus dilalui makin sip! . Sedangkan Node untuk membuat peta, tekstur merupakan informasi warna atau gambar yang akan ditampilkan dan juga sebagai penanda apakah path ini adalah penghalang (contoh tembok) atau bukan, biaya adalah berapa banyak biaya untuk mencapai Node atau titik tersebut. Sedangkan variabel bebas sebagai penanda apakah Node (simpul) ini sudah diperiksa atau belum, ini berguna pada Algoritma yang akan digunakan nanti.


Ubin-ubin yang ditandai

Bisa dilihat pada gambar diatas (gambarnya ada kan? ) . Pada gambar diatas, kotak A dimulai dengan koordinat (0,0) atau pojok kiri atas menuju target, yaitu kotak B pada koordinat paling kanan bawah (yah pokoknya diujung kanan ) . Secara default kita beri biaya 9999 atau lebih yang dipenting diisi dengan nilai-nilai yang tidak bisa dilalui sebagai inisialiasi awal. Selanjutnya kita periksa setiap node dengan memberi nilai atau biaya yang diperlukan dari node tersebut ke kotak A (node start) dengan syarat node tersebut dapat dilalui lalu tandai bahwa node tersebut sudah diperiksa. Proses terus berlanjut sampai tidak ditemukan jalur yang bisa dilalui. Jika memang jalur target dapat dilalui, kita mulai menyimpan koordinat-koordinat yang diperlukan pada variabel tertentu, contoh variabel Track.

Berikut ini contoh aplikasi Pathfinding yang sudah saya kembangkan (binary only)
Link : http://www.mediafire.com/download/4j4rp4wc19vao8p/SDL_Map_PathFinding_DFS_04.7z (Size 600KB)
Intruksi penggunaan :
  • Tombol AWSD untuk mengerakkan kamera.
  • Tombol T agar kamera mengikuti kotak.
  • Tombol Panah Atas untuk menambahkan kotak yang mengikuti.
  • Tombol M untuk mengacak Map.
  • Tombol Escape atau klik Close Button untuk keluar dari program.

- Krofz

Tuesday, 27 August 2013

SDL versi 2!



Sebetulnya berita untuk versi kedua ini sudah lama keluar, dan seperti biasa saya selalu telat , hahaha xD . Pada versi 2 ini terdapat beberapa fitur yang ditambahkan :
  • Full 3D hardware acceleration
  • Support for OpenGL 3.0+ in various profiles (core, compatibility, debug, robust, etc)
  • Support for OpenGL ES
  • Support for multiple windows
  • Support for multiple displays
  • Support for multiple audio devices
  • Android and iOS support
dan masih banyak lagi !!!
Fitur selengkapnya : Source

Download link : SDL version 2.0.0

Benar-benar menarik! terutama untuk akselerasi hardware sehingga kita dapat membuat beberapa bentuk primitif seperti garis dan bentuk umum lainnya. Dan juga dukungan terhadap sistem Android dan iOS! wow!!. Sebelumnya saya juga sudah pernah membuat garis dengan bantuan SDL_gfx. Dan lingkaran , asik banget dah! hehehe. Berikut ini contoh tampilan aplikasinya :


Doain aja mudah-mudahan banyak tutorial yang dapat saya buat. Dan untuk beberapa tutorial yang masih belum kelar, dapat dikelarin juga #hammer . Happy Coding!

- krofz

Wednesday, 31 July 2013

(SDL) Tebak Gambar! (Part I)




Pilih Secara Bijak!


Kali ini kita akan membuat sebuah kuis Tebak Gambar. Gameplaynya sederhana program akan menampilkan pertanyaan diikuti oleh 4 buah kotak berisi gambar yang harus ditebak. Tema gambar yang saya gunakan adalah Fauna alias Hewan , tema ini tentu dapat anda ganti . Dan berikut ini daftar beberapa variabel serta objek class yang akan digunakan :

... // gX dan gY = posisi kursor mouse (X,Y) // gJawab , sudah berapa kali user menjawab pertanyaan // waktu , berapa banyak waktu (detik) yg sudah berjalan int gScore = 0, waktu = 0, gJawab = 0, gX = 0, gY = 0; SDL_Surface * gbrSinga = NULL; ... // dan beberapa surface SDL_Surface * gbrUnknown = NULL; struct sTanya { std::string Pertanyaan; std::vector Jawaban; }; class tombol { SDL_Rect kotak; SDL_Surface *gambar; int gbrKe; bool jawaban; public: tombol(int x, int y, int w, int h, SDL_Surface *gbr_, int bykGbr, bool jawab_); ~tombol(); bool proses(int x, int y); bool getJawaban(){ return jawaban; } //dst = destination, tOver = tombol over void tampil(SDL_Surface *dst, std::string teks = ""); }; ...

struct sTanya akan menyimpan kalimat pertanyaan dan juga jawaban. Penggunaan vektor pada integer jawaban dimaksudkan agar 1 pertanyaan dapat menyimpan lebih dari 1 jawaban terkait, contoh pertanyaan "Hewan pemakan daging", jawabannya "Singa", "Harimau", "Serigala", dst. Selanjutnya class utama program kita yaitu tombol. Pada kelas ini objek kotak hanya menyimpan alamat gambar (SDL_Surface *gambar), gambar ke berapa (int gbrKe), posisi gambar untuk ditampilkan (SDL_Rect kotak), dan benar atau salahnya jawaban (bool jawaban), dan beberapa fungsi penting. Selanjutnya kita akan membuat 4 buah objek tombol dengan 3 diantaranya memiliki jawaban yang salah, dan 1 yang benar. Kecuali anda ingin empat-empat-nya benar , itu lain cerita.

Agar program dapat leluasa untuk menambahkan atau merubah pertanyaan serta jawaban yang dibutuhkan kita perlu membuat pertanyaannya diluar program yaitu berupa file teks. Berikut ini format yang saya gunakan:

... Membantu penyerbukan bunga#Lebah Salah satu hewan Herbivora #Gajah#Kambing#Panda#Sapi ...

Sebelah kiri teks adalah pertanyaannya, lalu setelah menemukan tanda sharp ('#') maka kata selanjutnya sampai ketemu sharp lagi adalah jawaban yang akan ditampung. Dilanjutkan terus sampai bertemu new line ('\n') maka pindah ke pertanyaan selanjutnya. Setelah pertanyaan sudah diperoleh, dan ditampung oleh objek sTanya maka selanjutnya proses pengacakan pertanyaan mana yang akan ditampilkan dan pada posisi berapa (1-4 , sesuai banyaknya tombol). Agar tidak membosankan kita akan membuat beberapa tingkat kesulitan pertanyaan. Contoh setelah user menjawab 10 atau lebih pertanyaan Level 1 dengan nilai yang cukup tinggi, maka program akan otomatis terhenti untuk menampilkan skor sementara lalu dilanjutkan ke Level 2 atau seterusnya.

Kurang lebih alur program akan seperti ini, penambahan dan perbaikan mungkin menyusul hahaha. Selanjutnya kita akan mulai merangkai alur yang telah kita buat ini ke dalam kode-kode.

- Krofz

Monday, 10 June 2013

Program Sederhana untuk Replace String (Part III)



Tulisan ini merupakan lanjutan dari:
Program Sederhana untuk Replace String (Part I) - (Part II)


Kita coba kembangkan program sebelumnya dengan beberapa fungsi yang akan kita tambahkan berikut:
    1. Kondisi dan hasil pencarian dapat ditambahkan.
    2. Pemeriksaan bersifat non Sensitif , tidak membedakan huruf besar dan kecil.
    3. Membuat sebuah file untuk hasil replace.
    4. Menampilkan pesan kelasahan jika file tidak ada.
Perhatian! gunakan "using namespace std;" , jika beberapa fungsi dan objek yang digunakan tidak dikenal pada kode-kode di artikel ini. Untuk poin terakhir tambahkan kode berikut setelah memanggil file:

... if(PanggilFile == NULL){ cout<<"\nFile bermasalah atau tidak ada.\n"; PanggilFile.close(); //menutup program return 0; } ...

Agar array Kata (variabel dengan tipe data struct) bersifat dinamis, kita gunakan vector. Sehingga tampak seperti kode berikut:

... //bykKey = Banyaknya Key //const int bykKey = 5; //struct sReplace //{ // string Kondisi; // string Hasil; //} Kata[bykKey]; struct sReplace { string Kondisi; string Hasil; }; vector<sReplace>Kata; void initKata() { //mengunakan variabel sementara sReplace Kata_; Kata_.Kondisi = "satu"; Kata_.Hasil = "one"; Kata.push_back(Kata_); Kata_.Kondisi = "dua"; Kata_.Hasil = "two"; Kata.push_back(Kata_); Kata_.Kondisi = "tiga"; Kata_.Hasil = "three"; Kata.push_back(Kata_); Kata_.Kondisi = "Empat"; Kata_.Hasil = "four"; Kata.push_back(Kata_); Kata_.Kondisi = "lima"; Kata_.Hasil = "five"; Kata.push_back(Kata_); } ...

Dengan vector kita dapat leluasa menambahkan atau mengurangi, tanpa cemas untuk menentukan berapa jumlah memory yang akan dipakai. Untuk menambahkan objek sReplace(string Kondisi dan Hasil) kita menggunakan fungsi push_back. Kelima kata diatas hanya sebuah standar agar tidak kosong. Dibandingkan menambahkan kata yang dicari pada Source Code selanjutnya meng-kompilasi program, tentu lebih baik kita tanyakan saya kepada User-nya. Berikut ini potongan kode untuk meminta user menambahkan:

... char pilihan[1]; cout<<" Ingin menambahkan Kondisi dan Hasil? (y/Y = Yes) "; cin.getline(pilihan,2); if (pilihan[0]== 'y' || pilihan[0]=='Y'){ while (true){ sReplace rTemp_; string sKata; cout<<"Masukkan Kondisi : "; getline(cin,sKata); rTemp_.Kondisi = sKata; cout<<"Masukkan Hasil : "; getline(cin,sKata); rTemp_.Hasil = sKata; Kata.push_back(rTemp_); cout<<"Keluar? (q/Q = quit) "; cin.getline(pilihan,2); if(pilihan[0] == 'Q' || pilihan[0] =='q'){ break; } cout<<"\n"; } } cout<<"\n\n"; ...

Pengulangan akan berakhir dengan meng-input karakter q/Q. Setelah selesai menambahkan, selanjutnya program mencoba menanyakan apakah ingin pencarian bersifat Case Sensitive (membedakan huruf besar dan kecil)? . Dan program juga akan menanyakan apakah ingin menyimpan hasil replace kedalam file. Berikut potongan kodenya :

... bool bTulis = false, bSen = true; //bSen = boolean (Case) Sensitive if( PanggilFile != NULL) { cout<<"Tidak Case Sensitive? (y/Y = yes) : "; cin.getline(pilihan,2); switch(pilihan[0]){ case 'y': bSen = false; case 'Y': bSen = false; cout<<"** Program tidak Case Sensitive **"; break; default:; } cout<<"\n\nTulis file? (y/Y = yes) : "; cin.getline(pilihan,2); switch(pilihan[0]){ case 'y': bTulis = true; case 'Y': bTulis = true; cout<<"** Program akan menulis **"; break; default:; } cout<<"\n\n"; } string tempTulis = "replace_.txt" + (string)NamaF; ofstream tulisFile(tempTulis.c_str()); //akhir persiapan ...

Pengecekkan kedua string masih sama, tapi disini kita membuatnya sedikit rapi dengan menambah fungsi baru yaitu fungsi "cek" dan fungsi "hurufBesar": ... //fungsi pass by Value, agar nilai aslinya tidak berubah string hurufBesar(string str_) { string temp_; temp_ = ""; for(int d=0;d < str_.length();d++) { //membuat setiap karakter menjadi huruf besar temp_ += toupper(str_[d]); } return temp_; } //pass by Reference, CSen = Case Sensitive void cek(std::string &sTemp_, bool CSen_) { for(int d=0;d < Kata.size();d++){ if (CSen_){ if( sTemp_.compare(Kata[d].Kondisi) == 0){ sTemp_ = Kata[d].Hasil; d = Kata.size(); } } else{ if( hurufBesar(sTemp_).compare( hurufBesar(Kata[d].Kondisi)) == 0){ sTemp_ = Kata[d].Hasil; d = Kata.size(); } } } } ...

Pada fungsi cek terdapat 2 proses pengecekkan yaitu pengecekkan biasa, dan luar biasa! alias non case sensitive hehehehe. Dengan menggunakan toupper (pada fungsi HurufBesar) kita mengubah setiap karakter alphabet menjadi huruf besar. Tentu program ini jauh dari kata sempurna dan penampilannya masih minimalis tanpa ada basis GUI. Akhir kata semoga program ini bermanfaat! And Happy Coding

- Krofz

Monday, 3 June 2013

Code::Blocks 12.11 Telah Tiba!


Yup, Code::Blocks sudah sampai versi 12.11. Sebetulnya sudah dirilis Desember 2012 lalu. Dan sekarang sudah Juni 2013 hahahaha. Berikut ini link donlotnya:
Untuk fitur yang maksimal silahkan download dengan bundling MinGW , yaitu file codeblocks-12.11mingw-setup.exe , ukuran 96.8 MB. Seperti biasa pada versi terbarunya, logo-nya pun menggunakan yang terbaru:
Logo lama:

Gambar 1. Logo Code::Blocks versi a). 8.02, dan b). 10.05

dan berikut logo barunya!!
Sederhana tapi begitu eksotis , i like it! So, tunggu apalagi silahkan download dan update IDE mu!

- krofz

Wednesday, 22 May 2013

Program Sederhana untuk Replace String (Part II)



Tulisan ini merupakan lanjutan dari:
Program Sederhana untuk Replace String (Part I)


Setelah bahan dibutuhkan telah siap, saatnya kita memproses. Tambahkan kode berikut:

... using namespace std; int main() { ifstream PanggilFile; PanggilFile.open("ganti.txt", ifstream::in); char karakter = PanggilFile.get(); //string temporary string sTemp = ""; initKata(); //selama file berisi data, //pengulangan terus berlangsung while (PanggilFile.good()){ //mengolah string yg udah ditampung ketika ketemu karakter spasi atau enter if ( karakter == ' ' || karakter == '\n') { bool ada = false; for(int d=0;d < bykKey;d++){ if( sTemp.compare(Kata[d].Kondisi) == 0){ cout << Kata[d].Hasil; //mengakhiri looping d = bykKey; ada = true; } } if (!ada) cout << sTemp; sTemp = ""; cout << karakter; //spasi atau new line } else{ //menambahkan setiap karakter ke dalam string sTemp += karakter; } //mengambil perkata dalam file teks karakter=PanggilFile.get(); } cout << sTemp; PanggilFile.close(); return 0; }

Kita tampung setiap karakter yang akan kita ambil kedalam variabel karakter dengan menggunakan fungsi Get (PanggilFile.get() ). Lalu periksa jika karakter yang diambil bukan spasi atau new line (karakter untuk enter) maka kita tambahkan ke dalam string sementara yaitu sTemp. Jika menemukan karakter spasi atau new line , saatnya program memeriksa apakah string yang sudah ditampung itu ada dalam kumpulan kata yang telah kita buat. Pada proses looping kita mulai mencocokkan string Kondisi dengan sTemp dengan fungsi Compare. Jika cocok maka nilai return-nya adalah 0. Setelah menemukan kata-kata yang cocok maka ditampilkan hasil yang diinginkan, dan untuk optimasi program dibuat looping langsung berakhir setelah ketemu. Selanjutnya mereset nilai sTemp dan menampilkan karakter terakhir (spasi atau new line).

Sampai disini program masih sangat sederhana, dan pembandingan stringnya masih sangat Case Sensitive, yaitu "Dua" tidak sama dengan "dua". Masalah selanjutnya adalah string Kondisi mungkin saja ada yang memiliki nilai kembar, seperti potongan kode berikut:

... Kata[0].Kondisi = "dua"; Kata[0].Hasil = "one"; Kata[1].Kondisi = "dua"; Kata[1].Hasil = "two"; ...

Secara otomatis program akan mengambil nilai pada indeks terendah, karena looping kita bersifat Ascending dan berakhir saat menemukan kata yang dicari. Jika kita tidak mengakhiri pengulangan saat kata yang dicari ditemukan alias terus mengulang sampai habis, maka hasilnya adalah kata dengan indeks teratas. Masalah lainnya penambahan kata-kata yang ingin ditambahkan harus melalui Hardcore, atau melalui kompilasi pada program. Sehingga kita mungkin perlu menambahkan fitur untuk dapat memanggil file teks yang berisi "Kondisi" dan "Hasil". Atau dapat juga membuat fitur tambahan seperti kata apa yang akan direplace dengan meminta input-an dari user. Dan tambahan beberapa fitur lainnya .

- krofz

Friday, 26 April 2013

Program Sederhana untuk Replace String (Part I)

Kali ini kita akan membuat sebuah program yang akan menggantikan (Replace) kata-kata tertentu dengan kata-kata yang telah kita tentukan. Bahan yang diperlukan adalah sebuah file teks biasa yang akan diproses program. Buatlah dengan nama sesuka anda , contoh "ganti.txt" , yang panjang juga boleh . Pertama-tama kita gunakan < fstream > (file stream) untuk header yang menyediakan fungsi baca/tulis pada file :

#include <fstream> ... std::ifstream PanggilFile; PanggilFile.open("ganti.txt", std::ifstream::in);

ifstream (input file stream), untuk menampung file yang akan dibaca. Dengan menggunakan fungsi open dan diisi parameternya dengan benar, maka proses pertama program untuk membaca file telah sukses. Untuk nilai parameternya jika kita hanya menuliskan namafilenya saja (tanpa path lokasi yang jelas), maka program akan mencari file pada folder yang sama dengan program. Parameter kedua, adalah mode pemanggilan file, in (dari kata input) berarti file untuk dibaca. Beberapa mode yang dapat digunakan selain in (singkatan : input), out (output), binary, ate (at end), app (append), dan truncate (trunc).

Setelah file berhasil dipanggil, kita akan memeriksa setiap kata lalu menggantikan dengan kata yang ditentukan. Sebelum masuk ke dalam proses. Kita siapkan dulu kata-kata yang akan diganti. Kita dapat menggunakan 2 array dengan tipe data string, array pertama untuk kata kondisi dan array kedua untuk kata hasil. Perhatikan kode berikut:

... std::string kondisi[5]={"satu","dua","tiga","empat","lima"}; std::string hasil[5]={"one","two","three","four","five"}; ...

Tetapi kode tersebut tidak efisien, karena letak/posisi indeks pada kata kondisi dan hasil harus sama (contoh : kondisi[2] = "tiga", maka hasil[2] ="three" bukan "four"/"five") , dan ini adalah sebuah masalah jika kata yang ingin diganti sudah banyak. Maka dari itu kita harus membentuk struktur data yang rapi dengan membungkusnya menggunakan struct. Seperti pada kode berikut :

... //bykKey = Banyaknya Key const int bykKey = 5; struct sReplace { string Kondisi; string Hasil; } Kata[bykKey]; void initKata() { Kata[0].Kondisi = "satu"; Kata[0].Hasil = "one"; Kata[1].Kondisi = "dua"; Kata[1].Hasil = "two"; Kata[2].Kondisi = "tiga"; Kata[2].Hasil = "three"; Kata[3].Kondisi = "empat"; Kata[3].Hasil = "four"; Kata[4].Kondisi = "lima"; Kata[4].Hasil = "five"; } ...

Tambahkan banyaknya kata sesuai yang anda inginkan. Pada tulisan, selanjutnya kita tinggal memproses stringnya .

- krofz

Saturday, 30 March 2013

SQL : Date Range Query



Salah satu tipe data yang paling banyak dijumpai pada database adalah tipe data DATE. Untuk itu kita akan membahasa sedikit query yang menggunakan tipe data Date. Kita hanya akan membahas untuk Database (DB) Access dan MySQL. Dan berikut ini query-query untuk mengambil data dalam jarak waktu tertentu (Penulisan query SQL tidak case sensitive, jadi dapat ditulis dengan huruf besar atau kecil) :


1. Jika ingin mengambil data pada tanggal tertentu , misal 1-Januari 2012 sampai 15-Juli-2012 pada DB Access:
SELECT * FROM myTable WHERE CDATE(Tanggal) BETWEEN #01/01/2012# AND #07/15/2012#
Dengan format # Bulan / Hari / Tahun # . Pada MySQL :
SELECT * FROM myTable WHERE DATE(Tanggal) BETWEEN '2012-01-01' AND '2012-07-15'
Sedikit berbeda untuk fungsi yang digunakan yaitu Date() dan format tanggal yang digunakan 'Tahun - Bulan - Hari' .


2. Jika ingin mengambil data sesuai bulan tertentu dan tahun tertentu, misal bulan Desember 2012 pada DB Access dan juga MySQL:
SELECT * FROM myTable WHERE MONTH(Tanggal) = 12 AND YEAR(Tanggal) = 2012
Dapat juga mencari pada bulan tertentu tanpa memperdulikan tahun dengan menghapus pencarian pada fungsi Year(). Untuk pencarian hari gunakan fungsi Day(), contoh :
SELECT * FROM myTable WHERE DAY(Tanggal) = 5 AND MONTH(Tanggal) = 12 AND YEAR(Tanggal) = 2012
Pencarian untuk tanggal 5.


3. Jika ingin mencari dari bulan tertentu contoh dari Februari sampai Agustus pada tahun 2011, dapat menggunakan query berikut:
SELECT * FROM myTable WHERE MONTH(Tanggal) >= 2 AND MONTH(Tanggal) <= 8 AND YEAR(Tanggal) = 2011
Bagaimana jika ingin mencari dari bulan Agustus 2011 sampai Februari 2013? Apakah kode berikut berfungsi?
SELECT * FROM myTable WHERE MONTH(Tanggal) >= 2 AND MONTH(Tanggal) <= 8 AND YEAR(Tanggal) >= 2011 AND YEAR(Tanggal) <= 2013
Query diatas memang berjalan tetapi tidak akan menampilkan data pada bulan 1 (Jan), dan 9 (Sep) sampai 12 (Des). Jika menggunakan BETWEEN jarak tanggal yang dicari harus sesuai, contoh pada MySQL:
SELECT * FROM myTable WHERE DATE(Tanggal) BETWEEN '2011-08-01' AND '2013-02-28'
Untuk tanggal awal (contoh diatas 2011-08-01), kita dapat menginisialisasi 1 pada hari. Dan untuk tanggal akhir pencarian, terkadang kita bingung menentukan hari akhirnya , contoh tanggal 30 atau 31. Jika terdapat data pada tanggal 31 dan kita mengatur hanya sampai tanggal 30 tentu hasilnya tidak sesuai dengan yang kita inginkan. Untuk itu kita perlu memodifikasinya menjadi seperti berikut :
SELECT * FROM myTable WHERE (DATE(Tanggal) BETWEEN '2011-08-01' AND '2013-02-28') or (MONTH(Tanggal) = 2 AND YEAR(Tanggal) = 2013)


Semoga saja nanti bisa membuat game dengan memanfaatkan database seperti ini, hehehehe. :D ~

- krofz

Thursday, 7 March 2013

DirectX 9 : Program Sederhana (Part II)



Tulisan ini merupakan lanjutan dari:
DirectX 9 : Program Sederhana (Part I)


Ada sedikit ralat untuk pengaturan pada bagian Search Directories -> Linker . Jika sistem yang digunakan berbasis 32bit maka gunakan folder 'x86' sedangkan pada sistem 64bit gunakan folder 'x64' . Menambahkan keduanya tidak masalah yang penting posisi folder yang dicari sesuai, misal pada sistem 32bit posisi folder 'x86' berada di posisi paling atas. Pada dasarnya kita menunjuk kompiler untuk mencari file library (.lib) yang sesuai.

Gambar 1. Pengaturan pada sistem 32 bit (x86)

Tambahkan kode berikut setelah header windows:
#include <windows.h> //header direct3d #include <d3d9.h> #include <d3dx9.h> #define SCREEN_LEBAR 640 #define SCREEN_TINGGI 480 const char gClassName[] = "myWindowClass"; //variabel device LPDIRECT3D9 d3d; //Long pointer (LP) Direct 3D (d3d) LPDIRECT3DDEVICE9 d3ddev; //d3ddev = Direct 3D Device //prototipe fungsi void aturDevice(HWND jendela); void prosesRender(); void Bersihin();
Pertama kita membuat long pointer (LPDIRECT3D9) untuk membuat class iDirect3D9. Selanjutnya variabel device yang menampung informasi tentang driver grafis, kartu video, dan segala sesuatu yang berkaitan dengan grafis pada sisi hardware. Karena menyimpan semua informasi, segala pengaturan (setup) dan rendering melalui variabel ini. Selanjutnya membuat prototipe fungsi yang memudahkan kita. Lalu tambahkan implementasi fungsi-fungsi tersebut dimanapun anda suka, yang penting rapi dan sesudah variabel dan fungsi global. Karena kalau diletakkan sebelum variabel dan fungsi global tersebut pasti error hahaha. Selanjutnya letakkan 'aturDevice' sebelum proses main loop untuk inisialisasi awal, 'prosesRender' di dalam main loop, dan fungsi 'Bersihin' setelah main loop :
... aturDevice(hWnd); // enter the main loop! while(TRUE) { while(PeekMessage(&msg, NULL,0,0, PM_REMOVE)) //PeekMessage(∓msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } if(msg.message == WM_QUIT) break; prosesRender(); } Bersihin(); ...
Berikut ini isi didalam fungsi tersebut :
void aturDevice(HWND jendela) { d3d = Direct3DCreate9( D3D_SDK_VERSION); D3DPRESENT_PARAMETERS dxpp; //pp = Present Paramater if( d3d == NULL){ ::MessageBox(jendela,"DirectX runtime library tidak diinstal dengan baik!", "System Error", MB_ICONEXCLAMATION | MB_OK); } ZeroMemory(&dxpp, sizeof(dxpp)); // clear out the struct for use dxpp.Windowed = TRUE; // program windowed, not fullscreen dxpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // hapus frames lama dxpp.hDeviceWindow = jendela; // mengatur agar jendela mengunakan Direct3D // membuat device class d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, jendela, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &dxpp, &d3ddev); } void prosesRender() { //membersihkan layar dan menutupinya dengan warna biru d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); //memulai proses rekam gambar d3ddev->BeginScene(); //mengakhiri proses rekam gambar d3ddev->EndScene(); //menampilkan semua proses yang telah selesai ke layar d3ddev->Present(NULL, NULL, NULL, NULL); } void Bersihin() { //menutup dan melepaskan memory yang //dipakai pada d3d dan d3ddev if (d3d){ d3d->Release(); d3d = NULL; } if (d3ddev){ d3ddev->Release(); d3ddev = NULL; } }
Agar program dapat berjalan dengan baik, kita harus menyertakan versi SDK yang sesuai melalui '3d = Direct3DCreate9(D3D_SDK_VERSION);' pada program kita. Tujuannya agar kompatibel pada mesin/komputer yang lain, jika komputer lain memiliki versi yg lebih tinggi, mereka akan mencoba mencari versi (sebelumnya) yg sesuai dengan versi SDK yang digunakan program kita. Bagaimana kalau versinya lebih rendah? kita harus menyertakan runtime directX terbaru, tetapi tentu dengan batasan sistem yang gunakan, misal DirectX 10 atau 11 tidak memungkinan untuk digunakan pada Windows XP apalagi Windows 98 . D3DPRESENT_PARAMETERS adalah struct yang akan berisi informasi tentang perangkat grafis. ZeroMemory akan menginisialisasi seluruh isi dxpp menjadi NULL. Lalu dxpp.Windowed = TRUE , berfungsi agar program kita tidak full screen. Masukkan FALSE jika ingin menjadi full screen. Tapi tunggu dulu, jika anda langsung merubahnya menjadi FALSE maka program akan crash atau gagal, dikarenakan pengaturan yang lain tidak sesuai untuk fullscreen. Sehingga perlu beberapa pengaturan tambahan, yaitu pada :
//di dalam fungsi aturdevice dxpp.hDeviceWindow = jendela; // mengatur agar jendela mengunakan Direct3D //tambahan untuk fullscreen dxpp.BackBufferFormat = D3DFMT_X8R8G8B8; // mengatur format back buffer menjadi 32-bit dxpp.BackBufferWidth = SCREEN_LEBAR; // mengatur lebar buffer dxpp.BackBufferHeight = SCREEN_TINGGI; // mengatur tinggi buffer ... //di dalam fungsi main //sembuyikan warna background pada jendela sebelumnya (Win32) //karena sudah ditutupi oleh directx (lihat fungsi 'prosesRender') //wc.hbrBackground = (HBRUSH)COLOR_WINDOW; //boleh dihapus hWnd = CreateWindowEx(NULL, gClassName, "Proses Belajar", //ubah pada bagian ini // fullscreen, tanpa adanya border program dan tombol X / silang WS_EX_TOPMOST | WS_POPUP, 0, 0, SCREEN_LEBAR, SCREEN_TINGGI, NULL, NULL, hInstance, NULL); ...
Salah satu fungsi yang sangat penting, yaitu CreateDevice(), prototipe fungsi : //prototipe HRESULT CreateDevice( UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DDevice9 **ppReturnedDeviceInterface); // membuat device class d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, jendela, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &dxpp, &d3ddev);
Fungsi ini akan membuat kelas baru yang akan menangani kebutuhan grafis dan menyediakan hampir seluruh fungsi yang akan digunakan pada Direct3D. Parameter pertama diisi dengan grafis adapter yang akan digunakan, dalam hal ini default grafis card kita, parameter kedua berfungsi agar program memproses dari sisi Hardware, jika tidak ada masalah. Parameter ketiga diisi dengan jendela hWnd, parameter keempat adalah metode pemrosesan 3D, kita menggunakan metode pemrosesan dengan software. Parameter kelima kita isi dengan dxpp, parameter keenam menunjuk pointer d3ddev. Pengaturan awal telah berjalan sempurna maka kita mulai proses renderingnya. Tekan tombol Escape untuk keluar dari program. Sebelum program benar-benar tertutup kita harus pastikan semuanya sudah dibersihkan. Untuk penjelasan kodenya silahkan lihat pada bagian komentar pada masing-masing kode .

Jika sudah semua compile dan jalankan, seharusnya program akan menampilkan jendela dengan warna biru gelap. Semakin seru, jadi tunggu artikel selanjutnya. Akhir kata Happy Coding!

- krofz

Friday, 8 February 2013

DirectX 9 : Program Sederhana (Part I)


IDE : Code::Blocks 10.05
Download SDK DirectX 9

Kita akan memulai dengan project kosong, pilih File-> Project -> Empty Project -> Go, ikuti petunjuk dari Wizard yg tampil seperti menentukan lokasi penyimpanan (masukkan nama project yang anda inginkan), menentukan Compiler (pilih kedua opsi, yaitu Debug dan Release). Kurang lebih seperti gambar berikut :

Gambar 1. Empty Project

Setelah finish, klik kanan pada project (pada sisi sebelah kiri), pilih Properties -> Build Targets -> Pilih Release, Pada bagian Type ubah yang sebelumnya Console application, menjadi GUI Application. Ini bertujuan agar tidak muncul console di belakang jendela program kita. Berikut gambar langkah-langkahnya :

Gambar 2. GUI Application

Selanjutnya kita tambahkan Compiler dan Linker DirectX kita pada project, caranya klik kanan File Project -> Build Options -> Pada bagian kiri pilih nama project kita diatas Debug dan Release. Lalu pilih tab Search Directories, dibagian bawah ada 3 tab, pilih tab Compiler lalu tambahkan (Add) lokasi file header DirectX kita, jika anda menginstall SDK DirectX secara default, maka kita dapat mengisikan lokasinya dengan "C:\Program Files\Microsoft DirectX SDK (June 2010)\Include" atau anda dapat mengklik tombol Browse untuk mencari lokasinya, lalu ok, jika ditanya Relative Path, pilih No. Jika terlanjur memilih Yes, dapat memilih browse lagi lalu ok maka akan ditanya lagi hahaha atau dapat melanjutkannya dengan nama lokasi "..\..\..\..\..\Program Files\Microsoft DirectX SDK (June 2010)\Include". Kita lanjut ke tab kedua yaitu Linker. Tambahkan lokasi Object File Library (.lib) dengan memilih folder lib. Kita tambahkan kedua folder di dalam lib, yaitu folder 'x64' dan 'x86'. Hasil akhir :

Gambar 3. Menambahkan lokasi library DirectX

Lalu tambahkan file cpp baru, dengan memilih File -> Empty File, jika ditanya apakah anda ingin menambahkan ke project, pilih yes, lalu namakan dengan "Main.cpp" atau sesuai yang anda inginkan. Selanjutnya ketikkan (jangan di kopi-paste yah ) kode berikut :


#include <windows.h>

#define SCREEN_LEBAR 640
#define SCREEN_TINGGI 480

const char gClassName[] = "myWindowClass";

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    //style , dapat resize horizontal dan vertikal 
    wc.style = CS_HREDRAW | CS_VREDRAW;
    //prosedur windows
    wc.lpfnWndProc = WindowProc;
    //instance windows
    wc.hInstance = hInstance;
    //kursor berbentuk panah
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    //warna background
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = gClassName;

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL,
                          gClassName,
                          "DirectX 9 : Program Sederhana",
                          WS_OVERLAPPED | WS_SYSMENU, //for fullscreen -> WS_EX_TOPMOST | WS_POPUP,
                          0, 0,
                          SCREEN_LEBAR, SCREEN_TINGGI,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);

    // enter the main loop:
    MSG msg;
 
 //GetMessage, program menunggu pesan yang siap untuk diproses
    while(GetMessage(&msg, NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    switch(message)
    {
        case WM_SYSKEYDOWN:
        case WM_KEYDOWN:

        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;           //everything is gonna be ok :)
        } break;
    }

    return DefWindowProc (hWnd, message, wParam, lParam);
}

Kode diatas akan membuat sebuah jendela program sederhana yang (sangat) minimalis, dan kosong melompong dengan background putih (Seperti pada Contoh Aplikasi Win32). Pada kode diatas belum nampak satupun kode DirectX, file headernya aja belom dipanggil . Looping utama program ada pada fungsi GetMessage, fungsi ini baru bereaksi jika ada pesan (intruksi dari user) yang tersedia untuk diproses, seperti menutup program (meng-klik tombol Close). Tetapi untuk membuat sebuah game (pada zaman sekarang), program harus terus berjalan dan menampilkan gambar walaupun dalam keadaan nganggur/idle (tidak dimainkan). Untuk itu kita perlu menggunakan fungsi lain untuk program kita, yaitu fungsi PeekMessage. Fungsi ini akan tetap memproses sekalipun tidak ada pesan yang dikirim. Ada 5 parameter yang harus diisi pada PeekMessage. Untuk itu kita sedikit modifikasi agar program tidak langsung menutup. Berikut potongan kodenya :


    //get the message
    while(TRUE)
    {
        while(PeekMessage(&msg, NULL,0,0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        if(msg.message == WM_QUIT) break;
    }

Penambahan nilai PM_REMOVE agar pesan yang diterima dan telah diproses dibuang dalam antrian (queue), masih ada beberapa nilai lagi yang dapat digunakan, tapi penggunaan PM_REMOVE sudah lebih dari cukup . Dengan ini setidaknya program kita sudah memiliki pondasi yang kuat. Sampai ketemu diartikel selanjutnya...

 - krofz
 

back to top

back to top