orton_runner/src/draw/draw.c

109 lines
3.6 KiB
C

/*
** EPITECH PROJECT, 2018
** task01
** File description:
** I do task
*/
#include "lib/my_graphics.h"
#include "game/draw.h"
#include "game/core.h"
static const uint8_t wall_pik[] = {128, 192, 128, 0, 128, 192, 128, 0};
static const uint8_t player_run_a_r[] = {0, 126, 66, 86, 66, 66, 126, 40};
static const uint8_t player_run_b_r[] = {0, 126, 66, 86, 66, 66, 126, 34};
static const uint8_t player_run_c_r[] = {126, 66, 86, 66, 66, 127, 128, 0};
static const uint8_t player_run_d_r[] = {126, 66, 86, 66, 66, 254, 1, 0};
static const uint8_t player_idle_r[] = {0, 126, 66, 86, 66, 66, 126, 66};
static const uint8_t player_jump_r[] = {126, 66, 86, 66, 66, 255, 0, 0};
static const uint8_t player_run_a_l[] = {0, 126, 66, 106, 66, 66, 126, 20};
static const uint8_t player_run_b_l[] = {0, 126, 66, 106, 66, 66, 126, 68};
static const uint8_t player_run_c_l[] = {126, 66, 106, 66, 66, 254, 1, 0};
static const uint8_t player_run_d_l[] = {126, 66, 106, 66, 66, 127, 128, 0};
static const uint8_t player_idle_l[] = {0, 126, 66, 106, 66, 66, 126, 66};
static const uint8_t player_jump_l[] = {126, 66, 106, 66, 66, 255, 0, 0};
static const uint8_t explosion_a[] = {0, 44, 82, 74, 129, 110, 48, 0};
static const uint8_t explosion_b[] = {6, 105, 66, 136, 2, 33, 132, 99};
static const uint8_t explosion_c[] = {8, 65, 16, 132, 0, 0, 17, 130};
static const uint8_t* player[]={
player_run_a_l, player_run_b_l, player_run_c_l, player_run_d_l,
player_run_a_r, player_run_b_r, player_run_c_r, player_run_d_r,
player_jump_l, player_jump_r,
player_idle_l, player_idle_r,
explosion_a, explosion_b, explosion_c
};
static void draw_line(sfml_t *sfml, const uint8_t *bmp, int draw[4], int y)
{
int end;
int x;
x = (draw[0] < 0) ? -draw[0] - 1 : -1;
end = (x + (8 << draw[2]) > sfml->width) ?
sfml->width - x : (8 << draw[2]);
while (++x < end){
if (bmp[y >> draw[2]] & 0x80 >> (x >> draw[2]))
my_pixel(sfml, draw[0] + x, draw[1] + y, draw[3]);
}
}
void draw_monochrome(sfml_t *sfml, const uint8_t *bmp, int draw[4])
{
int end;
int y;
y = (draw[1] < 0) ? -draw[1] - 1 : -1;
end = (y + (8 << draw[2]) > sfml->height) ?
sfml->height - y : (8 << draw[2]);
while (++y < end)
if (bmp[y >> draw[2]])
draw_line(sfml, bmp, draw, y);
}
void player_rendering(sfml_t *sfml)
{
int draw[4];
int locate;
locate = 0;
if (sfml->scene->player->action & PLAYER_RUN)
locate = sfml->scene->player->frame_counter / 5
+ ((sfml->scene->player->action & PLAYER_LEFT) ? 4 : 0);
if (sfml->scene->player->action & PLAYER_JUMP)
locate = (sfml->scene->player->action & PLAYER_LEFT) ? 9 : 8;
if (sfml->scene->player->action & PLAYER_IDLE)
locate = (sfml->scene->player->action & PLAYER_LEFT) ? 11 : 10;
if (sfml->scene->player->action & PLAYER_DEAD)
locate = sfml->scene->player->dead_counter /
PLAYER_DEAD_TIME + 12;
draw[0] = sfml->scene->player->x - sfml->scene->camera->x;
draw[1] = sfml->scene->player->y - sfml->scene->camera->y;
draw[2] = 3;
draw[3] = 0x000000ff;
draw_monochrome(sfml, player[locate], draw);
}
void wall_rendering(sfml_t *sfml)
{
int offset_y = sfml->scene->camera->y & 0x1f;
int sprite_load_y;
int rectangle[4];
int draw[4];
int i = -1;
rectangle[0] = sfml->scene->wall->x - sfml->scene->camera->x;
rectangle[1] = 0;
rectangle[2] = sfml->scene->wall->x + WALL_SIZE -
sfml->scene->camera->x;
rectangle[3] = sfml->height;
my_filled_rectangle(sfml, rectangle, 0x000000ff);
sprite_load_y = (offset_y) ? BLOCK_LOAD_Y : BLOCK_LOAD_Y + 1;
while (++i < sprite_load_y){
draw[0] = sfml->scene->wall->x + WALL_SIZE -
sfml->scene->camera->x;
draw[1] = (i << 6) - offset_y;
draw[2] = 3;
draw[3] = 0x000000ff;
draw_monochrome(sfml, wall_pik, draw);
}
}