Anda di halaman 1dari 4

5/6/2010

Animated Sprite
y Beberapa materi yang akan dibahas : 
y Animated sprites
y Grabbing frames out of a sprite sheet
Agung Toto Wibowo y Working with many sprites
W ki   i h    i
http://gameprogramming.blog.ittelkom.ac.id/blog/ y Creating a sprite handler
Harbour, Jonathan S. "Game Programming All In  y Drawing sprite frames
One", Thomson Course Technology, 2007 y Enhancing Tank War

Animated Sprite Contoh Sprite


y An animated sprite : array of sprite, yang digambarkan y Program berikut akan menampilkan sprite dari
dengan properties seperti timing, arah, dan velocity. kucing seperti di gambar samping. 
y Animated sprite (paling mudah) dapat diload #include <stdlib.h>
#include <stdio.h>
menggunakan load_bitemap, dan
load bitemap  dan digambar #include <allegro.h>
#i l d   ll h
#define WHITE makecol(255,255,255)
menggunakan draw_sprite, ditambah #define BLACK makecol(0,0,0)
kontrol/handling lain BITMAP *kitty[7];
char s[20];
y Untuk sprite yang “nyata”, kita butuh sebuah int curframe=0, framedelay=5, framecount=0;
int x=100, y=200, n;
framework untuk menggambar, menghapus, dan
int main(void)
menggerakkan sprite ini, sekaligus collision detection {
//initialize the program
allegro_init();
install_keyboard();

Contoh Sprite Contoh Sprite


install_timer(); //update the frame
set_color_depth(16); if (framecount++ > framedelay)
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); {
textout_ex(screen, font, "AnimSprite Program (ESC to quit)", 0, 0, WHITE, 0); framecount = 0;
//load the animated sprite curframe++;
for (n=0; n<6; n++) if (curframe > 5) curframe = 0;
{ }
sprintf(s,"cat%d.bmp",n+1); acquire_screen();
y[ ] _ p( ,
kitty[n] = load_bitmap(s, NULL); ); // p
//draw the sprite
} draw_sprite(screen, kitty[curframe], x, y);
//main loop //display logistics
while(!keypressed()) textprintf_ex(screen, font, 0, 20, WHITE, 0, "Sprite X,Y: %3d,%3d", x, y);
{ textprintf_ex(screen, font, 0, 40, WHITE, 0, 
//erase the sprite "Frame,Count,Delay: %2d,%2d,%2d“, curframe, framecount, 
rectfill(screen, x, y, x+kitty[0]‐>w, y+kitty[0]‐>h, BLACK); framedelay);
//update the position release_screen();
x += 5; rest(10);
if (x > SCREEN_W ‐ kitty[0]‐>w) }
x = 0; allegro_exit();
return 0;
}
END_OF_MAIN()

1
5/6/2010

Penjelasan Membuat Sprite Handler


//update the frame //update the position
if (framecount++ > framedelay) x += 5;
y Pada kode di atas, sprite diperlakukan per gambar secara
{ if (x > SCREEN_W ‐ kitty[0]‐>w) khusus.
framecount = 0; x = 0;
curframe++; y Butuh beberapa perilaku lain seperti speed, direction, 
if (curframe > 5) delay,  dlsb.
curframe = 0;
} y Perilaku ini bisa dipergunakan untuk sprite yang berbeda‐
y Perintah di atas (kiri) akan menset nilai frame secara beda
bergantian, dan menampilkan pada kode kanan atas.
y Pada perintah di atas, hanya mengubah posisi X saja, 
tanpa mengubah posisi Y.

Membuat Sprite Handler
Membuat Sprite Handler
void updatesprite(SPRITE *spr)
{
if (++spr‐>xcount > spr‐>xdelay)  //update x position
{ spr‐>xcount = 0;
typedef struct SPRITE spr‐>x += spr‐>xspeed;
{ }
int x,y; if (++spr‐>ycount > spr‐>ydelay) //update y position
int width,height; { spr‐>ycount = 0;
int xspeed,yspeed; spr‐>y += spr‐>yspeed;
int xdelay,ydelay; }
if (++spr >framecount > spr‐>framedelay)
if (++spr‐>framecount > spr >framedelay)
int xcount,ycount; {   //update frame based on animdir
int curframe,maxframe,animdir; spr‐>framecount = 0;
int framecount,framedelay; if (spr‐>animdir == ‐1)
} SPRITE; {
if (‐‐spr‐>curframe < 0)
y Nilai x, dan y menyatakan koordinat, width dan height  spr‐>curframe = spr‐>maxframe;
}
menyatakan ukuram, xdelay, ydelay akan diberlakukan per  else if (spr‐>animdir == 1)
srite. Keterangan lain bisa dilihat di buku. {
if (++spr‐>curframe > spr‐>maxframe)
y Bitmap tidak ditaruh di struct karena akan ada sharing  spr‐>curframe = 0;
image antar sprite. }
}
}

