unnamed-platformer/src/draw.c

142 lines
3.6 KiB
C
Raw Normal View History

2020-02-11 11:44:37 +01:00
#include <gint/display.h>
2020-02-15 12:34:57 +01:00
#define PLAYER_SIDES 11
2020-02-11 11:44:37 +01:00
#define BG_COLOR 0
#define LEVEL_WIDTH 28
#define DRAW_OFFSET_Y -24
#define DRAW_OFFSET_X -27
2020-02-11 11:44:37 +01:00
2020-02-12 10:47:12 +01:00
extern image_t img_player; //player texture, 12x12
extern image_t img_ground; //ground texture, 16x16
extern image_t img_spike; //spike texture, 16x16
extern image_t img_ice; //ice texture, 16x8
extern image_t img_glue; //glue texture, 16x8
extern image_t img_jitem; //jump item texture, 16x16
//animated textures
extern image_t img_elevator1;
extern image_t img_elevator2;
extern image_t img_elevator3;
extern image_t img_elevator4;
extern image_t img_elevator5;
extern image_t img_elevator6;
extern image_t img_elevator7;
extern image_t img_elevator8;
extern image_t img_elevator9;
extern image_t img_elevator10;
extern image_t img_elevator11;
extern image_t img_elevator12;
extern image_t img_elevator13;
extern image_t img_elevator14;
extern image_t img_elevator15;
extern image_t img_elevator16;
image_t* ani_elevator[16] = {&img_elevator1, &img_elevator2, &img_elevator3,
&img_elevator4, &img_elevator5, &img_elevator6, &img_elevator7,
&img_elevator8, &img_elevator9, &img_elevator10, &img_elevator11,
&img_elevator12, &img_elevator13, &img_elevator14, &img_elevator15,
&img_elevator16};
2020-02-11 11:44:37 +01:00
void draw_player(int old_x, int old_y, int x, int y)
{
if (old_x != x || old_y != y)
{
2020-02-15 12:34:57 +01:00
drect(old_x + DRAW_OFFSET_X, old_y + DRAW_OFFSET_Y,
(old_x + PLAYER_SIDES) + DRAW_OFFSET_X,
(old_y + PLAYER_SIDES) + DRAW_OFFSET_Y, BG_COLOR);
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_player);
2020-02-11 11:44:37 +01:00
}
}
void draw_level(char level[], char upgrades[])
2020-02-11 11:44:37 +01:00
{
dclear(BG_COLOR);
2020-02-11 11:44:37 +01:00
unsigned int i = 0;
unsigned int x = 0;
unsigned int y = 0;
while (i != LEVEL_WIDTH*16)
2020-02-11 11:44:37 +01:00
{
switch (level[i])
{
case '0':
2020-02-15 12:34:57 +01:00
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_ground);
2020-02-11 11:44:37 +01:00
break;
2020-02-12 13:33:41 +01:00
case 'v':
2020-02-15 12:34:57 +01:00
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_spike);
2020-02-12 13:33:41 +01:00
break;
2020-02-17 15:47:02 +01:00
case '~':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_ground);
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_ice);
break;
2020-02-17 16:10:41 +01:00
case '#':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_ground);
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_glue);
break;
}
x += 16;
if (x == 16*LEVEL_WIDTH)
{
x = 0;
y += 16;
}
i++;
}
}
void draw_level_anims(char level[], char upgrades[], unsigned int step)
{
unsigned int i = 0;
unsigned int x = 0;
unsigned int y = 0;
while (i != LEVEL_WIDTH*16)
{
switch (level[i])
{
case '^':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, ani_elevator[((int)step/2)%16]);
break;
case 'j':
if (!upgrades[0])
{
unsigned int buffer = ((int)step/20)%4 - 1;
if (buffer == 2) buffer = 0;
drect(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, x + 15 + DRAW_OFFSET_X,
y + 15 + DRAW_OFFSET_Y, BG_COLOR);
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y + buffer, &img_jitem);
}
else level[i] = '.';
2020-02-17 15:47:02 +01:00
break;
2020-02-11 11:44:37 +01:00
}
2020-02-15 12:34:57 +01:00
x += 16;
if (x == 16*LEVEL_WIDTH)
2020-02-11 11:44:37 +01:00
{
x = 0;
2020-02-15 12:34:57 +01:00
y += 16;
2020-02-11 11:44:37 +01:00
}
i++;
}
}
void erase_tile(int x, int y, char level[])
{
2020-02-15 12:34:57 +01:00
x = (int)(x/16);
y = (int)(y/16);
level[x + y * 28] = '.';
x *= 16;
y *= 16;
drect(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y,
x + 15 + DRAW_OFFSET_X,
y + 15 + DRAW_OFFSET_Y, BG_COLOR);
}
void draw_upgrade_message(char item)
{
switch (item)
{
case 'j':
{
extern image_t img_jitem_popup;
dimage(96 + DRAW_OFFSET_X, 160 + DRAW_OFFSET_Y, &img_jitem_popup);
break;
}
}
}