| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- #include "draw_states.h"
- #include "fxlib.h"
- #include <stdio.h>
- // static functions
- static void drawPlayer(Camera *cam, int player_angle, int nb_lines, Line_Transition line_transition);
- static void drawDiagonals(Camera cam, int nb_lines, Line_Transition line_transition);
- static void drawHud(Game_Data *data);
- static void drawChrono(Game_Data *data);
- static void drawStep(Game_Data *data);
- void draw_game(Game_Data *data)
- {
- //draw the player and the lines
- drawPlayer(&(data->cam), data->player_angle, data->nb_lines, data->line_transition);
- drawDiagonals(data->cam, data->nb_lines, data->line_transition);
- drawHud(data);
- //showing the walls
- if(data->list != NULL)
- drawWalls(data->list, &(data->cam), data->nb_lines, data->line_transition);
- }
- void draw_title(Game_Data *data)
- {
- }
- void draw_menu(Game_Data *data)
- {
- }
- void draw_game_over(Game_Data *data)
- {
- }
- static void drawChrono(Game_Data *data) {
- unsigned char time_text[8] = "";
- static const unsigned char time_hud_border[8] = {0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80};
- unsigned short length_of_time, length_of_time_line;
- sprintf(time_text, "%.2f", data->chrono_time);
- length_of_time = strlen(time_text);
- length_of_time_line = 4 * length_of_time;
- if(data->chrono_time < 60) {
- PrintMini(0, 0, time_text, MINI_REV);
- ML_horizontal_line(6, 0, (data->chrono_time/60.) * (length_of_time_line - 2), BLACK);
- ML_horizontal_line(7, 0, length_of_time_line - 1, BLACK);
- }
- else {
- PrintMini(0, 1, time_text, MINI_REV);
- ML_horizontal_line(6, 0, length_of_time_line - 1, BLACK);
- ML_horizontal_line(7, 0, length_of_time_line - 1, BLACK);
- }
- ML_bmp_8_or(time_hud_border, length_of_time_line, 0);
- }
- static void drawStep(Game_Data *data) {
- unsigned char *step_text[6] = {
- "Point",
- "Line",
- "Triangle",
- "Square",
- "Pentagon",
- "Hexagon"
- };
- unsigned short step_time[5] = {
- 10,
- 20,
- 30,
- 45,
- 60
- };
- unsigned char step_hud_border[8] ={0x1F, 0x1F, 0x0F, 0x0F, 0x07, 0x07, 0x01, 0x01};
- unsigned short length_of_step, current_step, i;
- current_step = 5;
- for(i = 0; i < 5; i++) {
- if(data->chrono_time < step_time[i]) {
- current_step = i;
- break;
- }
- }
- length_of_step = 4 * strlen(step_text[current_step]) + 1;
- // Little patch because the font is not fixed width and 'n' chars are annoying me.
- ML_vertical_line(125,0,5, BLACK);
- ML_vertical_line(126,0,5, BLACK);
- ML_vertical_line(127,0,5, BLACK);
- PrintMini(127 - length_of_step, 1, step_text[current_step], MINI_REV);
- ML_bmp_8_or(step_hud_border, 127 - length_of_step - 8, 0);
- ML_horizontal_line(6, 127 - length_of_step - 2, 127, BLACK);
- ML_horizontal_line(7, 127 - length_of_step - 2, 127, BLACK);
- }
- static void drawHud(Game_Data *data) {
- drawChrono(data);
- drawStep(data);
- }
- //draws the player
- //at first, was supposed to draw an hexagon in the center, plus a triangle to show the player,
- //but the hexagon was not visible, and it was a pixel mess, so we're showing a circle instead.
- //there is still for code to calculate the vertices of the hexagon, in case we want to change that again
- static void drawPlayer(Camera *cam, int player_angle, int nb_lines, Line_Transition line_transition)
- {
- int x[32];
- int y[32];
- int i = 0;
- int angle = 0;
- float tmp_angle = 0.0;
- float transition_angle = 0.0;
- float delta_angle = 0.0;
- if(line_transition.delta_nb_lines == 1)
- nb_lines ++;
- if(line_transition.counter_start != 0)
- transition_angle = (360.0 / (float)nb_lines) * ((float)line_transition.counter / (float)line_transition.counter_start);
- delta_angle = 360.0/nb_lines;
- do
- {
- x[i] = (8. + cam->zoom)*cos(PI * (tmp_angle + cam->angle)/180.) + cam->cX;
- y[i] = (8. + cam->zoom)*sin(PI * (tmp_angle + cam->angle)/180.) + cam->cY;
- i++;
-
- switch(line_transition.delta_nb_lines)
- {
- case 0:
- tmp_angle += delta_angle;
- break;
- case 1:
- if(i < nb_lines)
- tmp_angle += (360 - (delta_angle - transition_angle)) / (nb_lines - 1);
- else
- tmp_angle += delta_angle - transition_angle;
- break;
- case -1:
- if(i < nb_lines)
- tmp_angle += (360 - transition_angle) / (nb_lines - 1);
- else
- tmp_angle = transition_angle;
- break;
- }
- }while(i <= nb_lines);
- //draw the aforementionned circle, depending on the camera's center
- //ML_filled_circle(cam.cX, cam.cY, 6, BLACK);
- ML_polygone(x, y, nb_lines, BLACK);
- //draw the player. At such a low scale, it was impossible to draw a rotating triangle, so its a radius 1 circle instead.
- 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);
- }
- //draws one of the three rotating lines
- static void drawDiagonals(Camera cam, int nb_lines, Line_Transition line_transition)
- {
- int tmp_angle = cam.angle;
- float tmp_angle_rad = 0.0f;
- int i = 0;
- float x1 = 0.0f, y1 = 0.0f, x2 = 0.0f, y2 = 0.0f;
- float delta_angle = 0.0;
- float coeff = 0.0;
- float transition_angle = 0.0;
-
- delta_angle = 360.0 / nb_lines;
- if(line_transition.delta_nb_lines == 1)
- nb_lines ++;
- if(line_transition.counter_start != 0)
- coeff = (float)line_transition.counter / (float)line_transition.counter_start;
- transition_angle = delta_angle * coeff;
- do{
- tmp_angle_rad = tmp_angle * PI / 180.0f;
- x1 = 9.0f * cos(tmp_angle_rad);
- y1 = 9.0f * sin(tmp_angle_rad);
- x2 = 64.0f * cos(tmp_angle_rad);
- y2 = 64.0f * sin(tmp_angle_rad);
- ML_line(x1 + cam.cX, y1 + cam.cY, x2 + cam.cX, y2 + cam.cY, BLACK);
- i++;
- switch(line_transition.delta_nb_lines){
- case 0:
- tmp_angle += 360/nb_lines;
- break;
- case 1:
- if(i < nb_lines - 1)
- {
- tmp_angle += (360 - (delta_angle - transition_angle)) / (nb_lines - 1);
- }else{
- tmp_angle += delta_angle - transition_angle;
- }
- break;
- case -1:
- if(i < nb_lines - 1)
- {
- tmp_angle += (360 - transition_angle) / (nb_lines - 1);
- }else{
- tmp_angle += transition_angle;
- }
- break;
- }
- if(tmp_angle >= 360)tmp_angle = tmp_angle - 359;
- }while(i < nb_lines);
- }
|