diff --git a/levels.lua b/levels.lua index 553ca6b..3fd4003 100644 --- a/levels.lua +++ b/levels.lua @@ -1,20 +1,46 @@ +-- . air +-- 0 solid +-- - placeholder tile +-- v spike + levels = {[[ -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 -]] +---------------------------- +-00000000000000000000000000- +-0........................0- +-0........................0- +-0........................0- +-0........................0- +-0........................0- +-0........................0- +-0........................0- +-0........................00 +-0.........................- +-0.........................- +-0.........................- +-0........................00 +-0........................0- +-00000000000000000000000000- +---------------------------- +]], +[[ +---------------------------- +-00000000000000000000000000- +-00000000000000000000000000- +-000000000000000000000000000 +-00000000000...............- +-0000000000................- +-0000000000....0000000000000 +-0000000000.....00000000000- +-00000000..........00000000- +000000.............00000000- +-..........-.00000000000000- +-..........0000000000000000- +-.......0000000000000000000- +000000000000000000000000000- +-00000000000000000000000000- +-00000000000000000000000000- +---------------------------- +]], } to_write = "" @@ -22,14 +48,14 @@ to_write = "" --remove all "\n" from level strings for i, v in ipairs(levels) do v = string.gsub(v, "\n", "") - to_write = to_write.." case "..(i-1)..":\n memcpy(level, \""..v.."\", "..#v..");\n break;" + to_write = to_write.." case "..(i-1)..":\n memcpy(level, \""..v.."\", "..#v..");\n break;\n" end --finish and write to_write = [[#include "levels.h" #include -void set_level(unsigned char level_id, char *level) { +void set_level(int level_id, char *level) { switch (level_id) { -]]..to_write.."\n }\n}\n" +]]..to_write.." }\n}\n" io.write(to_write) diff --git a/platform.g3a b/platform.g3a index bbfa2ee..7def09a 100644 Binary files a/platform.g3a and b/platform.g3a differ diff --git a/src/collide.c b/src/collide.c index aa5eedb..3dfae82 100644 --- a/src/collide.c +++ b/src/collide.c @@ -1,5 +1,5 @@ #define PLAYER_SIDES 5 -#define LEVEL_WIDTH 26 +#define LEVEL_WIDTH 28 char collide(int x, int y, char level[], char tile) { @@ -11,5 +11,5 @@ char collide(int x, int y, char level[], char tile) (level[(int)((x+PLAYER_SIDES/2)/8) + (int)(y/8) * LEVEL_WIDTH] == tile) || (level[(int)((x+PLAYER_SIDES/2)/8) + (int)((y+PLAYER_SIDES)/8) * LEVEL_WIDTH] == tile) || (level[(int)((x+PLAYER_SIDES)/8) + (int)((y+PLAYER_SIDES/2)/8) * LEVEL_WIDTH] == tile)) return 1; - else return 0; + return 0; } diff --git a/src/draw.c b/src/draw.c index 1075be7..d20c294 100644 --- a/src/draw.c +++ b/src/draw.c @@ -2,9 +2,9 @@ #define PLAYER_SIDES 5 #define BG_COLOR 0 -#define LEVEL_WIDTH 26 -#define DRAW_OFFSET_Y -8 -#define DRAW_OFFSET_X -11 +#define LEVEL_WIDTH 28 +#define DRAW_OFFSET_Y -24 +#define DRAW_OFFSET_X -27 extern image_t img_player; //player texture, 12x12 @@ -19,14 +19,15 @@ void draw_player(int old_x, int old_y, int x, int y) } } -void draw_level(char level[], int *player_x, int *player_y) +void draw_level(char level[]) { + dclear(BG_COLOR); 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*15) + while (i != LEVEL_WIDTH*17) { switch (level[i]) { @@ -36,10 +37,6 @@ void draw_level(char level[], int *player_x, int *player_y) 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; - break; } x += 8; if (x == 8*LEVEL_WIDTH) diff --git a/src/draw.h b/src/draw.h index ba84a11..a0e4c57 100644 --- a/src/draw.h +++ b/src/draw.h @@ -1,2 +1,2 @@ void draw_player(int old_x, int old_y, int x, int y); -void draw_level(char level[], int *player_x, int *player_y); +void draw_level(char level[]); diff --git a/src/levels.c b/src/levels.c index 9ac8f56..cda6a73 100644 --- a/src/levels.c +++ b/src/levels.c @@ -1,10 +1,13 @@ #include "levels.h" #include -void set_level(unsigned char level_id, char *level) { +void set_level(int level_id, char *level) { switch (level_id) { case 0: - memcpy(level, "000000000000000000000000000000000000000000000000000000......................0000......................0000......................0000.........v............0000.........00...........0000.........00...........0000................v.....0000...............0v.....0000......................0000........v00...........0000.s.....vv00...........000000000000000000000000000000000000000000000000000000", 390); + memcpy(level, "-----------------------------00000000000000000000000000--0........................0--0........................0--0........................0--0........................0--0........................0--0........................0--0........................0--0........................00-0.........................--0.........................--0.........................--0........................00-0........................0--00000000000000000000000000-----------------------------", 476); + break; + case 1: + memcpy(level, "-----------------------------00000000000000000000000000--00000000000000000000000000--000000000000000000000000000-00000000000...............--0000000000................--0000000000....0000000000000-0000000000.....00000000000--00000000..........00000000-000000.............00000000--..........-.00000000000000--..........0000000000000000--.......0000000000000000000-000000000000000000000000000--00000000000000000000000000--00000000000000000000000000-----------------------------", 476); break; } } diff --git a/src/levels.h b/src/levels.h index 9beff74..04d8536 100644 --- a/src/levels.h +++ b/src/levels.h @@ -1 +1 @@ -void set_level(unsigned char level_id, char level[]); +void set_level(int level_id, char level[]); diff --git a/src/main.c b/src/main.c index 2a6ddcb..22b47d9 100644 --- a/src/main.c +++ b/src/main.c @@ -4,11 +4,13 @@ #include "draw.h" #include "collide.h" #include "levels.h" +#include "player.h" #define WALK_SPD 1 #define MIN_VSPD -8.0 #define JUMP_SPD -3.4 #define GRAV 0.2 +#define UG_CAN_JUMP upgrades[0] void jump_test(char *jump_pressed, char *jump_buffer, unsigned int *jump_hold); //test if jump pressed int sgn(int number); //return the sign of input double @@ -23,8 +25,13 @@ int callback(volatile void *arg) int main(void) { volatile int has_ticked = 1; //fps cap - char level[390]; - unsigned char level_id = 0; + char level[477]; + int level_id = 1; + //start upgrades (mostly bools) + char upgrades[] = { + 0 //can jump + }; + //end upgrades char jump_pressed = 0; //avoid holding jump char jump_buffer = 0; //jump buffer, last 3 frames unsigned int jump_hold = 0; //number of consecutive frames jump has been held @@ -33,12 +40,11 @@ int main(void) int 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 start_x = 18*8 + 1; + int start_y = 9*8 + 2; int old_x, old_y; - dclear(0); //black set_level(level_id, level); - draw_level(level, &start_x, &start_y); + draw_level(level); player_x = start_x; player_y = start_y; old_x = player_x + 1; //offset to draw it on first cycle @@ -60,7 +66,7 @@ int main(void) if (keydown(KEY_RIGHT)) hspd += WALK_SPD; if (!collide(player_x + hspd, player_y, level, '0')) { - player_x += hspd; + player_x += hspd; } //ground detection if (collide(player_x, player_y + 1, level, '0')) on_ground = 6; @@ -71,7 +77,7 @@ int main(void) if (on_ground) on_ground--; } //vertical movement - jump_test(&jump_pressed, &jump_buffer, &jump_hold); + if (UG_CAN_JUMP) jump_test(&jump_pressed, &jump_buffer, &jump_hold); //if jump is pressed and on ground if (jump_buffer && on_ground) { vspd = JUMP_SPD; @@ -106,29 +112,29 @@ int main(void) { player_x = start_x; player_y = start_y; + } + //borders collision + else if (player_x <= 2) + { + level_id--; + player_x = 229; + set_start_pos(&start_x, &start_y, player_x, player_y); + set_level(level_id, level); + draw_level(level); + } + else if (player_x >= 222) + { + level_id++; + player_x = 9; + set_start_pos(&start_x, &start_y, player_x, player_y); + set_level(level_id, level); + draw_level(level); } //exit if (keydown(KEY_EXIT)) return 0; } } -void jump_test(char *jump_pressed, char *jump_buffer, unsigned int *jump_hold) -{ - if (keydown(KEY_SHIFT)) - { - if (!*jump_pressed) - { - *jump_pressed = 1; - *jump_buffer = 3; - } - } - else { - *jump_hold = 0; - *jump_pressed = 0; - } - if (*jump_buffer) *jump_buffer -= 1; -} - int sgn(int number) { if (number < 0) return -1; diff --git a/src/player.c b/src/player.c new file mode 100644 index 0000000..a6e5987 --- /dev/null +++ b/src/player.c @@ -0,0 +1,24 @@ +#include + +void jump_test(char *jump_pressed, char *jump_buffer, unsigned int *jump_hold) +{ + if (keydown(KEY_SHIFT)) + { + if (!*jump_pressed) + { + *jump_pressed = 1; + *jump_buffer = 3; + } + } + else { + *jump_hold = 0; + *jump_pressed = 0; + } + if (*jump_buffer) *jump_buffer -= 1; +} + +void set_start_pos(int *start_x, int *start_y, int x, int y) +{ + *start_x = x; + *start_y = y; +} diff --git a/src/player.h b/src/player.h new file mode 100644 index 0000000..8163e0b --- /dev/null +++ b/src/player.h @@ -0,0 +1,2 @@ +void jump_test(char *jump_pressed, char *jump_buffer, unsigned int *jump_hold); +void set_start_pos(int *start_x, int *start_y, int x, int y);