Monday, 27 December 2010

Cryptography Sederhana (3)


"aBcDvWxYz = Saya Gamer dan Programmer!"


Tulisan ini merupakan lanjutan dari:
Cryptography Sederhana (1)
Cryptography Sederhana (2)

Waktunya proteksi si 'Dia'. Ok, berikut ini kode yang akan meminta user memasukkan angka lalu disimpannya :


/*
Source Code ini adalah bahan/materi
yang berasal dari blog:

http://membuatgamedengancpp.blogspot.com/

*/
#include <stdio.h>
#include <conio.h>
#include <string>
#include <fstream>
#include <sstream>
#include <cstdlib>

int main(){
    int angka=0;
    printf("Masukkan Angka = ");
    scanf("%d",&angka);

    std::stringstream angkaPalsu;
    angkaPalsu << angka;
    std::string samarkan;
    samarkan = angkaPalsu.str();

    for( int c=0;c < samarkan.length();c++){
        samarkan[c]+= (10 + c);
    }

    printf("\n\nAngka Asli = %d\n",angka);
    printf("Angka disamarkan = %s\n"
            "Dan telah disimpan\n\n",samarkan.c_str());

    std::ofstream saveAngka("data.hs");
    saveAngka << samarkan;
    saveAngka.close();

    system("pause");
    return 0;
}

//- krofz

Format yang disimpan adalah .hs, yang tidak lain adalah file teks biasa. Sebelum angka yang dimasukkan user disimpan ke dalam file, terlebih dahulu kita enkripsikan. Berbeda dengan cipher sebelumnya yang hanya menambahkan 1 poin, disini yang ditambahkan berjumlah 10 + c. Yang dimana nilai c ini berubah sesuai panjangnya karakter. Contoh jika kita masukkan nilai 2500, maka bilangan 2500 ini dikonversi terlebih dulu kedalam bentuk string yang berarti ada 4 karakter, yaitu '2','5','0', dan '0'. Baru setelah ini dienkripsi dengan menambahkan urutan karakter (lihat Cryptography Sederhana (2)), sehingga 2500 menjadi <@<=. Atau terlihat seperti gambar berikut:

Gambar 1. Angka 2500 ditambah 10 + c.

Setelah save game pasti ada load game atau continue. Berikut kode load game-nya:


/*
Source Code ini adalah bahan/materi
yang berasal dari blog:

http://membuatgamedengancpp.blogspot.com/

*/
#include <stdio.h>
#include <string>
#include <fstream>
#include <sstream>
#include <cstdlib>

int main(){

    //jika file tidak ada maka angkanya adalah 0
    int angkaNya = 0;
    std::ifstream getAngka("data.hs");

    if( getAngka != NULL){
        //strAngka = string angka
        std::string strAngka = "2500";
        getAngka >> strAngka;

        bool error = false;
        for( int c=0;c < strAngka.length();c++){
            strAngka[c] -= (10 + c);

            //jika saat deskripsi yang didapat bukan angka 0-9
            //intinya harus mikir 2 kali kalau mau nge-hack ;)
            if( strAngka[c] < '0' || strAngka[c] > '9'){
                error = true;
                break;
            }
        }

        if( error){
            printf("Maaf, angka yang diproses gagal\n\n");
        }
        else{
            //strToAngka = String ke angka
            std::stringstream strToAngka;
            strToAngka << strAngka.c_str();
            strToAngka >> angkaNya;
            printf("Angka = %d\n\n",angkaNya);
        }
    }
    else{
        printf("Maaf, file tidak ditemukan\n\n");
    }

    getAngka.close();

    system("pause");
    return 0;
}

Algoritmanya adalah kebalikan dari sebelumnya, jika sebelumnya ditambahkan sekarang dikurangi. Hanya tinggal mengganti operan yang digunakan hehe . Karena file ini dapat diutak-atik dengan notepad, sehingga rentan sekali untuk diganti menjadi huruf atau karakter lainnya. Jika saat di deskripsi atau dikonversi ke angka terjadi kesalahan karena hasilnya bukan karakter angka (0-9). Maka dapat dipastikan 99% file ini telah dihack! dengan gagal hahahaha , 1%-nya adalah kesalahan program, penulisan file yang gagal, file korup di Harddisk, virus, dsb (buset 1% dengan banyak kemungkinan).

Semua Source Code dan Program diatas (atau kode sebelumnya) dapat di download melalui link ini. Jika anda masih bingung dengan kode-kode aneh diatas silahkan lihat artikel-artikel sebelumnya .

- krofz

Friday, 24 December 2010

Cryptography Sederhana (2)


"aBCD eFGHi = Saya Programmer!"


Tulisan ini merupakan lanjutan dari:
Cryptography Sederhana (1)

Melanjutkan bahasan sebelumnya, mari kita coba dengan kode sederhana berikut ini:


/*
Source Code ini adalah bahan/materi
yang berasal dari blog:

http://membuatgamedengancpp.blogspot.com/

*/
#include <stdio.h>
#include <conio.h>
#include <string>
#include <cstdlib>

int main(){
    std::string kalimat, ciphertext;

    printf("Masukkan 10 karakter = ");
    for(int c=0;c < 10;c++){
        kalimat+=getche();
        ciphertext+= (kalimat[c]+1);
    }
 
    printf("\n\nKalimat Asli = %s\n",kalimat.c_str());
    printf("Kalimat disamarkan = %s\n\n",ciphertext.c_str());

    system("pause");
    return 0;
}

//- krofz

