physics
This commit is contained in:
parent
e2d4f32a90
commit
22dbabc6f7
|
@ -1,7 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
#define PLAYER_SIZE 16
|
||||
|
||||
#define TILE_S 8
|
||||
#define TILESET_W 12
|
||||
#define TILESET_H 6
|
||||
|
|
|
@ -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);
|
||||
|
|
41
src/main.c
41
src/main.c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue