Modul physics
Pembuat: Muhamad Syahid (241511081)
File: physics.c & physics.h
Struktur Physics
typedef struct
{
double velocity_x; // Kecepatan horizontal
double velocity_y; // Kecepatan vertikal
float gravity; // Skala gravitasi
float speed; // Kecepatan dasar
float friction; // Faktor gesekan
} Physics;
Struktur Physics menyimpan informasi yang berkaitan dengan fisika sebuah entity, termasuk:
velocity_x: Kecepatan entity pada sumbu horizontal.velocity_y: Kecepatan entity pada sumbu vertikal.gravity: Skala faktor gravitasi yang diterapkan pada entity.speed: Kecepatan dasar pergerakan entity.friction: Faktor yang mempengaruhi pengurangan kecepatan entity akibat gesekan.
Variabel dan Konstanta
GRAVITY
Konstanta yang mendefinisikan nilai dasar gravitasi yang akan diterapkan pada entity. Nilai ini kemudian dapat diskalakan oleh komponen gravity pada struktur Physics.
Penjelasan Setiap Fungsi
apply_gravity
Fungsi apply_gravity menerapkan gaya gravitasi pada komponen fisika sebuah entity. Fungsi ini menerima pointer ke struktur Physics dan delta_time (waktu yang berlalu sejak frame terakhir) sebagai input. Fungsi ini memperbarui velocity_y berdasarkan nilai GRAVITY, physics->gravity, dan delta_time.
#include "physics.h"
#include "game_stat.h"
#include "sfx.h"
#include "player.h"
#include "level.h"
#include <stdlib.h>
#define GRAVITY 15.9f
void apply_gravity(Physics *physics, float delta_time)
{
physics->velocity_y += GRAVITY * physics->gravity * delta_time;
}
check_collision
Fungsi check_collision melakukan deteksi tabrakan antara dua bounding box yang sejajar dengan sumbu (Axis-Aligned Bounding Box atau AABB). Fungsi ini menerima dua struktur Transform (yang memiliki anggota x, y, w, dan h untuk posisi dan dimensi) sebagai input. Fungsi ini mengembalikan nilai bukan nol (true) jika kedua bounding box bertabrakan, dan nol (false) jika tidak.
int check_collision(Transform a, Transform b)
{
return (a.x < b.x + b.w &&
a.x + a.w > b.x &&
a.y < b.y + b.h &&
a.y + a.h > b.y);
}
check_collision_all
Fungsi check_collision_all memeriksa apakah sebuah entity (direpresentasikan oleh Transform) bertabrakan dengan salah satu objek dalam array objects. Fungsi ini menerima pointer ke Transform entity, array pointer ke Transform objek-objek lain, dan jumlah objek dalam array. Fungsi ini mengembalikan pointer ke Transform objek pertama yang bertabrakan dengan entity, atau NULL jika tidak ada tabrakan.
Transform *check_collision_all(Transform *entity, Transform *objects, int object_count)
{
for (int i = 0; i < object_count; i++)
{
if (check_collision(*entity, *objects[i]))
{
return objects[i]; // Return objek pertama yang bertabrakan
}
}
return NULL; // Tidak ada tabrakan
}
handle_saw_collision
Fungsi handle_saw_collision secara spesifik menangani tabrakan antara gergaji (saw) dan pemain. Fungsi ini menerima Transform dari gergaji dan Transform dari pemain sebagai input. Jika terjadi tabrakan (menggunakan fungsi check_collision), fungsi ini akan memutar efek suara kematian (dead_sfx), mengurangi nyawa pemain menggunakan fungsi sub_life dari modul game_stat, dan mengatur ulang posisi pemain ke posisi awal level saat ini menggunakan fungsi reinitiate_player dari modul player.
void handle_saw_collision(Transform saw_transform, Transform player_transform)
{
if (check_collision(saw_transform, player_transform))
{
play_sound(dead_sfx, 4, 0);
sub_life(&game_stat);
reinitiate_player(player, current_level);
}
}
Interaksi dengan modul lain
Modul physics berinteraksi dengan modul lain sebagai berikut:
- Modul
entity: Modulphysicsbekerja dengan komponenPhysicsdanTransformyang merupakan bagian dari strukturEntity(meskipun definisi eksplisitEntitytidak diberikan dalam file ini). Fungsiapply_gravitymenerima pointer kePhysicscomponent, dan fungsi-fungsi deteksi tabrakan (check_collisiondancheck_collision_all) menerima dan mengembalikan pointer keTransformcomponents. - Modul
game_stat: Fungsihandle_saw_collisionmemanggil fungsisub_lifedari modulgame_statuntuk mengurangi jumlah nyawa pemain ketika pemain bertabrakan dengan gergaji. - Modul
sfx: Fungsihandle_saw_collisionmemanggil fungsiplay_sounddari modulsfxuntuk memainkan efek suara kematian ketika pemain bertabrakan dengan gergaji. - Modul
player: Fungsihandle_saw_collisionmemanggil fungsireinitiate_playerdari modulplayeruntuk mengatur ulang posisi pemain setelah bertabrakan dengan gergaji. - Modul
level: Fungsihandle_saw_collisionmengakses variabel globalcurrent_leveldari modulleveluntuk menentukan posisi awal pemain saat di-reinisialisasi. Modulphysicsjuga berinteraksi dengan modulleveluntuk mendapatkan informasi tentang objek-objek level yang perlu diperiksa tabrakan dengan pemain (misalnya, melalui fungsicheck_collision_all).