Program diatas akan meminta user memasukkan 10 karakter baik huruf (a-z / A-Z), angka (0-9), spasi, atau karakter spesial (!,?,#,dst). Disini kita menggunakan fungsi 'getche()' sebagai fungsi inputnya. Kenapa tidak menggunakan cin, scanf(), gets(), atau semacamnya? Karena hanya untuk berkreasi hehehe . Tidak, tidak.. bukan itu alasannya. Pertama, fungsi cin tidak dapat begitu saja memperoleh karakter spasi alias akan error jika ada spasi. Kedua, begitu pula dengan scanf() yang hampir sama dengan cin. Ketiga, gets() memang dapat memperoleh karakter spasi tetapi selama aku berekperimen selalu error jika karakter yang dimasukkan lebih dari 18 karakter (nggak tau angka pastinya). Dan sampai saat ini ketiga masalah tersebut belum aku selesaikan jika user memasukkan karakter spasi. Kalau memang masalahnya adalah spasi maka kasih peringatan saja kalau program bakal error jika diinput spasi <- Kurang bijak . Atau batasi saja tombol yang akan dimasukkan dengan melakukan pengecualian pada karakter spasi <- Kagak tau caranya .

Bagaimana dengan getche()? Coba jalankan dan ketik apa saja (termasuk juga karakter spasi) selama tak lebih dari 10. Dan semua terlihat seperti tidak ada masalah (bukan?). Tapi walau bagaimanapun segala sesuatunya tidak ada yang sempurna, coba saja tekan Esc, Backspace, atau Enter, dan wussh.... programnya jadi error (~_~). Tapi sebelum masalah menjadi panjang, kita kembali lagi ke masalah utama terlebih dahulu yaitu bagaimana kita menyamarkan informasi. Jalankan program dan coba ketikan kalimat atau seperti gambar berikut:

Gambar 1. Kamu pasti bisa!

Dapat dilihat bahwa setelah huruf S (s besar) iyalah huruf T (t besar), sesuai dengan cipher atau metode penyamaran yang digunakan. Lalu bagaimana dengan karakter spasi? Menjadi apakah dia? Ia menjadi karakter selanjutnya sesuai dengan urutan karakter ASCII:

Gambar 2. ASCII chart (sumber: Search Engine yang mencari dari Internet yang amat sangat luas dan sedikit modifikasi).

Urutan spasi pada gambar adalah pada nomor 32, yang dilanjutkan dengan karakter tanda seru ('!') nomor 33. Begitu pula dengan angka 9 bukan menjadi 0, z menjadi a atau Z menjadi A, karena cipher yang digunakan menambahkan 1 poin/tingkat sesuai standar karakter ASCII tersebut. Disini kita baru meminta user memasukkan kalimat lalu menampilkan ciphertext-nya. Lalu dimana proteksi untuk sih 'nilai.hs'-nya!!! Harusnya anda sudah dapat membuatnya ;). Tapi jangan khawatir selanjutnya kita akan proteksi dia.

- krofz

Monday, 29 November 2010

Cryptography Sederhana (1)

"Abcd EfghI = Saya Gamer???"


Cryptography adalah seni dalam menyamarkan informasi. Misalkan ada informasi yang akan disamarkan, contohnya kata "Tester" (informasi asli ini dinamakan plaintext) akan disamarkan menjadi "Uftufs" (hasil akhirnya dinamakan chipertext). Lalu bagaimana kata "Tester" dapat berubah menjadi kata yang aneh tersebut? Kalau sudah tahu pasti gampang (ya iyalah.. ). Jika diperhatikan dengan seksama huruf 't' menjadi 'u', dan 'e' menjadi 'f', yang berarti huruf selanjutnya dari huruf informasi yang asli. Jika sudah di enkripsi (disamarkan) tentu harus di dekripsi (dipecahkan / diungkap). Jika disamarkan dengan menambah satu poin dari karakter aslinya, maka perlu dipecahkan dengan mengurangi satu poin dari informasi yang telah dienkripsi.

Sebagai contoh, silahkan anda coba download terlebih dahulu (jika belum) lalu mainkan game Kapal Luar Angkasa tersebut. Habisi beberapa musuh lalu tutup gamenya, selanjutnya buka kembali maka anda akan mendapati nilai Highscore sesuai dengan score terakhir anda menutup program. Tentunya jika nilainya lebih besar dari highscore sebelumnya. Nilai highscore ini tersimpan pada file bernama "nilai.hs". Dengan sedikit trik, maka kita dapat memanipulasi nilai highscore saat program dijalankan. Triknya adalah dengan merubah nilai (highscore) pada file "nilai.hs" sesuai keinginan. Jika anda bertanya bagaimana melakukannya berarti anda belum pantas menjadi Hacker, atau Cracker xD hehehe. Memang file ini akan terlihat seperti file yang tidak dapat dibuka begitu saja, seperti gambar berikut:

Gambar 1. File dengan format '.hs', sebuah format yang menipu. File yang tidak memiliki asosiasi file pada a). WinXP, dan b). Win 7.

Tetapi anda salah! file ini dapat dibuka dengan mudah dengan notepad dan anda akan mendapati nilai Highscore terakhir!!!. Silahkan ubah nilainya sesuka hati dengan angka tertinggi, dan Yeah.. game buatan kita telah di-hack, selamat.. . Dengan skenario hebat diatas, tentu kita tidak ingin terjadi di game buatan kita nanti. Sekalipun itu membuat mereka (para hacker) senang dan memainkannya lagi dengan kombinasi-kombinasi yang dapat terjadi. Tetap saja itu takkan bertahan lama, yang tertinggal hanya kebosanan. Untuk itu kita perlu mempelajari teknik ini, jadi tunggu bagian kedua tulisan ini hehehe...

- krofz

Wednesday, 24 November 2010

Kapal Luar Angkasa v0.2 (4)


"Semua Terekam tak Pernah Mati"
The Upstairs Band


Game sekarang yang memiliki banyak peta, tantangan, dan jenis mode permainan, membuatnya semakin kompleks dan lama untuk diselesaikan. Untuk itulah program kita harus dapat membuat, menulis, dan membaca sebuah file, atau yang biasa disebut "Save Game". Pengertian yang dimaksud, dapat juga berupa penyimpanan pengaturan opsi (option setting), seperti "Music On", "Sound FX Off", dll. Sehingga saat program dijalankan lagi di lain waktu maka tidak perlu mengaturnya lagi, jika dirasa setting-an default tidak sesuai. So, berikut kode pada program kita:


...
    if( getHighscore() < highscore){
        //simpan highscore
        std::ofstream saveNilai("nilai.hs");
        saveNilai<<highscore;
        saveNilai.close();
    }
...

Kode diatas terletak sebelum pembersihan variabel-variabel surface. Terlihat sangat sederhana karena banyaknya nilai atau data yang harus disimpan masih sedikit bahkan cuma satu, yaitu hanya highscore. Highscore ini sebagai pemicu pemain untuk terus bermain menyusul highscore yang sudah ada hehehe. Sudah mengertikan kode diatas? Kalau belum lihat lagi bagian ini. Setelah ditulis tentu harus dapat dibaca, hehehe . Kalau begitu lansung saja berikut kodenya:


...
int getHighscore()
{
    //hs = highscore
    int temp = 0;
    std::ifstream nilai("nilai.hs");

    if( nilai != NULL){
        nilai>>temp;
        if( temp < 0) temp = 0;
        else if( temp > MaxScore) temp = MaxScore;
    }
    nilai.close();

    return temp;
}

...
 //di dalam fungsi main
    highscore = getHighscore();
...

Kalau masih belum jelas dengan kode diatas silahkan lihat cara Membaca Sebuah File. Intinya kita membuat fungsi dengan tipe data int agar highscore mendapat nilai kembalian (return) yang sesuai. Selain menyimpan nilai highscore, kita juga dapat membuat agar program menyimpan koordinat terakhir, power yang dimiliki, dsb. Sehingga tercipta yang namanya "Load Game", hehehehe . So, sampai disini program kita sudah cukup komplit (complete), akhir kata Happy Coding!.

