diff --git a/assets-cg/img/elevator.png b/assets-cg/img/elevator.png new file mode 100644 index 0000000..2df08a3 Binary files /dev/null and b/assets-cg/img/elevator.png differ diff --git a/levels.lua b/levels.lua index e37e30b..9551d5f 100644 --- a/levels.lua +++ b/levels.lua @@ -2,23 +2,24 @@ -- 0 solid -- - placeholder tile -- v spike +-- ^ elevator levels = {[[ ---------------------------- -00000000000000000000000000- --0........................0- --0........................0- --0........................0- --0........................0- --0........................0- --0........................0- --0........................0- --0........................00 --0.........................- --0.........................- --0.........................- --0.......................000 --0.......................00- +-00000000000000000000000000- +-00......................00- +-00..00000000000000..00^.00- +-00..000000000000v...00^.00- +-00..000000000000..0000^.00- +-00.00000000000v...0000^.00- +-00..0000000000..000000^.00- +-00..00000000v...000000^.000 +-00..00000000..00000000^...- +-000.000000v...00000000^...- +-000.........0000000000^...- +-000....j....000000000000000 +-00000000000000000000000000- -00000000000000000000000000- ---------------------------- ]], diff --git a/platform.g3a b/platform.g3a index f898399..ecdfe91 100644 Binary files a/platform.g3a and b/platform.g3a differ diff --git a/src/collide.c b/src/collide.c index 3dfae82..2357da2 100644 --- a/src/collide.c +++ b/src/collide.c @@ -13,3 +13,8 @@ char collide(int x, int y, char level[], char tile) (level[(int)((x+PLAYER_SIDES)/8) + (int)((y+PLAYER_SIDES/2)/8) * LEVEL_WIDTH] == tile)) return 1; return 0; } + +char collide_solid(int x, int y, char level[]) +{ + return (collide(x, y, level, '0') || collide(x, y, level, '^')); +} diff --git a/src/collide.h b/src/collide.h index 67642f4..f243bab 100644 --- a/src/collide.h +++ b/src/collide.h @@ -1 +1,2 @@ char collide(int x, int y, char level[], char tile); +char collide_solid(int x, int y, char level[]); diff --git a/src/draw.c b/src/draw.c index d20c294..34b7a08 100644 --- a/src/draw.c +++ b/src/draw.c @@ -24,6 +24,7 @@ void draw_level(char level[]) dclear(BG_COLOR); extern image_t img_ground; //ground texture, 16x16 extern image_t img_spike; //spike texture, 16x16 + extern image_t img_elevator; //elevator texture, 16x16 unsigned int i = 0; unsigned int x = 0; unsigned int y = 0; @@ -37,6 +38,9 @@ void draw_level(char level[]) case 'v': dimage(x * 2 + DRAW_OFFSET_X, y * 2 + DRAW_OFFSET_Y, &img_spike); break; + case '^': + dimage(x * 2 + DRAW_OFFSET_X, y * 2 + DRAW_OFFSET_Y, &img_elevator); + break; } x += 8; if (x == 8*LEVEL_WIDTH) diff --git a/src/main.c b/src/main.c index f8c8a65..1f7618a 100644 --- a/src/main.c +++ b/src/main.c @@ -64,12 +64,12 @@ int main(void) hspd = 0; if (keydown(KEY_LEFT)) hspd -= WALK_SPD; if (keydown(KEY_RIGHT)) hspd += WALK_SPD; - if (!collide(player_x + hspd, player_y, level, '0')) + if (!collide_solid(player_x + hspd, player_y, level)) { player_x += hspd; } //ground detection - if (collide(player_x, player_y + 1, level, '0')) on_ground = 6; + if (collide_solid(player_x, player_y + 1, level)) on_ground = 6; else { if (vspd > MIN_VSPD) vspd += GRAV; @@ -93,14 +93,14 @@ int main(void) //vertical collision { int trunc_vspd = vspd; //truncate vspd - if (!collide(player_x, player_y + trunc_vspd, level, '0')) + if (!collide_solid(player_x, player_y + trunc_vspd, level)) { player_y += trunc_vspd; } else { int sign_vspd = sgn(trunc_vspd); - while (!collide(player_x, player_y + sign_vspd, level, '0')) + while (!collide_solid(player_x, player_y + sign_vspd, level)) { player_y += sign_vspd; } @@ -113,11 +113,17 @@ int main(void) player_x = start_x; player_y = start_y; } + //elevator collision and raise + if (collide(player_x - 1, player_y, level, '^') || + collide(player_x + 1, player_y, level, '^')) + { + if (vspd < 8) vspd -= GRAV; + } //borders collision - if (player_x <= 8) + if (player_x <= 11) { level_id -= 1; - player_x = 201; + player_x = 207; set_start_pos(&start_x, &start_y, player_x, player_y); set_level(level_id, level); draw_level(level); @@ -126,7 +132,7 @@ int main(void) else if (player_x >= 208) { level_id += 1; - player_x = 9; + player_x = 12; set_start_pos(&start_x, &start_y, player_x, player_y); set_level(level_id, level); draw_level(level);