Really too many mechanics.

This commit is contained in:
KikooDX 2020-03-19 11:39:28 +01:00
parent 9196d2b6ea
commit 35df21af02
26 changed files with 564 additions and 538 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
build-cg/*

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 B

After

Width:  |  Height:  |  Size: 137 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +1,4 @@
char collide(int x, int y, char level[], char tile);
char collide_solid(int x, int y, char level[]);
char collide_solid(int x, int y, char level[], char polarity);
char collide_point(int x, int y, char level[], char tile);
char collide_and_erase(int x, int y, char level[], char tile);

View File

@ -1,5 +1,5 @@
void draw_player(int old_x, int old_y, int x, int y);
void draw_level(char level[]);
void draw_level_anims(char level[], unsigned int step);
void draw_player(int x, int y);
void draw_level(char level[], unsigned int step, char polarity, int *start_x,
int *start_y);
void erase_tile(int x, int y, char level[]);
void draw_timer(unsigned int step); //coucou Lephé'

Binary file not shown.

View File

@ -1,7 +1,7 @@
#include "collide.h"
#include "draw.h"
#define PLAYER_H 15
#define PLAYER_H 11
#define PLAYER_W 11
#define LEVEL_WIDTH 28
@ -20,9 +20,13 @@ char collide_point(int x, int y, char level[], char tile)
return (level[(int)(x/16) + (int)(y/16) * LEVEL_WIDTH] == tile);
}
char collide_solid(int x, int y, char level[])
char collide_solid(int x, int y, char level[], char polarity)
{
return (collide(x, y, level, '0') ||
char collided;
if (polarity) collided = collide(x, y, level, 'b');
else collided = collide(x, y, level, 'r');
return (collided ||
collide(x, y, level, '0') ||
collide(x, y, level, '^') ||
collide(x, y, level, '~'));
}

View File

@ -1,17 +1,24 @@
#include <gint/display.h>
#include <gint/display.h>
#include "draw.h"
#define PLAYER_H 15
#define PLAYER_H 11
#define PLAYER_W 11
#define BG_COLOR 0
#define LEVEL_WIDTH 28
#define DRAW_OFFSET_Y -24
#define DRAW_OFFSET_X -27
extern image_t img_player; //player texture, 12x12
extern image_t img_player; //player texture, 16x12
extern image_t img_ground; //ground texture, 16x16
extern image_t img_spike; //spike texture, 16x16
extern image_t img_bouncer; //bouncer texture, 16x16
extern image_t img_ice; //ice texture, 16x8
extern image_t img_blue; //blue bloc texture, 16x16
extern image_t img_blue_dot; //off blue bloc texture, 16x16
extern image_t img_red; //red bloc texture, 16x16
extern image_t img_red_dot; //off red bloc texture, 16x16
extern image_t img_exit; //exit texture, 16x16
extern image_t img_water; //water texture, 16x16
//animated textures
extern image_t img_elevator1, img_elevator2, img_elevator3, img_elevator4;
extern image_t img_elevator5, img_elevator6, img_elevator7, img_elevator8;
@ -23,18 +30,13 @@ const image_t * ani_elevator[16] = {&img_elevator1, &img_elevator2,
&img_elevator11, &img_elevator12, &img_elevator13, &img_elevator14,
&img_elevator15, &img_elevator16};
void draw_player(int old_x, int old_y, int x, int y)
void draw_player(int x, int y)
{
if (old_x != x || old_y != y)
{
drect(old_x + DRAW_OFFSET_X, old_y + DRAW_OFFSET_Y,
(old_x + PLAYER_W) + DRAW_OFFSET_X,
(old_y + PLAYER_H) + DRAW_OFFSET_Y, BG_COLOR);
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_player);
}
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_player);
}
void draw_level(char level[])
void draw_level(char level[], unsigned int step, char polarity, int *start_x,
int *start_y)
{
dclear(BG_COLOR);
unsigned int i = 0;
@ -47,9 +49,20 @@ void draw_level(char level[])
case '0':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_ground);
break;
case 'r':
if (!polarity) dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_red);
else dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_red_dot);
break;
case 'b':
if (polarity) dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_blue);
else dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_blue_dot);
break;
case 'v':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_spike);
break;
case '*':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_bouncer);
break;
case '~':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_ground);
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_ice);
@ -57,29 +70,20 @@ void draw_level(char level[])
case 's':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_ground);
break;
}
x += 16;
if (x == 16*LEVEL_WIDTH)
{
x = 0;
y += 16;
}
i++;
}
}
void draw_level_anims(char level[], unsigned int step)
{
unsigned int i = 0;
unsigned int x = 0;
unsigned int y = 0;
while (i != LEVEL_WIDTH*16)
{
switch (level[i])
{
case '^':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, ani_elevator[(step/2)%16]);
break;
case 'S':
erase_tile(x, y, level);
*start_x = x;
*start_y = y;
break;
case 'E':
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_exit);
break;
case 'w': //water
dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_water);
break;
}
x += 16;
if (x == 16*LEVEL_WIDTH)
@ -98,9 +102,6 @@ void erase_tile(int x, int y, char level[])
level[x + y * LEVEL_WIDTH] = '.';
x *= 16;
y *= 16;
drect(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y,
x + 15 + DRAW_OFFSET_X,
y + 15 + DRAW_OFFSET_Y, BG_COLOR);
}
void draw_timer(unsigned int step)

File diff suppressed because one or more lines are too long

View File

@ -1,23 +1,22 @@
#include <gint/keyboard.h>
#include <gint/timer.h>
#include <gint/clock.h>
#include <gint/display.h>
#include "draw.h"
#include "collide.h"
#include "levels.h"
#include "player.h"
#define MAX_HSPD 2.5
#define ACCELERATION 1
#define ACCELERATION 1.0
#define DECELERATION 0.5
#define MIN_VSPD -12.0
#define MAX_VSPD 12
#define MAX_VSPD 6.0
#define JUMP_SPD -3.99
#define GRAV 0.4
#define JUMP_SCALE 12
#define JUMP_SCALE 8
#define JUMP_REDUCTION -0.41
#define UG_CAN_JUMP upgrades[0]
char coins[256];
#define DRAW_LEVEL() draw_level(level)
#define DRAW_LEVEL() draw_level(level, step, polarity, &start_x, &start_y)
void dupdate(); //gint function
//test if jump pressed
@ -47,16 +46,14 @@ int main(void)
int player_y = 0;
int start_x = 18*16 + 2;
int start_y = 9*16 + 4;
int old_x, old_y;
char spawn_buffer = 0;
unsigned int step = 0;
char pswap_held = 0;
char polarity = 0; //0 -> blue, 1 -> red
set_level(level_id, level);
DRAW_LEVEL();
draw_level_anims(level, step);
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
timer_setup(0, timer_delay(0, 16667), 0, callback, &has_ticked);
timer_start(0);
@ -65,14 +62,22 @@ int main(void)
has_ticked = 0;
//START DRAW
step++;
draw_level_anims(level, step);
draw_player(old_x, old_y, player_x, player_y);
DRAW_LEVEL();
draw_player(player_x, player_y);
draw_timer(step);
dupdate();
old_y = player_y;
old_x = player_x;
//END DRAW
clearevents();
//polarity swap first
if (keydown(KEY_OPTN))
{
if (!pswap_held)
{
pswap_held = 1;
polarity = !polarity;
}
}
else pswap_held = 0;
//horizontal movement & collision
{
move = 0;
@ -98,14 +103,14 @@ int main(void)
trunc_hspd = hspd * direction;
if (1) //glue was here
{
if (!collide_solid(player_x + trunc_hspd, player_y, level))
if (!collide_solid(player_x + trunc_hspd, player_y, level, polarity))
{
player_x += trunc_hspd;
}
else
{
int sign_hspd = sgn(trunc_hspd);
while (!collide_solid(player_x + sign_hspd, player_y, level))
while (!collide_solid(player_x + sign_hspd, player_y, level, polarity))
{
player_x += sign_hspd;
}
@ -114,7 +119,7 @@ int main(void)
}
}
//ground detection
if (vspd >= 0 && collide_solid(player_x, player_y + 1, level))
if (vspd >= 0 && collide_solid(player_x, player_y + 1, level, polarity))
{
on_ground = 6;
vspd = 0;
@ -132,7 +137,7 @@ int main(void)
//vertical movement
jump_test(&jump_pressed, &jump_buffer, &jump_hold);
//jump
if (jump_buffer && on_ground) {
if (jump_buffer && (on_ground || collide(player_x, player_y, level, 'w'))) {
vspd = JUMP_SPD;
on_ground = 0;
jump_hold = JUMP_SCALE;
@ -156,16 +161,22 @@ int main(void)
//vertical collision
{
int trunc_vspd = vspd; //truncate vspd
//bouncer
if (collide(player_x, player_y + trunc_vspd, level, '*'))
{
vspd = -vspd - 2;
trunc_vspd = vspd;
}
if (trunc_vspd)
{
if (!collide_solid(player_x, player_y + trunc_vspd, level))
if (!collide_solid(player_x, player_y + trunc_vspd, level, polarity))
{
player_y += trunc_vspd;
}
else
{
int sign_vspd = sgn(trunc_vspd);
while (!collide_solid(player_x, player_y + sign_vspd, level))
while (!collide_solid(player_x, player_y + sign_vspd, level, polarity))
{
player_y += sign_vspd;
}
@ -179,38 +190,27 @@ int main(void)
{
player_x = start_x;
player_y = start_y;
polarity = 0;
vspd = 0;
}
//borders collision
if (player_x <= 22)
{
player_x = 414;
}
else if (player_x >= 416)
{
player_x = 24;
}
else if (player_y <= 8)
{
level_id -= 100;
player_y = 246;
spawn_buffer = 1;
set_start_pos(&start_x, &start_y, player_x, player_y);
set_level(level_id, level);
DRAW_LEVEL();
reset_old_pos(&old_x, &old_y);
}
else if (player_y >= 248)
{
level_id += 100;
player_y = 10;
set_start_pos(&start_x, &start_y, player_x, player_y);
set_level(level_id, level);
DRAW_LEVEL();
reset_old_pos(&old_x, &old_y);
}
//border warp
if (player_x <= 22) player_x = 414;
else if (player_x >= 416) player_x = 24;
else if (player_y <= 8) player_y = 246;
else if (player_y >= 248) player_y = 10;
//secret way/hidden passage
collide_and_erase(player_x, player_y, level, 's');
//next level (exit)
if (collide(player_x, player_y, level, 'E'))
{
level_id++;
set_level(level_id, level);
DRAW_LEVEL();
player_x = start_x;
player_y = start_y;
polarity = 0;
vspd = 0;
}
//exit
if (keydown(KEY_EXIT)) return 0;
}