draw_states.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "draw_states.h"
  2. #include "fxlib.h"
  3. #include <stdio.h>
  4. // static functions
  5. static void drawPlayer(Camera *cam, int player_angle, int nb_lines, Line_Transition line_transition);
  6. static void drawDiagonals(Camera cam, int nb_lines, Line_Transition line_transition);
  7. static void drawHud(Game_Data *data);
  8. void draw_game(Game_Data *data)
  9. {
  10. //draw the player and the lines
  11. drawPlayer(&(data->cam), data->player_angle, data->nb_lines, data->line_transition);
  12. drawDiagonals(data->cam, data->nb_lines, data->line_transition);
  13. drawHud(data);
  14. //showing the walls
  15. if(data->list != NULL)
  16. drawWalls(data->list, &(data->cam), data->nb_lines, data->line_transition);
  17. }
  18. void draw_title(Game_Data *data)
  19. {
  20. }
  21. void draw_menu(Game_Data *data)
  22. {
  23. }
  24. void draw_game_over(Game_Data *data)
  25. {
  26. }
  27. static void drawHud(Game_Data *data) {
  28. unsigned char time_text[8] = "";
  29. sprintf(time_text, "%.2f", data->chrono_time);
  30. PrintMini(0, 0, time_text, MINI_REV);
  31. }
  32. //draws the player
  33. //at first, was supposed to draw an hexagon in the center, plus a triangle to show the player,
  34. //but the hexagon was not visible, and it was a pixel mess, so we're showing a circle instead.
  35. //there is still for code to calculate the vertices of the hexagon, in case we want to change that again
  36. static void drawPlayer(Camera *cam, int player_angle, int nb_lines, Line_Transition line_transition)
  37. {
  38. int x[32];
  39. int y[32];
  40. int i = 0;
  41. int angle = 0;
  42. float tmp_angle = 0.0;
  43. float transition_angle = 0.0;
  44. float delta_angle = 0.0;
  45. if(line_transition.delta_nb_lines == 1)
  46. nb_lines ++;
  47. if(line_transition.counter_start != 0)
  48. transition_angle = (360.0 / (float)nb_lines) * ((float)line_transition.counter / (float)line_transition.counter_start);
  49. delta_angle = 360.0/nb_lines;
  50. do
  51. {
  52. x[i] = (8. + cam->zoom)*cos(PI * (tmp_angle + cam->angle)/180.) + cam->cX;
  53. y[i] = (8. + cam->zoom)*sin(PI * (tmp_angle + cam->angle)/180.) + cam->cY;
  54. i++;
  55. switch(line_transition.delta_nb_lines)
  56. {
  57. case 0:
  58. tmp_angle += delta_angle;
  59. break;
  60. case 1:
  61. if(i < nb_lines)
  62. tmp_angle += (360 - (delta_angle - transition_angle)) / (nb_lines - 1);
  63. else
  64. tmp_angle += delta_angle - transition_angle;
  65. break;
  66. case -1:
  67. if(i < nb_lines)
  68. tmp_angle += (360 - transition_angle) / (nb_lines - 1);
  69. else
  70. tmp_angle = transition_angle;
  71. break;
  72. }
  73. }while(i <= nb_lines);
  74. //draw the aforementionned circle, depending on the camera's center
  75. //ML_filled_circle(cam.cX, cam.cY, 6, BLACK);
  76. ML_polygone(x, y, nb_lines, BLACK);
  77. //draw the player. At such a low scale, it was impossible to draw a rotating triangle, so its a radius 1 circle instead.
  78. ML_filled_circle((9. + cam->zoom)*cos( PI*(player_angle + cam->angle)/180) + cam->cX, (9. + cam->zoom)*sin( PI*(player_angle+cam->angle)/180) + cam->cY, 1, BLACK);
  79. }
  80. //draws one of the three rotating lines
  81. static void drawDiagonals(Camera cam, int nb_lines, Line_Transition line_transition)
  82. {
  83. int tmp_angle = cam.angle;
  84. float tmp_angle_rad = 0.0f;
  85. int i = 0;
  86. float x1 = 0.0f, y1 = 0.0f, x2 = 0.0f, y2 = 0.0f;
  87. float delta_angle = 0.0;
  88. float coeff = 0.0;
  89. float transition_angle = 0.0;
  90. delta_angle = 360.0 / nb_lines;
  91. if(line_transition.delta_nb_lines == 1)
  92. nb_lines ++;
  93. if(line_transition.counter_start != 0)
  94. coeff = (float)line_transition.counter / (float)line_transition.counter_start;
  95. transition_angle = delta_angle * coeff;
  96. do{
  97. tmp_angle_rad = tmp_angle * PI / 180.0f;
  98. x1 = 9.0f * cos(tmp_angle_rad);
  99. y1 = 9.0f * sin(tmp_angle_rad);
  100. x2 = 64.0f * cos(tmp_angle_rad);
  101. y2 = 64.0f * sin(tmp_angle_rad);
  102. ML_line(x1 + cam.cX, y1 + cam.cY, x2 + cam.cX, y2 + cam.cY, BLACK);
  103. i++;
  104. switch(line_transition.delta_nb_lines){
  105. case 0:
  106. tmp_angle += 360/nb_lines;
  107. break;
  108. case 1:
  109. if(i < nb_lines - 1)
  110. {
  111. tmp_angle += (360 - (delta_angle - transition_angle)) / (nb_lines - 1);
  112. }else{
  113. tmp_angle += delta_angle - transition_angle;
  114. }
  115. break;
  116. case -1:
  117. if(i < nb_lines - 1)
  118. {
  119. tmp_angle += (360 - transition_angle) / (nb_lines - 1);
  120. }else{
  121. tmp_angle += transition_angle;
  122. }
  123. break;
  124. }
  125. if(tmp_angle >= 360)tmp_angle = tmp_angle - 359;
  126. }while(i < nb_lines);
  127. }