Salah Arah…Balik lagi ke basic Mei 22, 2007
Posted by kunilkuda in Konsep Game.2 comments
Gw ngerasa tujuan gw sbg game developer ga kecapai..Betul bahwa game jaman sekarang butuh grafik dan sound yang luar biasa..tapi semuanya itu kan additional (cuma make up dari game engine).
So, dalam konsep pembuatan software, kita mengenal model MVC (Model-View-Controller). Kurang lebih dapat diartikan bahwa bagian engine aplikasi itu harus terpisah dari user interfacenya (atau dengan kata lain bagian grafis 3D/2D dll itu harus bisa dipisahkan dari engine utamanya). Dengan demikian, kita bisa bikin game baru hanya dengan mengubah grafis/soundnya..
Mirip-mirip Final Fantasy serieslah (perasaan dari pertama kali gw maen FF VII sampai FF IX, konsep gamenya gitu-gitu aja si..Hanya gambar dan suaranya beda)..
So, ke depan, blog ini akan memuat game-game ASCII…Heheheh..
PS: Ada ide dimana gw bisa menaruh C source code ? Kl di wordpress, file zip/c/cpp ga bs diupload.
Event Handling di SDL Mei 9, 2007
Posted by kunilkuda in SDL Code.add a comment
Ketika mouse digerakkan, tombol keyboard dipencet, atau karakter kita telah mencapai posisi tertentu, SDL mengirimkan event ke event pool. Tugas aplikasi adalah mengambil event tersebut dan mengartikannya (misalnya menggerakkan karakter ke posisi lain).
Berikut adalah contoh sederhana bagaimana sebuah keyboard event dihandle oleh aplikasi :
Color Palette dan Mode Video Mei 8, 2007
Posted by kunilkuda in Newbie.add a comment
Banyak orang membayangkan bahwa warna merah adalah Red=0xFF, Green=0×00, dan Blue=0×00. Hal itu 100% benar, jika Anda menggunakan mode video 24-bit atau 32-bit.
Untuk mode video 24-bit, warna merah, hijau dan biru direpresentasikan dengan 8-bit (1-byte), sehingga menghasilkan total kombinasi 2^8 * 2^8 * 2^8 = 16.7 juta warna, untuk tiap pixel.
Hal yang sama juga berlaku untuk 32-bit. Mode 32-bit adalah mode video 24-bit plus alpha channel. Alpha channel digunakan untuk mengatur tingkat transparansi sebuah image di layar.
Nah, coba bayangkan hal ini : 1 pixel butuh 3-bytes (24-bit). Berapa memory yang dibutuhkan untuk layar monitor 1024 x 800 pixel ?
Jika masalah tersebut diimplementasikan di komputer / server, tentunya tidak ada masalah sama sekali dengan memori. Tapi, bagaimana jika diimplementasikan ke handheld (misal : gameboy) atau console (misal : playstation ) ? Besarnya memori, selain membuat perangkat menjadi mahal, juga membuat perangkat jadi boros baterai, plus memperlambat refresh rate video (lebih cepat mana : mengisi 4MB memori video versus mengisi 128MB ?).
Untuk mengatasi masalah ini, sistem embedded (handheld / game console) biasanya menggunakan sistem color palette. Color palette adalah array dari warna yang dapat ditampilkan di video dalam suatu waktu. So, kita dapat menghemat memori dengan mengurangi jumlah byte yang diperlukan untuk satu pixel.
Ilustrasinya seperti ini, misal kita punya color palette sbb :
- Hitam : Red = 0×00, Green = 0×00, Blue = 0×00
- Merah : Red = 0xFF, Green = 0×00, Blue = 0×00
- Biru : Red = 0×00, Green = 0×00, Blue = 0xFF
- Hijau : Red = 0×00, Green = 0xFF, Blue = 0×00
- Putih : Red = 0xFF, Green = 0xFF, Blue = 0xFF
Untuk dua pixel bewarna merah putih tanpa color palette, butuh memori sebagai berikut :
addr 1 : 0xFF 0x00 0x00
addr 2 : 0xFF 0xFF 0xFF
Total berjumlah 6-bytes.
Dengan color palette, kita cukup menunjuk pada urutan/index warna tersebut di color palette, seperti ini :
addr 1 : 0x02 (merah punya indeks-2 di color palette)
addr 2 : 0x05 (putih punya indeks-5 di color palette)
Total berjumlah 2-bytes untuk 2 pixel.
Sederhana kan ? Prinsipnya mirip Huffman coding, yaitu kompresi dengan mengubah simbol representasi data.
Lebih lanjut dengan color palette dapat dilihat di wikipedia.
Tips
Agar coding kita tidak terganggu dengan mode video (maksudnya kl kita mo cari warna merah, di mode video manapun), gunakan macro sebagai berikut :
#define COLOR_BLACK(screen) SDL_MapRGB(screen->format, NilaiRed, NilaiGreen, NilaiBlue)
Contoh :
#define COLOR_BLUE(screen) SDL_MapRGB(screen->format, 0x00, 0x00, 0xFF)
screen mengacu pada SDL_Surface dimana warna tersebut akan diaplikasikan.
Fade In Mei 8, 2007
Posted by kunilkuda in SDL Code.add a comment
Puas dengan Fade Out ?? Gimana cara bikin fade in-nya ?? Berikut adalah sample code untuk fade in..(penjelasannya ada di Fade Out).
Listing Fade In
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <stdio.h>
#define VIDEO_PIXEL_WIDTH 800
#define VIDEO_PIXEL_HEIGHT 600
#define VIDEO_BIT_PER_PIXEL 32
#define VIDEO_SURFACE_FLAG (SDL_HWSURFACE | SDL_DOUBLEBUF |SDL_FULLSCREEN)
#define JPEG_FILE "hello_world.jpg"
#define COLOR_BLACK(screen) SDL_MapRGB(screen->format, 0x00, 0x00, 0x00)
#define COLOR_WHITE(screen) SDL_MapRGB(screen->format, 0xFF, 0xFF, 0xFF)
#define COLOR_RED(screen) SDL_MapRGB(screen->format, 0xFF, 0x00, 0x00)
SDL_Surface *SetVideoMode( void )
{
SDL_Surface *pst_screen =
SDL_SetVideoMode(VIDEO_PIXEL_WIDTH, VIDEO_PIXEL_HEIGHT,
VIDEO_BIT_PER_PIXEL, VIDEO_SURFACE_FLAG);
if ( NULL == pst_screen )
{
printf(" ERROR : %s n",SDL_GetError());
exit(1);
}
else
{
printf("Set the video mode to %d x %d pixel - %d colors n",
VIDEO_PIXEL_WIDTH, VIDEO_PIXEL_HEIGHT, VIDEO_BIT_PER_PIXEL );
return pst_screen;
}
}
SDL_Surface *LoadJPEG( char *sz_filename )
{
SDL_Surface *pst_screen = IMG_Load(sz_filename);
if ( NULL == pst_screen )
{
printf(" ERROR : %s n",SDL_GetError());
exit(1);
}
else
{
printf("Loading file : %s n", sz_filename );
return pst_screen;
}
}
void DisplayImage(SDL_Surface *pst_mainScreen,
SDL_Surface *pst_virtualScreen)
{
Uint32 u32_blitStat =
SDL_BlitSurface(pst_virtualScreen, NULL, pst_mainScreen, NULL);
if ( -1 == u32_blitStat )
{
printf("ERROR : %sn", SDL_GetError());
exit(1);
}
Uint32 u32_flipStat = SDL_Flip( pst_mainScreen );
if ( -1 == u32_flipStat )
{
printf("ERROR : %sn", SDL_GetError());
exit(1);
}
}
void FadeIn(SDL_Surface *pst_mainScreen, char *sz_filename)
{
SDL_Surface *pst_alfaSurface =
LoadJPEG(sz_filename);
Uint16 u16_alphaBlend;
for ( u16_alphaBlend = SDL_ALPHA_TRANSPARENT;
u16_alphaBlend < (SDL_ALPHA_OPAQUE >> 1));
u16_alphaBlend += 5 )
{
SDL_SetAlpha( pst_alfaSurface, SDL_SRCALPHA, u16_alphaBlend );
DisplayImage( pst_mainScreen, pst_alfaSurface );
// Delay
SDL_Delay(10);
}
SDL_FreeSurface(pst_alfaSurface);
}
int main( int argc, char *argv[] )
{
// Initialize SDL
Uint32 u32_SDLInitStat = SDL_Init(SDL_INIT_EVERYTHING);
if ( -1 == u32_SDLInitStat )
{
printf("ERROR : %s n",SDL_GetError());
}
// If the program exit, run SDL_Quit()
atexit(SDL_Quit);
SDL_Surface *pst_mainScreen = SetVideoMode();
SDL_Surface *pst_virtualScreen =
SDL_DisplayFormat(pst_mainScreen);
SDL_FillRect( pst_virtualScreen, NULL, COLOR_WHITE(pst_mainScreen) );
DisplayImage( pst_mainScreen, pst_virtualScreen );
FadeIn( pst_mainScreen, "hello_world.jpg");
SDL_FreeSurface(pst_mainScreen);
SDL_FreeSurface(pst_virtualScreen);
exit(0);
}