- krofz

Monday, 8 November 2010

Kapal Luar Angkasa v0.2 (3)

Tulisan ini merupakan lanjutan dari:
Kapal Luar Angkasa v0.2 (1)
Kapal Luar Angkasa v0.2 (2)

Peluru

Yah, pada versi sebelumnya (v0.1) pun kita sudah dapat mengeluarkan peluru. Tapi kali ini musuhnya pun dapat melakukannya dan diperburuk dengan warna peluru yang membaur dengan background, jadi berhati-hatilah! . Berikut ini deklarasi dan inisialisasi pada kelas peluru :

...
class peluru
{
    SDL_Surface *gambar;
    SDL_Rect kotak;
    //serang : false = serang musuh, true = serang jagoan / player
    bool aktif, serang, atas;
    int jenis;
    float x, kecX;

public:
    peluru();

    //****  LANGSUNG  ****
    SDL_Rect getKotak(){ return kotak; }
    bool getAktif(){ return aktif; }
    bool getSerang(){ return serang; }
    void aktifFalse(){ aktif = false; }
    //****  ********  ****

    int getDamage();
    void setPeluru(int,int,float,bool,bool,int,int);
    void bergerak();
    void tampil();
};

...
peluru::peluru()
{
    kotak.x = 0;
    kotak.y = 0;

    aktif = false;
    atas = false;
    serang = PL_PLAYER;
    jenis = PEL_KECIL;

    x = 0;
    kecX = 0;
}

int peluru::getDamage()
{
    switch( jenis){
        case PEL_NORMAL: return 15; break;
        default: return 1;
    }
}

void peluru::setPeluru(int _x, int _y, float _kecX, bool _atas, bool _serang, int _jenis, int _gbr)
{
    jenis = _jenis;
    switch( jenis){
        case PEL_NORMAL: kotak.w = 20; kotak.h = 20; break;
        //default = PEL_KECIL (Peluru KeciL)
        default: kotak.w = 10; kotak.h = 10;
    }

    switch( _gbr){
        case PELG_CYAN: gambar = gbrPeluru02; break;
        //default PELG_MERAH
        default: gambar = gbrPeluru;
    }

    x = _x - (kotak.w/2);
    kotak.x = (int)x;
    kotak.y = _y - (kotak.h/2);

    kecX = _kecX;
    atas = _atas;
    serang = _serang;

    aktif = true;

}

void peluru::bergerak()
{
    x += kecX;
    kotak.x = (int)(x);

    const int kecY = 6;

    if( atas) kotak.y -= kecY;
    else kotak.y += kecY;

    if( kotak.x < 0 || kotak.x > lebar_layar || kotak.y < 0 ||
        kotak.y > tinggi_layar) aktif = false;
}

void peluru::tampil()
{
    terapinGbr( kotak.x, kotak.y, gambar, screen, &cPeluru[jenis]);
}
...

SDL_Surface *gambar, berfungsi sebagai penunjuk gambar atau alamat surface yang akan ditampilkan nanti pada fungsi tampil(), sesuai inisialisasi pada fungsi setPeluru(). Selanjutnya ada 3 var boolean, yaitu boolean aktif berfungsi untuk memberitahukan apakah objek ini eksis atau tidak. Boolean serang, jika sudah aktif maka akan ditujukan untuk siapa peluru ini. Jika bernilai false maka saat musuh menabrak peluru aktif ini, DUARR!!. Begitu pula sebaliknya. Sedangkan boolean atas untuk pergerakan pada sumbu Y, variabel boolean ini bisa dihilangkan jika mau. Dan digantikan dengan int atau float (misal int kecY, atau float kecY). Segala bentuk persiapan yang diperlukan ada di fungsi setPeluru(), seperti koordinat awal muncul, kecepatan (X) peluru, dsb.

Untuk pesawat sang jagoan, peluru ini akan aktif setelah kita menekan tombol spasi (yang terletak pada void kapal::penanganan(peluru *_peluru[])). Banyaknya peluru disesuaikan dengan variabel power punya si jagoan. Power ini didapat dari item yang keluar saat kita menghancurkan musuh. Item ini ditanggani oleh kelas item. Saat ini baru satu jenis item yang akan keluar yaitu item Power, nanti akan kita perbanyak jenisnya . Semua proses tabrakan ini tak lepas dari peran utama fungsi bool f_PeriksaTabrakan(SDL_Rect A, SDL_Rect B) yang sifatnya general (umum). Dengan fungsi SDL_Rect getKotak(){ return kotak; } yang memiliki hak akses public dan dimiliki oleh semua kelas yang akan terjadi proses tabrakan ini. Sehingga penggecekan pada fungsi f_PeriksaTabrakan() menjadi lancar.

Sedangkan musuh akan mengeluarkan peluru jika skor (score) kita telah melebihi nilai yang ditentukan. Ditambah lagi kecepatan nembaknya akan semakin cepat seiring skor yang diperoleh (int _fastShoot = (frame_perdetik*3) - (_score/200); ). Untuk lebih jelasnya lihat inisialisasi fungsi void musuh::bergerak(int _kec, int _X, int _score, peluru *_peluru[]). Tak penting berapa ratus atau bahkan ribu baris kode yang Anda tulis, yang terpenting adalah Anda mengerti arti dan fungsi dari kode yang Anda tulis. Sehingga source code yang telah Anda download tidak menjadi sampah yang bakal menuju Recycle Bin, hehehehe . Maaf jika ada yang kurang jelas atau loncat-loncat pembahasannya.

- krofz

Tuesday, 26 October 2010

Kapal Luar Angkasa v0.2 (2)

Tulisan ini merupakan lanjutan dari:
Kapal Luar Angkasa v0.2 (1)

Gambar 1. Aku siap untuk berperang.

Animasi


Animasi dapat berupa pengambaran satu demi satu gambar yang berbeda sehingga membentuk sebuah gerakan, dapat juga berupa pergerakan posisi dari kiri ke kanan, atas ke bawah atau sebagainya. Tapi yang kumaksud animasi disini adalah perubahan gambar demi gambar, atau yang biasa disebut "frame by frame". Untuk penggambarannya, yang pasti jangan terlalu terpaku apalagi meniru saya dalam menggambar karakter di dalam game ini . Mungkin menggambar dengan membuat sketsa di kertas dapat menghasilkan gambar yang lebih baik . Perhatikan kedua kelas berikut:


...
#define ADDFRAME    0.3

...
class kapal
{
 ...
    int power, jenisPEL;
    float kecX, kecY, animasi;

 public:
 ...
};

