missile.c 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include <stdlib.h>
  2. #include <stdbool.h>
  3. #include <jetpack_game_icons.h>
  4. #include <gui/gui.h>
  5. #include "states.h"
  6. #include "game_sprites.h"
  7. #include "missile.h"
  8. #include "barry.h"
  9. void missile_tick(MISSILE* const missiles, BARRY* const barry, void (*death_handler)()) {
  10. // Move missiles towards the player
  11. for(int i = 0; i < MISSILES_MAX; i++) {
  12. if(missiles[i].visible && missile_colides(&missiles[i], barry)) {
  13. death_handler();
  14. }
  15. if(missiles[i].visible) {
  16. missiles[i].point.x -= 2; // move left by 2 units
  17. if(missiles[i].point.x < -MISSILE_WIDTH) { // if the missile is out of screen
  18. missiles[i].visible = false; // set missile as "inactive"
  19. }
  20. }
  21. }
  22. }
  23. void spawn_random_missile(MISSILE* const missiles) {
  24. // Check for an available slot for a new missile
  25. for(int i = 0; i < MISSILES_MAX; ++i) {
  26. if(!missiles[i].visible) {
  27. missiles[i].point.x = 2 * SCREEN_WIDTH;
  28. missiles[i].point.y = rand() % (SCREEN_HEIGHT - MISSILE_HEIGHT);
  29. missiles[i].visible = true;
  30. break;
  31. }
  32. }
  33. }
  34. void draw_missiles(const MISSILE* missiles, Canvas* const canvas, const GameSprites* sprites) {
  35. for(int i = 0; i < MISSILES_MAX; ++i) {
  36. if(missiles[i].visible) {
  37. canvas_set_color(canvas, ColorBlack);
  38. if(missiles[i].point.x > 128) {
  39. canvas_draw_icon_animation(
  40. canvas, SCREEN_WIDTH - 7, missiles[i].point.y, sprites->alert);
  41. } else {
  42. canvas_draw_icon_animation(
  43. canvas, missiles[i].point.x, missiles[i].point.y, sprites->missile);
  44. canvas_set_color(canvas, ColorWhite);
  45. canvas_draw_icon(
  46. canvas, missiles[i].point.x, missiles[i].point.y, sprites->missile_infill);
  47. }
  48. }
  49. }
  50. }
  51. bool missile_colides(MISSILE* const missile, BARRY* const barry) {
  52. return !(
  53. barry->point.x >
  54. missile->point.x + MISSILE_WIDTH - 14 || // Barry is to the right of the missile
  55. barry->point.x + BARRY_WIDTH - 3 <
  56. missile->point.x || // Barry is to the left of the missile
  57. barry->point.y > missile->point.y + MISSILE_HEIGHT || // Barry is below the missile
  58. barry->point.y + BARRY_HEIGHT < missile->point.y); // Barry is above the missile
  59. }
  60. int get_rocket_spawn_distance(int player_distance) {
  61. // Define the start and end points for rocket spawn distance
  62. int start_distance = 256;
  63. int end_distance = 24;
  64. // Define the maximum player distance at which the spawn distance should be at its minimum
  65. int max_player_distance = 5000; // Adjust this value based on your game's difficulty curve
  66. if(player_distance >= max_player_distance) {
  67. return end_distance;
  68. }
  69. // Calculate the linear interpolation factor
  70. float t = (float)player_distance / max_player_distance;
  71. // Interpolate the rocket spawn distance
  72. return start_distance + t * (end_distance - start_distance);
  73. }