update_states.c 2.8 KB

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