class musuh
{
 ...
    float kecY, Y, animasi;
    bool aktif, dmg, hancur, forUfo;

    public:
 ...
};

...
void kapal::tampil()
{
    animasi+= ADDFRAME;
    if( animasi > = MAX_ANIMASI) animasi=0;

    terapinGbr(kotak.x-10, kotak.y-10, gbrKapal, screen, & cKapal[(int)(animasi)]);
}

...

void musuh::deArmor(int _dmg)
{
    //decrease armor, dmg = damage
    armor -= _dmg;
    dmg = true;
}

void musuh::tampil()
{
    animasi += ADDFRAME;
    if( !hancur){
        if( animasi > = MAX_ANIMASI) animasi = 0;
        terapinGbr(kotak.x-10,kotak.y-10, gambar, screen, & cKapal[(int)animasi]);
        if( dmg){
            terapinGbr(kotak.x-10,kotak.y-10,gbrMusuh_dmg,screen, & cKapal[tipe]);
            dmg = false;
        }
    }
    else{
        if( animasi > = MAX_ANIMASI) aktif = false;
        else terapinGbr(kotak.x-10,kotak.y-10, gbrMeledak01, screen, & cKapal[(int)animasi]);
    }
}
...

Kedua kelas tersebut memiliki variabel dengan nama animasi, tentu kita tahu fungsinya. Untuk tipe datanya sendiri kita gunakan float, bukan bilangan bulat (int). Karena penambahan frame-nya menggunakan bilangan riil (ADDFRAME = 0.3) agar mempermudah perhitungan. Ini karena kita hanya mempunyai 3 gambar/frame animasi, jika kita menambahkannya sebanyak 1 atau setiap framenya berganti-ganti gambar maka program kita akan terlihat seperti terburu-buru. Kita bisa saja menggubahnya menjadi int, lalu menampilkan dengan membaginya terlebih dahulu seperti berikut:


    animasi++; //jika bertipe 'int animasi'
    if( animasi > = (5*MAX_ANIMASI)) animasi=0;

    terapinGbr(kotak.x-10, kotak.y-10, gbrKapal, screen, & cKapal[(animasi/5)]);

Hasilnya akan sama, hanya saja pergerakan animasi dengan cara diatas (dengan int) akan terlihat lebih lambat. Ini karena pergantian gambar setiap 5 frame game (dalam game terdapat 22 frame per detiknya), berbeda dengan sebelumnya yang berkisar pada 3-4 frame (ADDRAME = 0.3). Jika kita perhatikan yang ditampilkan di layar adalah surface yang sesungguhnya memiliki 3 gambar. Lalu bagaimana agar ketiga gambar tersebut ditampilkan satu-persatu sesuai nilai frame animasi yang ada. Yaitu dengan memasukkan parameter kelima dalam fungsi terapinGbr(). Yang jika kita telusuri lagi fungsi terapinGbr() maka parameter kelima akan masuk ke fungsi SDL, yaitu SDL_BlitSurface().

Tentu tidak semudah itu kita mengisi parameter kelima ini, yang perlukan adalah SDL_Rect berpointer/beralamat. Untuk apa SDL_Rect? Dan bagaimana cara kerjanya? SDL_Rect ini berfungsi untuk mengambil bagian dari gambar dan cara kerjanya sederhana yaitu membuat sebuah luas dengan koordinat berdasarkan nilai-nilai member SDL_Rect. Member x dan y untuk memulai pengambilan koordinat pada gambar, dan member w (lebar) dan h (tinggi) untuk menggambil luas dari koordinat yang telah ditetapkan (x,y). Pengambilan gambar ini biasa disebut dengan 'clip', dan pada program kita ini terdapat pada fungsi 'void setClip()':


...

SDL_Rect cKapal[3]; //clip untuk animasi kapal
SDL_Rect cPeluru[2]; //clip untuk peluru

const int PEL_NORMAL = 0;
const int PEL_KECIL = 1;

void setClip()
{
    cPeluru[PEL_NORMAL].x = 0;
    cPeluru[PEL_NORMAL].y = 0;
    cPeluru[PEL_NORMAL].w = 20;
    cPeluru[PEL_NORMAL].h = 20;

    cPeluru[PEL_KECIL].x = 20;
    cPeluru[PEL_KECIL].y = 0;
    cPeluru[PEL_KECIL].w = 10;
    cPeluru[PEL_KECIL].h = 10;

    for( int c=0;c < MAX_ANIMASI;c++){
        cKapal[c].x = c*60;
        cKapal[c].y = 0;
        cKapal[c].w = 60;
        cKapal[c].h = 60;
    }
}
...

Fungsi dari kode diatas akan tampak seperti gambar berikut:

Gambar 2. Potong tiga.

