update_states.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "update_states.h"
  2. #include "pattern.h"
  3. #include "fixed.h"
  4. void update_title(Game_Data *data)
  5. {
  6. data->last_time = data->current_time;
  7. data->current_time = RTC_GetTicks();
  8. data->chrono_time += (data->current_time - data->last_time)/ 128.;
  9. if(KeyDown(K_SHIFT) && data->shift_latch_value == 0) {
  10. switch_to_state(MENU, data);
  11. }
  12. updateCamera(&(data->cam), data->current_time - data->last_time);
  13. }
  14. #define min(a, b) ((a) < (b) ? (a) : (b))
  15. void update_game(Game_Data *data)
  16. {
  17. data->last_time = data->current_time;
  18. data->current_time = RTC_GetTicks();
  19. data->chrono_time += (data->current_time - data->last_time)/ 128.;
  20. if(data->chrono_time >= 60) {
  21. data->are_colors_reversed = 1;
  22. }
  23. if(data->list != NULL) {
  24. // if the linked list is not empty
  25. updateWalls(data->list, min(data->current_time - data->last_time, 2));
  26. // update the linked list
  27. // if the player and a wall collide
  28. if(isColliding(data->list, data->player_angle, data->nb_lines) == true) {
  29. // death handling
  30. }
  31. // remove every wall whose distance to the center equals zero
  32. data->list = removeWall(data->list, 8);
  33. }
  34. // level generation
  35. if(!data->cooldown_timer--) {
  36. Pattern pattern = data->level->patterns[rand()% data->level->nb_patterns];
  37. addPattern(data, &pattern, rand()%data->nb_lines, rand()&1);
  38. data->cooldown_timer = pattern.cooldown;
  39. }
  40. // TODO : stop at wall side.
  41. if(KeyDown(K_LEFT)){
  42. data->player_angle-=data->level->player_rotation_speed * (data->current_time - data->last_time)*FRAME_TIME;
  43. }
  44. if(KeyDown(K_RIGHT)){
  45. data->player_angle+=data->level->player_rotation_speed * (data->current_time - data->last_time)*FRAME_TIME;
  46. }
  47. if(KeyDown(K_ALPHA) && data->alpha_latch_value == 0) {
  48. switch_to_state(MENU, data);
  49. }
  50. if(KeyDown(K_PLUS) && data->line_transition.counter == 0)
  51. {
  52. data->line_transition.counter = 10;
  53. data->line_transition.counter_start = 10;
  54. data->line_transition.delta_nb_lines = 1;
  55. }else if(KeyDown(K_MINUS) && data->line_transition.counter == 0){
  56. data->line_transition.counter = 10;
  57. data->line_transition.counter_start = 10;
  58. data->line_transition.delta_nb_lines = -1;
  59. }
  60. if(data->line_transition.counter != 0){
  61. data->line_transition.counter --;
  62. if(data->line_transition.counter <= 0){
  63. data->nb_lines += data->line_transition.delta_nb_lines;
  64. data->line_transition.counter_start = 0;
  65. data->line_transition.delta_nb_lines = 0;
  66. }
  67. }
  68. data->player_angle = MOD(data->player_angle, 360);
  69. updateCamera(&(data->cam), data->current_time - data->last_time);
  70. }
  71. void update_menu(Game_Data *data)
  72. {
  73. data->last_time = data->current_time;
  74. data->current_time = RTC_GetTicks();
  75. data->chrono_time += (data->current_time - data->last_time)/ 128.;
  76. if(KeyDown(K_SHIFT) && data->shift_latch_value == 0) {
  77. switch_to_state(GAME, data);
  78. }
  79. if(KeyDown(K_ALPHA) && data->alpha_latch_value == 0) {
  80. switch_to_state(TITLE, data);
  81. }
  82. updateCamera(&(data->cam), data->current_time - data->last_time);
  83. }
  84. void update_game_over(Game_Data *data)
  85. {
  86. // TODO
  87. }
  88. void updateCamera(Camera *cam, unsigned int delta_time){
  89. cam->angle += cam->speed * delta_time / 2.;
  90. if(cam->angle >= 360)
  91. cam->angle = cam->angle % 360;
  92. }