Improved levels.lua, implemented screen transition system
This commit is contained in:
parent
e9340bce08
commit
2d39739cf4
64
levels.lua
64
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 <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)
|
||||
|
|
BIN
platform.g3a
BIN
platform.g3a
Binary file not shown.
|
@ -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;
|
||||
}
|
||||
|
|
15
src/draw.c
15
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)
|
||||
|
|
|
@ -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[]);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
void set_level(unsigned char level_id, char level[]);
|
||||
void set_level(int level_id, char level[]);
|
||||
|
|
56
src/main.c
56
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;
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
Loading…
Reference in New Issue