Bagaimana dengan penggambaran (void tampil()) si musuh? Khusus untuk mereka kita menambahkan variabel boolean hancur dan dmg. Jika musuh tertembak maka jumlah armornya akan berkurang sesuai jumlah damage (lihat fungsi 'void musuh::deArmor(int _dmg)). Jika musuh masih memiliki armor (atau masih hidup) setelah tertembak maka akan tampil sekilas efek kerusakan berupa cahaya merah (lihat pengecekan variabel (var) boolean dmg). Begitu juga dengan var hancur, berfungsi untuk menghasilkan efek ledakan jika armor musuh sudah habis. Kita juga dapat membuat var hancur untuk kapal jagoan, karena pada game ini belum ada. Hanya akan muncul status Game Over jika telah terjadi tabrakan dengan musuh atau peluru musuh. Hmm ngomong-ngomong soal peluru, selanjutnya kita akan bahas tentang peluru ini .

- krofz

Thursday, 21 October 2010

Kapal Luar Angkasa v0.2 (1)

Gambar 1. Kapal Luar Angkasa v0.2

Ya, versi kedua ini telah keluar . Yang pastinya (harus) banyak perubahan dari versi sebelumnya (Kapal Luar Angkasa v0.1). Apa saja perubahannya? Silahkan download terlebih dahulu program dan source codenya:

Link : http://www.mediafire.com/?gd6sd89wr1m9gsg
Size : 705 KB
IDE : Code::Blocks v8
Attention : add #include < ctime > , if srand not recognized.

Main Menu, Class dan Constructor

Gambar 2. Click Play Game.
Jika pada versi sebelumnya, saat kita menjalankan program (game) langsung dihadapkan dengan pemusnahan kapal-kapal musuh (yang nggak ada habisnya). Sekarang ada tombol-tombol untuk memilih bagian-bagian mana saja yang akan kita kunjungi (dan mampir sebentar untuk meminum segelas teh/kopi), yang biasa disebut "Main Menu". Saat ini hanya ada dua tombol, yaitu tombol untuk memulai permainan, dan untuk keluar dari permainan. Tombol-tombol ini tentu bisa kita tambah dengan mudah dengan adanya kelas tombol (class tombol):


class tombol
{
    SDL_Rect kotak;

    public:
    tombol(int,int);
    void diklik(int,int,int);
    void tbl_tampil(std::string); //tbl = tombol
};
SDL_Rect kotak, berfungsi untuk menempatkan koordinat objek tombol pada layar (screen). Selain itu merupakan bagian terpenting karena untuk memeriksa apakah tombol kiri mouse tertekan diatas objek tombol ini atau tidak. SDL_Rect memang banyak gunanya hehehe... (lihat Segitiga dari SDL_Rect, oups Segitiga dari Kotak). Untuk tombol(int,int) merupakan konstruktor (Constructor) dengan 2 parameter bertipe int. Sedangkan kata kunci public adalah pemberian hak atau akses untuk variabel, fungsi atau member lainnya pada kelas, yang berarti nilainya dapat digunakan oleh objek lain diluar kelas ini. Jika kita tidak menetapkan haknya (misal public) maka secara otomatis hak yang dimiliki adalah private dan hanya dapat digunakan oleh member pada kelas yang sama. Sedangkan konstruktor dipanggil secara otomatis, jika pada contoh diatas memiliki 2 parameter.

Maka saat kita membuat objek dengan kelas tombol kita hanya perlu memasukkan nilai untuk parameternya, jika tidak maka akan terjadi error saat proses build. Kecuali jika kelas tombol memiliki konstruktor tanpa parameter. Konstruktor berguna untuk menginisialisasi nilai-nilai pada member (variabel) pada kelas. Satu kelas dapat memiliki beberapa konstruktor dengan parameter yang berbeda-beda, seperti kode berikut:

#include <iostream>

using namespace std;

class A{
    int x;
    char y;
    public:
    A();
    A(int);
    A(char);
    void show();
};

//Konstruktor pertama
A::A(){
    x = 15;
    y = 'A';
}

//Konstruktor kedua
A::A(int _X){
    x = _X;
    y = 'B';
}

//Konstruktor ketiga
A::A(char _y){
    x = 10;
    y = _y;
}

void A::show(){
    cout<<x<<" dan "<<y<<endl;
}

int main(){
    A a, b(16), c('K');
    a.show();
    b.show();
    c.show();
    return 0;
}

//maaf untuk penamaan variabelnya...
Dapat dilihat pada fungsi main, untuk objek a tidak diberi parameter apapun maka konstruktor yang akan dipanggil adalah konstruktor pertama. Untuk objek b dan c sama-sama memanggil konstruktor dengan parameter, hanya saja konstruktor yang akan dipilih akan disesuaikan dengan data yang dimasukkan.


GameStatus

Jika pada awal program dibuka kita dihadapkan dengan Main Menu, maka pada source code saat memasuki main loop kita disuguhi oleh Game Status. Bagian ini akan mempermudah kita dalam memproses, menampilkan bahkan mencari masalah (Bug) pada program kita. Misal ketika kita berada pada "case GS_PLAYGAME:" maka yang diproses dan ditampilkan adalah kapal jagoan, kapal musuh, peluru dan objek-objek yang diperlukan saja. Jika sewaktu-waktu program crash pada bagian ini (saat bermain), maka pencarian dapat dimulai dari sini (GS_PLAYGAME). Seperti layer pada program Photoshop, yang memudahkan kita mengedit foto-foto.

Sementara itu saja dulu, kita akan ungkap semuanya nanti hehehe...

- krofz

Next Part : Kapal Luar Angkasa v0.2 (2)
Update: 14 Desember 2012, 18 April 2013 (add some instruction)

Friday, 24 September 2010

Efek Transparan pada Gambar

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


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


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

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

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

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

http://membuatgamedengancpp.blogspot.com/

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

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

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

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

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

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

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

    // program main loop
    bool done = false;

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

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

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

        // DRAWING STARTS HERE

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

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

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

        // DRAWING ENDS HERE

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

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

    // free loaded bitmap
    SDL_FreeSurface(bmp);

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

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

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

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

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

- krofz

Wednesday, 15 September 2010

Segitiga dari Kotak (3)

Tulisan ini merupakan lanjutan dari:
Segitiga dari Kotak (1)
Segitiga dari Kotak (2)


Bagaikan air yang mengalir dari atas ke bawah.


Sekarang kita lanjutkan kebagian bagaimana program ini bekerja atau alur dari program. Kita langsung masuk ke loop (pengulangan) while atau loop utama program kita. Pertama adalah memperoleh detik awal pengulangan yang berfungsi untuk mengatur FPS (Frame Per Second) yang akan diproses selanjutnya pada akhir statement loop. Kedua adalah proses kontrol program dengan SDL_PollEvent(). Kita hanya membuat sebuah kondisi jika tombol panah kiri atau kanan ditekan, maka akan mengatur nilai dari variabel jumlahKotak. Kondisinya membatasi var jumlahKotak dengan jumlah minimal 3 dan maksimal 25. Dan tombol Escape untuk keluar atau menutup program.

Selanjutnya proses pengambaran pada fungsi SegitigaDariKotak() sesudah memberi alas pada layar (screen) dengan warna biru muda dengan SDL_FillRect(). Untuk argumen kedua fungsi, jumlah kotaknya disesuaikan dengan var jumlahKotak. Sebetulnya lebih tepat dibilang jumlah baris berbentuk kotak pada segitiga dibanding jumlah kotak yang lebih mengarah pada banyaknya kotak yang tampil, benar nggak? - sebodoh ah (pengacau bahasa). Dunia pemrograman memang penuh dengan singkatan, hehehe . Pada fungsi SegitigaDariKotak(), variabel Size akan mempermudahkan kita dalam mengatur tata letak, ukuran kotak dan segala perhitungannya. Variabel global red, green, dan blue berfungsi untuk mengatur warna yang tampil pada kotak agar lebih variatif.

Bagian utama dalam program ini adalah pengulangan for didalam fungsi SegitigaDariKotak() ini. Kita mulai dari koordinat x dan y. Meletakkannya secara manual selain membuat kode program menjadi panjang dan belum tentu rata/rapi. Belum lagi bagaimana caranya apakah menggunakan kondisi if? (jadi bingung sendiri ). So, perhatikan kode utama program kita:


...
    for(int c=1;c<=jumlah;c++)
    {
        int _X = (lebar_layar/2 - c*Size/2);
        int _Y = (tinggi_layar/2 - jumlah*Size/2)+ (c-1)*Size;

        //_blok = membuat blok hitam
        SDL_Rect _blok = {_X,_Y,c*Size,Size};
        SDL_FillRect(screen,&_blok,SDL_MapRGB(screen->format,0,0,0));

        for(int d=0;d<c;d++)
        {
            SDL_Rect _kotak = {_X+(d*Size)+2,_Y+2,Size-4,Size-4};
            SDL_FillRect(screen,&_kotak,SDL_MapRGB(screen->format,
                (c*3+red)%255,green%255,blue%255));
        }
    }
...

Sebelum melanjutkan, jika anda kurang jelas dengan SDL_Rect silahkan membaca kembali postingan sebelumnya. Sudah? Ok kita lanjutkan, dengan membuat variabel _X dan _Y agar nilainya dapat diterapkan pada kotak (SDL_Rect) _blok dan _kotak. Ini untuk menghindari perhitungan koordinat sebanyak 2 kali. Jika jumlah sama dengan 5, maka nilai _X didapat dari perhitungan lebar_layar (dalam program ini 640) dibagi 2 atau setengahnya lebar_layar dikurang c*Size/2 (misal Size = 35 hasil dari 40 - 5, dan berada pada pengulangan kedua - c = 2), sehingga _X = 640/2 - 2*35/2 = 320 - 35 = 285. Jika c diawali dengan 0 (int c=0, c < jumlah) maka untuk memperoleh nilai _X adalah seperti berikut _X = (lebar_layar/2 - (c+1)*Size/2), tetapi akan ada beberapa perubahan kode disana-sini. Sedangkan y diperoleh dari setengah tinggi_layar (dalam program ini 480) dikurang jumlah*Size/2 setelah itu ditambah (c-1)*Size, sehingga nilai _Y pada pengulangan kedua adalah _Y = (480/2 - 5*35/2) + (2-1)*35 = (240 - 87) + 35 = 153 + 35 = 188. So, untuk blok (yang warnain hitam) pada pengulangan ke-2 dengan jumlahKotak = 5 memiliki koordinat (285,188). Jika digambarkan akan seperti berikut:

Gambar 1. Mari kita letakkan yang rapi.

Dimana c1a = c1b, dan c2a = c2b. Itu untuk koordinatnya sedangkan untuk pengambarannya dibagi menjadi 2 bagian, yaitu blok dan kotak. Dimana blok untuk membuat seakan-akan ada garis tepi pada kotak, dan kotak adalah bentuk aslinya. Blok kita beri warna hitam (RGB = 0,0,0), dan untuk kotak kita buat sesuai nilai dari variabel red, green, dan blue. Koordinat kotak kita beri sedikit jarak 2 px (px = pixel, baik x maupun y) serta lebar dan tingginya dikurangi 4 px. Supaya saat pengambaran lebih menyatu dengan si blok dan bentuknya jelas, tidak seperti berikut:

Gambar 2. (a) Tanpa menggunakan blok dan (b) dengan blok, hanya saja kotak menambah 2 px untuk x dan y tetapi lebar dan tingginya tidak dikurangi 4 px.

Dengan ini diharapkan sudah mengerti alur dari program yang kita buat ini sehingga kita dapat membuat program sejenis yang lebih hebat lagi. So, happy coding.

- krofz

Tuesday, 7 September 2010

Segitiga dari Kotak (2)

Tulisan ini merupakan lanjutan dari:
Segitiga dari Kotak (1)

Ada sesuatu yang menarik dari program SDL yang satu ini, yaitu kehadiran pustaka (library) "windows.h". Untuk apa pustaka ini? Tentunya untuk membuat program - program pada Sistem Operasi (SO) Windows atau yang biasa disebut "Win32 Application". Kehadirannya disini berfungsi untuk memanggil fungsi "MessageBox()", sebuah fungsi yang akan menciptakan "Kotak" yang berisi "Pesan", seperti gambar berikut:

Argumen kedua berfungsi menampilkan teks dalam kotak, argumen ketiga merupakan caption/judul pada kotak. Dan argumen keempat untuk memberikan tanda (flag) apa saja yang akan tampil di Kotak Pesan kita. Tentu tanda yang diberikan terbatas. Lalu argumen pertama untuk apa? saat ini belum bisa berkomentar banyak . Sehingga fungsi ini mempermudahkan kita dalam menyampaikan pesan tentang penggunaan program (SDL) atau kontrol program buatan kita. Karena program yang dibuat masih sederhana dan hanya menggunakan panah kiri dan kanan sebagai kontrolnya. Tentu cara ini lebih cepat dibanding membuat sebuah surface dari font dengan memanggil SDL_ttf dan segala bentuk inisialisasi dasarnya (TTF_Init(), TTF_Font, dll). Atau menampilkan gambar sebagai informasi penggunaan atau kontrol program, yang semuanya ini tidak 'murah' perlu SDL_image untuk pemanggilan gambar bertipe (.jpg, .png, dsb).

Tetapi karena pustaka ini untuk SO Windows, jadi kemungkinan besar tidak berjalan (dengan mulus) di SO lainnya misal Linux. Sehingga cara yang tidak 'murah' tersebut lebih memuaskan daripada cara 'instan'. Itulah mengapa makanan instan (Fast Food, umumnya juga disebut Junk Food) itu tidak disarankan, lho? . Tapi jika anda masih tetap ngotot ingin menampilkan informasi penggunaan program tanpa pustaka windows dan SDL_ttf atau SDL_image, dapat menggunakan file gambar berformat bitmap (.bmp). Karena file bitmap merupakan format dasar gambar yang tidak terkompresi, sehingga penggunaan SDL.h -pun sudah dapat menampilkannya, berikut contoh potongan kodenya (Aku ambil dari template Code::Blocks):


...
    // load an image
    SDL_Surface* bmp = SDL_LoadBMP("infoProgram.bmp");
    if (!bmp)
    {
        printf("Unable to load bitmap: %s\n", SDL_GetError());
        return 1;
    }
    
    // centre the bitmap on screen
    SDL_Rect dstrect;
    dstrect.x = (screen->w - bmp->w) / 2;
    dstrect.y = (screen->h - bmp->h) / 2;
 ...
     // draw bitmap
        SDL_BlitSurface(bmp, 0, screen, &dstrect);
...

Tinggal menganti argumen pada SDL_LoadBMP() dengan nama file yang akan ditunjuk. Lalu menampilkannya dengan SDL_BlitSurface() .

- krofz

Thursday, 26 August 2010

Segitiga dari Kotak (1)



Pemrograman yang baik butuh Algoritma...
Algoritma yang tepat butuh Latihan...
Latihan yang Keras, jangan menyerah...

Dengan algoritma yang tepat pada pemrograman, kode sederhanapun akan menjadi sebuah program yang powerfull tanpa perlu sederetan fungsi-fungsi khusus dari library tambahan. Tetapi tentu dengan kapasitas kode/fungsi yang digunakan. Contohnya tentu program berikut ini :

Link : http://www.mediafire.com/download/ug27wgpom4005cg/Segitiga_dari_Kotak.7z
Size : 126 KB

Program diatas hanya memanfaatkan fungsi dasar SDL yaitu pembuatan kotak (SDL_Rect). Tetapi terlihat menarik dengan penampatan yang sistematis sehingga berbentuk segitiga atau seperti piramid. Selain itu fungsi dasar lainnya yaitu SDL_FillRect untuk memberi warna pada kotak. Sebelum melangkah lebih jauh, dan agar lebih jelas silahkan download terlebih dahulu file diatas, yang selanjutnya kita bahas bersama. Karena bersama kita pasti bisa .

So.. See You Later...

- krofz

Wednesday, 11 August 2010

Ascending dan Descending (2)

Tulisan ini merupakan lanjutan dari:
Ascending dan Descending (1)

Setelah proses Ascending, maka perlu kita tampilkan hasil pengurutan pada senarai (array) nilai agar informasi yang dikandung (selama 9 bulan, hah? ) dapat tersampaikan dengan jelas. Setelah ditampilkan maka kita lanjut ke proses selanjutnya yaitu Descending. Sama seperti Ascending, algoritma yang digunakan tidak jauh berbeda hanya cukup menganti operator pada kondisi if menjadi 'lebih besar' atau '>' yang sebelumnya 'lebih kecil' atau '<'. Maka *sim salabim...* (buset kayanya canggih amat >.<) semua sudah terurut secara Desending. Tapi ini bukan satu-satunya algoritma untuk itu coba perhatikan kode berikut:

...
for(int c=0;c < (MAX_NILAI/2);c++){
    int _temp = nilai[c], d = MAX_NILAI-(c+1);
    nilai[c] = nilai[d];
    nilai[d] = _temp;
}
...
Syarat dari algoritma diatas adalah kita harus terlebih dahulu melakukan pengurutan baik secara Ascending atau Descending. Misal kita Ascendingkan dahulu, lalu untuk mencari Descending cukup menggunakan algoritma diatas. Dan begitu juga sebaliknya Descending dahulu untuk mencari Ascending-nya. Algoritma ini dapat mempercepat proses yang diperlukan, bandingkan dengan sebelumnya yang memerlukan pengulangan bercabang dan kondisi if. Yang perlu diperhatikan adalah jumlah pengulangan yaitu pada 'c < (MAX_NILAI/2)', jangan sampai tidak dibagi 2. Karena nilainya nanti bisa balik lagi seperti semula. Tak perlu aku jelaskan lagi kenapa ini semua bisa terjadi. So.. happy coding and ngurutin!! :D

- krofz

Friday, 30 July 2010

Ascending dan Descending (1)

Ascending adalah metode pengurutan data dari yang terkecil hingga yang terbesar, sedangkan Descending kebalikkannya yaitu dari yang terbesar hingga yang terkecil. Dalam game metode ini banyak dijumpai contohnya siapa yang paling terkuat berdasarkan Strength, atau paling terkaya berdasarkan jumlah uang dari sekian player teratas (Top Player). Kalau pada game-game jaman dulu biasa dikenal dengan Highscore (mang sekarang apaan?), yang berisi daftar-daftar player yang mendapatkan poin atau skor tertentu. Biasanya hanya 10 player yang akan ditampilkan, yang terkecil pasti disingkirkan. Ok, berikut contoh programnya:

Link : http://rapidshare.com/files/410033140/31_Ascending_dan_Descending.7z
Size : 9 KB

Silahkan donwload terlebih dahulu, lalu perhatikan potongan kode berikut:

const int MAX_NILAI = 10;
int nilai[MAX_NILAI];

//meminta masukkan nilai ke array nilai.
printf("Masukkan nilai:\n\n");
for(int c=0;c<MAX_NILAI;c++)
{
printf("ke-%d\t= ",c+1);
scanf("%d",&nilai[c]);
}

//algoritma Ascending
for(int c=0;c<MAX_NILAI;c++){
for(int d=c+1;d<MAX_NILAI;d++){
if( nilai[d] < nilai[c]){
int _temp = nilai[c];
nilai[c] = nilai[d];
nilai[d] = _temp;
}
}
}
Pertama kita membuat variabel konstan (MAX_NILAI) untuk memudahkan pengubahan atau pemrosesan nilai pada loop (pengulangan). Lalu membuat sebuah sebuah variabel senarai (array) dengan jumlah sesuai variabel konstan sebelumnya. Variabel array ini lalu kita masukkan nilainya satu-satu dengan menggunakan pengulangan. Disini variabel konstan sangat membantu atau malah sangat penting. Karena jika jumlah pada array nilai hanya 5 dan pengulangan mungkin lebih dari 5, misal 6 pada saat meminta masukkan nilai dengan fungsi scanf() kemungkinan program akan berjalan aneh walaupun tidak sepunuhnya akan langsung tertutup atau crash. Tapi disini karena program belum terlalu kompleks sehingga keanehan itu masih samar-samar dan belum nampak sehingga butuh indra keenam, WEW!! . Yang pasti MAX_NILAI ini sangat membantu .

Setelah nilai diperoleh untuk masing-masing indeks (misal nilai[0], nilai[1], dst) maka kita mulai mengurutkannya. Pengurutan pertama adalah ascending (dari kecil ke besar), kita mulai dari indeks pertama, yaitu nilai[0] lalu dibandingkan dengan indeks selanjutnya yaitu nilai[1] sampai nilai[MAX_NILAI-1]. Kondisi yang dipakai adalah jika indeks selanjutnya (disingkat: nilai[d]) lebih kecil dari indeks yang sedang diperiksa (disingkat: nilai[c]) maka nilai[c] akan bertukar nilai dengan nilai[d]. Pertukaran nilai ini tidak langsung terjadi begitu saja dengan memberi nilai[d] langsung ke nilai[c]. Kita perlu membuat variabel (int _temp) untuk menampung nilai[c] agar nilai aslinya tidak tertimpah dengan nilai[d]. Untuk banyaknya pengulangan, misal MAX_NILAI adalah 10 maka pengulangan pertama (untuk nilai[0]) adalah 9 kali, sedangkan untuk indeks selanjutnya misal nilai[5] hanya perlu memeriksa nilai[(5+1)] sampai nilai[MAX_NILAI-1]. Karena sudah pasti indeks sebelumnya telah diurutkan dengan baik.

Tapi ini belum semua dibahas, so tunggu lanjutannya .

- krofz

Monday, 26 July 2010

Recovery Netbook Dell dan Acer One

Semakin canggih saja teknologi saat ini, terutama hardware-hardware sekarang yang bentuknya semakin kecil tetapi lebih canggih dari generasi sebelumnya. Sebut saja laptop yang dulu gedenya bukan main, dan beratnya mungkin hampir sama dengan mengendong seorang bayi (masa sih?) hahaha . Sekarang bentuknya mengecil hingga layarnya hanya 12-14 inch (dengan model widescreen) saja, dan biasa disebut Notebook. Masih dirasa kurang kecil dan kurang ringan, dibuat lagi yang ukuran layarnya hanya 10 inch, bentuk ini yang dinamakan Netbook.

Berbeda dengan Notebook yang rata-rata mempunyai Disc Player atau CD/DVD Drive, sedangkan Netbook tidak. Sehingga jika terjadi kerusakan pada Sistem Operasi (SO) akan mempermudah dalam menginstal ulang SO-nya kembali. Mungkin hal ini tidak masalah jika mempunyai DVD Eksternal atau alat tambahan seperti konverter IDE/SATA to USB dengan menggunakan CD/DVD Drive PC. Atau yang lebih ekstrem lagi menginstal dengan LAN/Network bahkan UFD (USB Flash Disk). Menginstal melalui perangkat eksternal memang rentan sekali gagal, misal menginstal melalui DVD Eksternal yang mungkin koneksinya sudah lemah sehingga kesenggol dikit bisa membuat perangkat tidak dikenali lagi. Belum lagi jika selesai drivernya umumnya belum terinstal. Dan jika Sistemnya Original/OEM seperti Windows maka perlu melakukan proses aktivasi yang lagi-lagi belum tentu berjalan lancar.

Tetapi tenang saja, netbook sekarang sudah terdapat cara 'Recovery System' yang tak perlu lagi melalui CD/DVD seperti jaman dulu. Cukup dengan menekan beberapa tombol saat boot awal Netbook maka anda akan dibawa keproses recovery sistem. Syaratnya cuma 2, yaitu tahu tombol recoverynya dan yang terpenting partisi Recoverynya tidak hilang atau terhapus. Partisi ini umumnya dihidden sehingga tidak terlihat (misal di My Computer) saat sistem selesai diinstal. Partisi ini hanya dapat dilihat dengan utiliti Disk Management untuk memastikan bahwa recovery dapat dilakukan. Bagaimana kalau sistem sudah tidak dapat berjalan dengan normal bahkan baru muncul tampilan awal, misal Windows XP saja sudah langsung restart?. Untuk mengetahui ada atau tidaknya partisi dapat menggunakan Bootable Disc seperti Hiren Boot CD (HBCD).

Langsung saja kita praktekkan, yang perlu dilakukan terlebih dahulu adalah memastikan bahwa tidak ada Data penting di dalam Netbook. Karena sudah pasti recovery akan membabat semua data yang ada di dalam partisi (umumnya drive C). Lakukan penyelamatan terlebih dahulu, bisa dengan safe mode (kalau masih jalan), bootable CD atau Live CD (misal HBCD atau ubuntu), dan jika masih belum berhasil cabut HDD-nya lalu gabungkan dengan komputer yang lain. Berikut ini tombol Recovery untuk Netbook Acer Aspire One, tekan secara bersamaan saat booting Netbook:

[ALT] + [F10]


Sedangkan untuk Netbook Dell:
[CTRL] + [F11]


Maklum untuk posting yang beginian karena pekerjaanku menjadi teknisi komputer tak memberiku waktu yang banyak saat ini hehehe atau karena males? hahaha . Untuk Notebook atau Netbook yang lain (mudah-mudahan) nanti akan menyusul .

- krofz

Friday, 9 July 2010

Mainkan Musiknya (3)

Tulisan ini merupakan lanjutan dari:
Mainkan Musiknya (1)
Mainkan Musiknya (2)

Perhatikan potongan kode berikut:

...
//di fungsi proses pada kelas tombol
if( X > kotak.x && X < (kotak.x+kotak.w) &&
Y > kotak.y && Y < (kotak.y+kotak.h))
{
Mix_PlayChannel(-1, sndKlik,0);
return true;
}
return false;
...
if ( Mix_PlayingMusic() == 0)
{
if ( Mix_PlayMusic(musik,-1)==-1) return 1;
}
...
Kita mulai dengan memainkan variabel efek suara (sound effect), dengan memanggil fungsi "Mix_PlayChannel()". Argumen pertama pada fungsi tersebut adalah channel yang akan dimainkan. Nilainya kok min 1 (-1)? Karena itu standarnya , sungguh tak memberikan solusi . Tidak-tidak, yang pasti fungsi Mix_PlayChannel hanya akan mencari channel yang tersedia lalu memainkan soundnya. Lalu argumen kedua adalah variabel yang akan digunakan. Dan yang ketiga adalah 'loop' atau putaran, yaitu berapa kali sound akan diputar lagi. Dalam hal ini nilai adalah nol jadi tidak ada siaran ulang . Fungsi Mix_PlayChannel ini kita letakkan di dalam kelas tombol, pada fungsi proses. Tepatnya berada pada pengecekkan apakah tombol di klik dengan benar?. Fungsi ini akan menghasilkan nilai -1 jika terdapat masalah saat memainkan sound FX, sehingga kita dapat menambahkan kondisi 'if'. Jika ingin melakukan sesuatu saat memainkan sound FX bermasalah, misal menampilkan pesan error, langsung menutup program, dan sebagainya.

Selanjutnya kita beralih ke fungsi untuk memainkan musik, yaitu "Mix_PlayingMusic()" dan "Mix_PlayMusic()". Kita periksa terlebih dahulu apakah musik sedang dimainkan? Jika belum (bernilai 0) maka saatnya memainkan musik dengan Mix_PlayMusic(). Argumen pertama adalah variabel atau musik yang akan dimainkan. Argumen kedua adalah berapa banyak waktu untuk berputar kembali (loop). Kita mengaturnya dengan nilai -1, yang artinya akan terus berputar sampai dihentikan paksa. Jika terjadi masalah maka fungsi ini akan bernilai -1, dan mungkin terpaksa program harus ditutup dengan return 1.

Karena aku tidak bisa menciptakan sound efek apalagi musik sendiri, jadi terpaksa pakai sound efek dan musik dari game lain dalam aplikasi ini. Dan jika ini yang anda lakukan juga ketika membuat game atau aplikasi biasa, sebaiknya membuat sebuah layout credits atau sejenisnya. Layout ini menjelaskan bahwa "Sound Effects" or "Musics" berasal dari game apa, situs apa atau siapa pembuatnya, dan anda berterima kasih karena itu. Hargai karya orang lain maka karya anda pasti dihargai . Akhir kata, Happy nge-Mix!

- krofz
 

back to top

back to top