draw_states.c 4.5 KB

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