14 Sprite Animation Programming
14 Sprite Animation Programming
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
1
5/6/2010
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;
}
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