This commit is contained in:
Masséna Fezard | Nounouille 2021-12-20 17:30:00 +01:00
parent e2d4f32a90
commit 22dbabc6f7
4 changed files with 49 additions and 14 deletions

View File

@ -1,7 +1,5 @@
#pragma once
#define PLAYER_SIZE 16
#define TILE_S 8
#define TILESET_W 12
#define TILESET_H 6

View File

@ -1,10 +1,13 @@
#pragma once
#include "main.h"
#define PLAYER_ACC 0.8
#define BASE_FRIC 0.2
#define GRAVITY 0.4
#define JUMP_H 6
#define PLAYER_SIZE 12
#define PLAYER_ACC 1
#define BASE_FRIC 0.2
#define GRAVITY 0.4
#define JUMP_H 7
#define COYOTE_TIME 3
Player player_reset(Player player, Level level);
Vec2 search(tile_t x, Level level);

View File

@ -111,7 +111,11 @@ main(void)
input_init();
Player player = {.pos = {50, 50}, .spawn = {0, 0}, .spd = {0, 0}};
Vec2 camera = {0, 0};
int running = 1;
int jumping = 1;
int airbreak = 1;
int coyote = 0;
while (running) {
@ -154,21 +158,43 @@ main(void)
player.pos.x + PLAYER_SIZE - camera.x - 1,
player.pos.y + PLAYER_SIZE - camera.y - 1, C_BLACK);
dprint(10, 10, C_BLACK, "%d", player.pos.x);
dprint(10, 30, C_BLACK, "%d", player.pos.y);
dprint(10, 10, C_BLACK, "%d", jumping);
/* input */
input_step();
Vec2 mov = {
.x = input_down(K_RIGHT) - input_down(K_LEFT),
.y = input_down(K_DOWN) - input_down(K_UP),
.y = 0,
};
player.spd.x *= (1 - BASE_FRIC); /* friction */
player.spd.y *= (1 - BASE_FRIC); /* friction */
player.spd.x += mov.x * PLAYER_ACC; /* idem */
player.spd.y += mov.y * PLAYER_ACC; /* idem */
/* on the ground */
if (collide((Vec2){player.pos.x, player.pos.y + 1}, 0, 1,
level)) {
jumping = 0;
airbreak = 0;
coyote = COYOTE_TIME;
} else {
--coyote;
}
/* JUMP */
if (input_pressed(K_A) && coyote > 0) {
player.spd.y = -JUMP_H;
jumping = 2;
coyote = 0;
airbreak = 0;
}
/* airbreak */
if (!airbreak && (!input_down(K_A) || player.spd.y > 0)) {
airbreak = 1;
}
/* moving */
player.spd.x *= (1 - BASE_FRIC); /* friction */
player.spd.x += mov.x * PLAYER_ACC; /* idem */
player.spd.y += GRAVITY + (GRAVITY * airbreak); /* gravity */
if (player.spd.x > -0.2 && player.spd.x < 0.2) {
player.spd.x = 0;
@ -180,6 +206,7 @@ main(void)
Res_Mov position = move(player, level); /* i'm crying rn */
player = position.player;
/* if the player collide with a wall */
if (position.moved.x) {
player.spd.x = 0;
}

View File

@ -80,6 +80,9 @@ collide(Vec2 pos, int h, tile_t obj, Level level)
const Vec2 pos_tl = (Vec2){pos.x + h, pos.y + h};
const Vec2 pos_br =
(Vec2){pos.x + PLAYER_SIZE - h - 1, pos.y + PLAYER_SIZE - h - 1};
const Vec2 middle =
(Vec2){pos.x + PLAYER_SIZE / 2, pos.y + PLAYER_SIZE / 2};
/* Check if there's something in */
/* the square (x, y, x + 15, y + 15) */
/* The size of the hitbox changes with h */
@ -87,7 +90,11 @@ collide(Vec2 pos, int h, tile_t obj, Level level)
if (collide_pixel(pos_tl, obj, level) ||
collide_pixel(pos_br, obj, level) ||
collide_pixel((Vec2){pos_tl.x, pos_br.y}, obj, level) ||
collide_pixel((Vec2){pos_br.x, pos_tl.y}, obj, level)) {
collide_pixel((Vec2){pos_br.x, pos_tl.y}, obj, level) ||
collide_pixel((Vec2){middle.x, pos_tl.y}, obj, level) ||
collide_pixel((Vec2){middle.x, pos_br.y}, obj, level) ||
collide_pixel((Vec2){pos_tl.x, middle.y}, obj, level) ||
collide_pixel((Vec2){pos_br.x, middle.y}, obj, level)) {
return 1;
}
return 0;