Mengambil
SpriteHandler Program Sprite dari sebuah Image
y Program sprite handler yang ada menggerakkan bola  y Pada contoh diatas, kita pergunakan beberapa image yang 
membentuk sprite.
ke arah tertentu, dan mengubah arah jika menabrak
y Pada kasus lain, kita bisa modifikasi sprite sehingga dapat
dinding. mengambil dari 1 image saja. Untuk itu, kode berikut
y Program mempergunakan stuct SPRITE, dan
SPRITE  dan fungsi diperlukan.
BITMAP *grabframe(BITMAP *source, int width, int height,
updatesprite yang ada di slide sebelumnya. int startx, int starty, int columns, int frame)
{
y Program dapat dilihat pada contoh. BITMAP *temp = create_bitmap(width,height);
int x = startx + (frame % columns) * width;
int y = starty + (frame / columns) * height;
blit(source,temp,x,y,0,0,width,height);
return temp;
}

2
5/6/2010

Mengambil
Sprite dari sebuah Image Multiple Animated Sprites
y Fungsi di atas, dapat dipanggil dengan pemanggilan seperti y Hingga saat ini kita hanya berkutat pada satu buah
di bawah ini :  sprite
//load 32‐frame tiled sprite image
temp = load_bitmap("balls.bmp", NULL);
y Pada kenyataannya, tidak ada game yang 
for (n 0; n<32; n++)
for (n=0; n<32; n++) gg
menggunakan p
satu buah sprite.
{
ballimg[n] = grabframe(temp,53,53,0,0,8,n); y Kita butuh multiple sprite yang dapat berjalan secara
} bersamaan.
destroy_bitmap(temp);
y Skenario :
y image yang digunakan adalah :
y Menggunakan multiple sprite (performansi menjadi isu)
y Memanfaatkan double‐buffer
y Menambahkan background image

Multiple Animated Sprites Multiple Animated Sprites
y Kode akan kita ubah menjadi array of sprite, dan y Kita akan menambahkan asteroid ke program, dan
penanganan juga akan diubah berikut adalah kode dan cara pengambilannya
for (n=0; n<MAX; n++)
{ //initialize the sprite //load 64‐frame tiled sprite image
sprites[n] = &thesprites[n]; temp = load_bitmap("asteroid.bmp", NULL);
sprites[n]‐>x = rand() % (SCREEN_W ‐
i [ ]     d() % (SCREEN W  spriteimg[0]‐>w);
i i [ ] ) for (n=0; n<64; n++)
sprites[n]‐>y = rand() % (SCREEN_H ‐ spriteimg[0]‐>h); {
sprites[n]‐>width = spriteimg[0]‐>w; spriteimg[n] = grabframe(temp,64,64,0,0,8,n);
sprites[n]‐>height = spriteimg[0]‐>h; }
sprites[n]‐>xdelay = rand() % 3 + 1; destroy_bitmap(temp);
sprites[n]‐>ydelay = rand() % 3 + 1;
sprites[n]‐>xcount = 0; sprites[n]‐>ycount = 0;
sprites[n]‐>xspeed = rand() % 8 ‐ 5;
sprites[n]‐>yspeed = rand() % 8 ‐ 5;
sprites[n]‐>curframe = rand() % 64;
sprites[n]‐>maxframe = 63; sprites[n]‐>framecount = 0;
sprites[n]‐>framedelay = rand() % 5 + 1;
sprites[n]‐>animdir = rand() % 3 ‐ 1;
}

Penggunaan Buffer Operasi Multiple Sprites


y Penggunaan srite biasa, melakukan proses menghapus y Operasi berikut dipergunakan pada multiple sprite : 
erasing, updating, warping, dan drawing.
(erasing), dan menggambar (drawing) di setiap sprite 
y Muncul masalah efisiensi, dibanding penggunaan single 
di game loop. loop, namun single loop tidak bisa dilakukan.
y Kita bisa memanfaatkan buffer, sehingga
buffer  sehingga sprite  //erase the sprites
for (n=0; n<MAX; n++)
digambar sekali saja, untuk banyak sprite. erasesprite(buffer, sprites[n]);
y Peritnah yang bisa kita gunakan adalah : //perform standard position/frame update
for (n=0; n<MAX; n++)
//update the screen updatesprite(sprites[n]);
acquire_screen(); //apply screen warping behavior
blit(buffer,screen,0,0,0,0,buffer‐>w,buffer‐>h); for (n=0; n<MAX; n++)
release_screen(); warpsprite(sprites[n]);
//draw the sprites
for (n=0; n<MAX; n++)
draw_sprite(buffer, spriteimg[sprites[n]‐>curframe], 
sprites[n]‐>x, sprites[n]‐>y);

3
5/6/2010

Kode lengkap
y AllegroCat : contoh animasi sprite
y AllegroSpriteHandler : contoh handling sprite saat terjadi
tabrakan
y AllegroSingleImage
All Si l I : contoh
  t h sprite dari
it  d i single image
i l  i
y AllegroAsteroid : contoh program multiple sprite

Anda mungkin juga menyukai