Modul game_state
Pembuat: Ikhsan Satriadi (241511080)
File: game_state.h & game_state.c
Struktur GameState
typedef struct GameState
{
void (*init)();
void (*handle_input)(SDL_Event *);
void (*update)(double delta_time);
void (*render)(SDL_Renderer *);
void (*cleanup)();
} GameState;
Struktur GameState mendefinisikan blueprint untuk berbagai state dalam game. Setiap state diimplementasikan sebagai sekumpulan fungsi yang menangani inisialisasi, input, pembaruan logika, rendering, dan pembersihan.:
init: Fungsi untuk melakukan inisialisasi state.handle_input: Fungsi untuk menangani input dari pengguna.update: Fungsi untuk memperbarui logika game dengan parameterdelta_time(waktu berlalu sejak frame terakhir).render: Fungsi untuk menggambar elemen-elemen game ke layar menggunakanSDL_Renderer.cleanup: Fungsi untuk membersihkan resource yang digunakan oleh state sebelum state diubah.
Variabel dan Konstanta
current_state
Variabel global current_state adalah pointer yang menunjuk ke state game yang sedang aktif. Variabel ini diubah menggunakan fungsi change_game_state.
Penjelasan Setiap Fungsi
change_game_state
Fungsi change_game_state digunakan untuk mengubah state game saat ini. Fungsi ini menerima satu parameter: new_state, yang merupakan pointer ke struct GameState yang ingin diaktifkan. Ketika state baru diubah, fungsi ini akan melakukan langkah-langkah berikut:
- Jika ada state saat ini (
current_statetidak NULL), fungsicleanupdari state saat ini akan dipanggil untuk membersihkan sumber daya yang mungkin digunakan. - Pointer
current_stateakan diubah untuk menunjuk kenew_state. - Fungsi
initdarinew_stateakan dipanggil untuk melakukan inisialisasi state yang baru.
void change_game_state(GameState *new_state)
{
if (current_state)
{
current_state->cleanup(); // clean up previous state
}
current_state = new_state;
current_state->init(); // initialize new state
}
get_current_game_state
Fungsi get_current_game_state digunakan untuk mendapatkan pointer ke state game yang sedang aktif saat ini (current_state). Fungsi ini tidak menerima parameter dan mengembalikan pointer ke struct GameState. Sebelum memanggil fungsi ini, change_game_state() harus dipanggil setidaknya sekali untuk menginisialisasi current_state. Jika current_state belum diinisialisasi (masih NULL), fungsi akan mencetak pesan error ke log dan keluar dari program.
GameState *get_current_game_state()
{
if (!current_state)
{
SDL_Log("`current_state` has not been initialized!, call `change_game_state` first.");
exit(1);
}
return current_state;
}
Interaksi dengan modul lain
Modul game_state ini memiliki interaksi dengan modul lain sebagai berikut:
-
Implementasi State
Struktur
GameStatediimplementasikan secara konkret dalam modul-modul state spesifik sepertimenu_state,stage0_state, danleaderboard_state. Setiap modul ini akan mendefinisikan fungsiinit,handle_input,update,render, dancleanupsesuai dengan logika state masing-masing. -
Pemanggilan
change_game_stateFungsi
change_game_statedipanggil dimain.cuntuk mengatur state awal game (menu_state). Selain itu, fungsi ini juga dipanggil di dalam implementasi setiap state (menu_state,stage0_state,leaderboard_state) untuk melakukan transisi antar state berdasarkan kondisi tertentu dalam game. -
Pemanggilan
get_current_game_state()Di dalam game loop pada
main.c, fungsiget_current_game_state()dipanggil untuk mendapatkan pointer ke state game yang sedang aktif (current_state). Pointer ini kemudian digunakan untuk memanggil fungsi-fungsi penting dari state saat ini, yaituupdate(delta_time)untuk memperbarui logika game,render(renderer)untuk menggambar frame saat ini, danhandle_input(event)untuk memproses input dari pengguna.