Clean animation code, could be slow AF

This commit is contained in:
KikooDX 2020-05-16 11:58:59 +02:00
parent bae45f36ce
commit b86f6605bf
3 changed files with 30 additions and 28 deletions

BIN
JTMM.g3a

Binary file not shown.

View File

@ -1,3 +1,6 @@
#include <gint/display.h>
void draw_anim(int x, int y, image_t *image, int step);
void draw_player(int x, int y);
void draw_level(char level[], unsigned int step, char polarity, int *start_x,
int *start_y, int tp_positions[]);

View File

@ -7,7 +7,7 @@
#define DRAW_OFFSET_Y -24
#define DRAW_OFFSET_X -27
extern image_t img_player; //player texture, 12x12
extern image_t img_player; //player texture, 12x12 (NOT ANIMATED)
extern image_t img_solid_0; //solid texture, 16x16
extern image_t img_solid_1; //solid texture, 16x16
extern image_t img_spike; //spike texture, 16x16
@ -20,10 +20,15 @@ extern image_t img_red_dot; //off red bloc texture, 16x16
extern image_t img_exit; //exit texture, 16x16
extern image_t img_water; //water texture, 16x16
extern image_t img_semi_solid; //semi solid texture, 16x16
//animated textures (elevator)
extern image_t img_teleporter_0; //teleporter 0 texture, 16x16
extern image_t img_teleporter_1; //teleporter 1 texture, 16x16
extern image_t img_elevator;
extern image_t img_elevator; //elevator texture, 16x16
void draw_anim(int x, int y, image_t *image, int step)
{
dsubimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, image,
((step / 2) % (image->width / 16)) * 16, 0, 16, 16, DIMAGE_NONE);
}
void draw_player(int x, int y)
{
@ -33,9 +38,6 @@ void draw_player(int x, int y)
void draw_level(char level[], unsigned int step, char polarity, int *start_x,
int *start_y, int tp_positions[])
{
int const img_elevator_frame_count = img_elevator.width / 16;
int const img_teleporter_0_frame_count = img_teleporter_0.width / 16;
int const img_teleporter_1_frame_count = img_teleporter_1.width / 16;
dclear(BG_COLOR);
unsigned int i = 0;
unsigned int x = 0;
@ -45,57 +47,54 @@ int *start_y, int tp_positions[])
switch (level[i])
{
case '0':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_solid_0);
draw_anim(x, y, &img_solid_0, step);
break;
case '1':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_solid_1);
draw_anim(x, y, &img_solid_1, step);
break;
case 'r':
if (!polarity) dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_red);
else dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_red_dot);
if (!polarity) draw_anim(x, y, &img_red, step);
else draw_anim(x, y, &img_red_dot, step);
break;
case 'b':
if (polarity) dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_blue);
else dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_blue_dot);
if (polarity) draw_anim(x, y, &img_blue, step);
else draw_anim(x, y, &img_blue_dot, step);
break;
case 'v':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_spike);
draw_anim(x, y, &img_spike, step);
break;
case '*':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_bouncer);
draw_anim(x, y, &img_bouncer, step);
break;
case '~':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_solid_0);
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_ice);
draw_anim(x, y, &img_solid_0, step);
draw_anim(x, y, &img_ice, step);
break;
case '/':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_semi_solid);
draw_anim(x, y, &img_semi_solid, step);
break;
case '^':
dsubimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_elevator,
((step / 2) % img_elevator_frame_count) * 16, 0, 16, 16, DIMAGE_NONE);
break;
draw_anim(x, y, &img_elevator, step);
break;
case 'S':
erase_tile(x, y, level);
*start_x = x + 2;
*start_y = y + 4;
break;
case 'E':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_exit);
draw_anim(x, y, &img_exit, step);
break;
case 'w': //water
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_water);
draw_anim(x, y, &img_water, step);
break;
case 't': //teleporter 0
dsubimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_teleporter_0,
(step % img_teleporter_0_frame_count) * 16, 0, 16, 16, DIMAGE_NONE);
tp_positions[0] = x + 2;
draw_anim(x, y, &img_teleporter_0, step);
tp_positions[0] = x + 2;
tp_positions[1] = y + 2;
break;
case 'T': //teleporter 1
dsubimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_teleporter_1,
(step % img_teleporter_1_frame_count) * 16, 0, 16, 16, DIMAGE_NONE);
tp_positions[2] = x + 2;
draw_anim(x, y, &img_teleporter_1, step);
tp_positions[2] = x + 2;
tp_positions[3] = y + 2;
break;
}