summaryrefslogtreecommitdiff
path: root/players.c
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrik@amftech.nl>2022-12-11 16:14:54 +0100
committerAldrik Ramaekers <aldrik@amftech.nl>2022-12-11 16:14:54 +0100
commit24af775b5041cbed67dfc84f3a0d67850a4b6a1b (patch)
tree8858ba5158aa7a4b78e12ecbd17b509afda3f9d7 /players.c
parent4933a7c038087ae465e588fafb392a57d7f92b87 (diff)
pathfinding
Diffstat (limited to 'players.c')
-rw-r--r--players.c158
1 files changed, 102 insertions, 56 deletions
diff --git a/players.c b/players.c
index 40b2de3..f6719b5 100644
--- a/players.c
+++ b/players.c
@@ -16,7 +16,30 @@ float get_player_size(platform_window* window) {
int player_size = get_tile_width(window) * get_player_size_in_tile();
}
-object check_if_player_collided_with_object(platform_window* window) {
+void spawn_player(int id) {
+ for (int i = 0; i < max_players; i++) {
+ if (players[i].active) continue;
+ players[i].active = true;
+ players[i].sec_since_last_shot = 10.0f;
+ players[i].playerx = 3;
+ players[i].playery = 3;
+ players[i].gunx = 0.0f;
+ players[i].guny = 0.0f;
+ players[i].gun_height = 0.0f;
+ players[i].id = id;
+ return;
+ }
+}
+
+player get_player_by_id(int id) {
+ for (int i = 0; i < max_players; i++) {
+ if (!players[i].active) continue;
+ if (players[i].id == id) return players[i];
+ }
+ return (player){-1};
+}
+
+object check_if_player_collided_with_object(platform_window* window, player p) {
map_info info = get_map_info(window);
float player_size = get_player_size(window);
@@ -25,9 +48,9 @@ object check_if_player_collided_with_object(platform_window* window) {
if (!o.active) continue;
box box = get_box_of_object(window, o);
- float x_to_check = playerx;
+ float x_to_check = p.playerx;
float player_size_in_tile_px = player_size / (float)info.tile_width;
- float y_to_check = playery + player_size_in_tile_px;
+ float y_to_check = p.playery + player_size_in_tile_px;
if (x_to_check+player_size_in_tile_px >= o.position.x && x_to_check <= o.position.x+o.size.x
&& y_to_check >= o.position.y && y_to_check <= o.position.y+o.size.y) {
@@ -38,85 +61,108 @@ object check_if_player_collided_with_object(platform_window* window) {
return (object){0};
}
+int get_my_player_index() {
+ for (int i = 0; i < max_players; i++) {
+ if (!players[i].active) continue;
+ if (players[i].id == my_id) return i;
+ }
+ return -1;
+}
+
void take_player_input(platform_window* window) {
float speed = 0.1f;
float pad_between_player_and_obj = 0.01f;
- float old_x = playerx;
- float old_y = playery;
+ int my_index = get_my_player_index();
+ if (my_index == -1) return;
+
+ float old_x = players[my_index].playerx;
+ float old_y = players[my_index].playery;
if (keyboard_is_key_down(KEY_W)) {
- float newy = playery - speed;
- if (is_in_bounds(playerx, newy)) {
- playery = newy;
- object o = check_if_player_collided_with_object(window);
- if (o.active) playery = o.position.y+o.size.y - get_player_size_in_tile() + pad_between_player_and_obj;
+ float newy = players[my_index].playery - speed;
+ if (is_in_bounds(players[my_index].playerx, newy)) {
+ players[my_index].playery = newy;
+ object o = check_if_player_collided_with_object(window, players[my_index]);
+ if (o.active) players[my_index].playery = o.position.y+o.size.y - get_player_size_in_tile() + pad_between_player_and_obj;
}
}
if (keyboard_is_key_down(KEY_S)) {
- float newy = playery + speed;
- if (is_in_bounds(playerx, newy)) {
- playery = newy;
- object o = check_if_player_collided_with_object(window);
- if (o.active) playery = o.position.y - get_player_size_in_tile() - pad_between_player_and_obj;
+ float newy = players[my_index].playery + speed;
+ if (is_in_bounds(players[my_index].playerx, newy)) {
+ players[my_index].playery = newy;
+ object o = check_if_player_collided_with_object(window, players[my_index]);
+ if (o.active) players[my_index].playery = o.position.y - get_player_size_in_tile() - pad_between_player_and_obj;
}
}
if (keyboard_is_key_down(KEY_A)) {
- float newx = playerx - speed;
- if (is_in_bounds(newx, playery)) {
- playerx = newx;
- object o = check_if_player_collided_with_object(window);
- if (o.active) playerx = o.position.x+o.size.x + pad_between_player_and_obj;
+ float newx = players[my_index].playerx - speed;
+ if (is_in_bounds(newx, players[my_index].playery)) {
+ players[my_index].playerx = newx;
+ object o = check_if_player_collided_with_object(window, players[my_index]);
+ if (o.active) players[my_index].playerx = o.position.x+o.size.x + pad_between_player_and_obj;
}
}
if (keyboard_is_key_down(KEY_D)) {
- float newx = playerx + speed;
- if (is_in_bounds(newx, playery)) {
- playerx = newx;
- object o = check_if_player_collided_with_object(window);
- if (o.active) playerx = o.position.x-get_player_size_in_tile() - pad_between_player_and_obj;
+ float newx = players[my_index].playerx + speed;
+ if (is_in_bounds(newx, players[my_index].playery)) {
+ players[my_index].playerx = newx;
+ object o = check_if_player_collided_with_object(window, players[my_index]);
+ if (o.active) players[my_index].playerx = o.position.x-get_player_size_in_tile() - pad_between_player_and_obj;
}
}
}
-void draw_player(platform_window* window) {
- int size = get_tile_width(window) / 2;
- map_info info = get_map_info(window);
- float height = get_height_of_tile_under_coords(window, playerx, playery);
-
- take_player_input(window);
-
- sec_since_last_shot += update_delta;
- float bullets_per_sec = 10;
- float time_between_bullets = 1.0f/bullets_per_sec;
- if (is_left_down()) {
- if (sec_since_last_shot > time_between_bullets) {
- for (int i = 0; i < 3; i++) shoot(window);
- sec_since_last_shot = 0.0f;
+void draw_players_at_tile(platform_window* window, int x, int y) {
+ for (int i = 0; i < max_players; i++) {
+ if (!players[i].active) continue;
+ if ((int)players[i].playerx != x || (int)(players[i].playery+get_player_size_in_tile()) != y) continue;
+
+ int size = get_tile_width(window) / 2;
+ map_info info = get_map_info(window);
+ float height = get_height_of_tile_under_coords(window, players[i].playerx, players[i].playery);
+
+ take_player_input(window);
+
+ players[i].sec_since_last_shot += update_delta;
+ float bullets_per_sec = 10;
+ float time_between_bullets = 1.0f/bullets_per_sec;
+ if (is_left_down()) {
+ if (players[i].sec_since_last_shot > time_between_bullets) {
+ int ix = get_my_player_index();
+ if (ix != -1) {
+ for (int i = 0; i < 3; i++) {
+ shoot(window, players[ix]);
+ players[i].sec_since_last_shot = 0.0f;
+ }
+ }
+ }
}
- }
- float player_render_x = playerx*info.tile_width + (playery*info.px_incline);
- float player_render_y = playery*info.tile_height - (height*info.px_raised_per_h);
- renderer->render_rectangle(player_render_x, player_render_y, size, size, rgb(200,150,120));
+ float player_render_x = players[i].playerx*info.tile_width + (players[i].playery*info.px_incline);
+ float player_render_y = players[i].playery*info.tile_height - (height*info.px_raised_per_h);
+ renderer->render_rectangle(player_render_x, player_render_y, size, size, rgb(200,150,120));
- float dirx = (_global_mouse.x - (window->width/2));
- float diry = (_global_mouse.y - (window->height/2));
- double length = sqrt(dirx * dirx + diry * diry);
- dirx /= length;
- diry /= length;
+ float dirx = (_global_mouse.x - (window->width/2));
+ float diry = (_global_mouse.y - (window->height/2));
+ double length = sqrt(dirx * dirx + diry * diry);
+ dirx /= length;
+ diry /= length;
- gunx = playerx + (get_player_size_in_tile()/2) + dirx/2;
- guny = playery + (get_player_size_in_tile()/2) + diry/2;
- gun_height = height+0.5;
- float gun_render_x = gunx*info.tile_width + (guny*info.px_incline);
- float gun_render_y = guny*info.tile_height - (gun_height*info.px_raised_per_h);
+ players[i].gunx = players[i].playerx + (get_player_size_in_tile()/2) + dirx/2;
+ players[i].guny = players[i].playery + (get_player_size_in_tile()/2) + diry/2;
+ players[i].gun_height = height+0.5;
+ float gun_render_x = players[i].gunx*info.tile_width + (players[i].guny*info.px_incline);
+ float gun_render_y = players[i].guny*info.tile_height - (players[i].gun_height*info.px_raised_per_h);
- renderer->render_rectangle(gun_render_x, gun_render_y, size/4, size/4, rgb(20,255,20));
+ renderer->render_rectangle(gun_render_x, gun_render_y, size/4, size/4, rgb(20,255,20));
- _global_camera.x = -(window->width / 2) + player_render_x;
- _global_camera.y = -(window->height / 2) + player_render_y;
+ if (players[i].id == my_id) {
+ _global_camera.x = -(window->width / 2) + player_render_x;
+ _global_camera.y = -(window->height / 2) + player_render_y;
+ }
+ }
}