Improved levels.lua, implemented screen transition system

This commit is contained in:
KikooDX 2020-02-13 09:12:34 +01:00
parent e9340bce08
commit 2d39739cf4
10 changed files with 117 additions and 59 deletions

View File

@ -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 <gint/std/string.h>
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)

Binary file not shown.

View File

@ -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;
}

View File

@ -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)

View File

@ -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[]);

View File

@ -1,10 +1,13 @@
#include "levels.h"
#include <gint/std/string.h>
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;
}
}

View File

@ -1 +1 @@
void set_level(unsigned char level_id, char level[]);
void set_level(int level_id, char level[]);

View File

@ -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;

24
src/player.c Normal file
View File

@ -0,0 +1,24 @@
#include <gint/keyboard.h>
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;
}

2
src/player.h Normal file
View File

@ -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);