Spikes and variable jump height

This commit is contained in:
KikooDX 2020-02-12 13:33:41 +01:00
parent 7488170b9d
commit 6968705367
6 changed files with 44 additions and 23 deletions

BIN
assets-cg/img/spike.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 B

View File

@ -1,19 +1,19 @@
levels = {[[
..........................
.000000000000000000000000.
.0......................0.
.0......................0.
.0......................0.
.0......................0.
.0.........00...........0.
.0.........00...........0.
.0......................0.
.0...............0......0.
.0......................0.
.0.........00...........0.
.0.s.......00...........0.
.000000000000000000000000.
..........................
00000000000000000000000000
00000000000000000000000000
00......................00
00......................00
00......................00
00.........v............00
00.........00...........00
00.........00...........00
00................v.....00
00...............0v.....00
00......................00
00........v00...........00
00.s.....vv00...........00
00000000000000000000000000
00000000000000000000000000
]]
}

Binary file not shown.

View File

@ -22,16 +22,20 @@ void draw_player(int old_x, int old_y, int x, int y)
void draw_level(char level[], int *player_x, int *player_y)
{
extern image_t img_ground; //ground texture, 16x16
extern image_t img_spike; //spike texture, 16x16
unsigned int i = 0;
unsigned int x = 0;
unsigned int y = 0;
while (i != LEVEL_WIDTH*14)
while (i != LEVEL_WIDTH*15)
{
switch (level[i])
{
case '0':
dimage(x * 2 + DRAW_OFFSET_X, y * 2 + DRAW_OFFSET_Y, &img_ground);
break;
case 'v':
dimage(x * 2 + DRAW_OFFSET_X, y * 2 + DRAW_OFFSET_Y, &img_spike);
break;
case 's':
*player_x = x + 1;
*player_y = y + 2;

View File

@ -4,7 +4,7 @@ void set_level(unsigned char level_id, char *level) {
switch (level_id)
{
case 0:
memcpy(level, "...........................000000000000000000000000..0......................0..0......................0..0......................0..0......................0..0.........00...........0..0.........00...........0..0......................0..0...............0......0..0......................0..0.........00...........0..0.s.......00...........0..000000000000000000000000...........................", 390);
memcpy(level, "000000000000000000000000000000000000000000000000000000......................0000......................0000......................0000.........v............0000.........00...........0000.........00...........0000................v.....0000...............0v.....0000......................0000........v00...........0000.s.....vv00...........000000000000000000000000000000000000000000000000000000", 390);
break;
}
}

View File

@ -6,8 +6,8 @@
#include "levels.h"
#define WALK_SPD 1
#define MIN_VSPD -8
#define JUMP_SPD -4
#define MIN_VSPD -8.0
#define JUMP_SPD -3.4
#define GRAV 0.2
void jump_test(char *jump_pressed, char *jump_buffer, unsigned int *jump_hold); //test if jump pressed
@ -23,7 +23,7 @@ int callback(volatile void *arg)
int main(void)
{
volatile int has_ticked = 1; //fps cap
char level[14*25];
char level[390];
unsigned char level_id = 0;
char jump_pressed = 0; //avoid holding jump
char jump_buffer = 0; //jump buffer, last 3 frames
@ -33,10 +33,14 @@ int main(void)
char on_ground = 6; //remember if player is on solid
int player_x = 0;
int player_y = 0;
int start_x = 0;
int start_y = 0;
int old_x, old_y;
dclear(0); //0 -> black
dclear(0); //black
set_level(level_id, level);
draw_level(level, &player_x, &player_y);
draw_level(level, &start_x, &start_y);
player_x = start_x;
player_y = start_y;
old_x = player_x + 1; //offset to draw it on first cycle
old_y = player_y;
//fps cap timer
@ -63,6 +67,7 @@ int main(void)
else
{
if (vspd > MIN_VSPD) vspd += GRAV;
if (jump_hold)
if (on_ground) on_ground--;
}
//vertical movement
@ -71,7 +76,14 @@ int main(void)
if (jump_buffer && on_ground) {
vspd = JUMP_SPD;
on_ground = 0;
jump_hold = 10;
}
else if (jump_hold && keydown(KEY_SHIFT))
{
jump_hold--;
vspd -= GRAV / 2;
}
else jump_hold = 0;
//vertical collision
{
int trunc_vspd = vspd; //truncate vspd
@ -89,6 +101,12 @@ int main(void)
vspd = 0;
}
}
//spike collision and death
if (collide(player_x, player_y, level, 'v'))
{
player_x = start_x;
player_y = start_y;
}
//exit
if (keydown(KEY_EXIT)) return 0;
}
@ -98,7 +116,6 @@ void jump_test(char *jump_pressed, char *jump_buffer, unsigned int *jump_hold)
{
if (keydown(KEY_SHIFT))
{
*jump_hold += 1;
if (!*jump_pressed)
{
*jump_pressed = 1;