size_t rects_size;
};
+static const vec_t opposing_rect_side_forces[RECT_SIDE_N] = {
+ { .x = 1.0f, .y = 0.0f }, /* RECT_SIDE_LEFT = 0, */
+ { .x = -1.0f, .y = 0.0f }, /* RECT_SIDE_RIGHT, */
+ { .x = 0.0f, .y = 1.0f, }, /* RECT_SIDE_TOP, */
+ { .x = 0.0f, .y = -1.0f, } /* RECT_SIDE_BOTTOM, */
+};
+
platforms_t *create_platforms(const rect_t *rects, size_t rects_size)
{
assert(rects);
return 0;
}
-void platforms_rect_object_collide(const platforms_t *platforms,
- const rect_t *object,
- int *sides)
+vec_t platforms_rect_object_collide(const platforms_t *platforms,
+ rect_t object)
{
assert(platforms);
- assert(object);
+
+ int sides[4];
+ memset(sides, 0, sizeof(sides));
for (size_t i = 0; i < platforms->rects_size; ++i) {
- rect_object_impact(object, &platforms->rects[i], sides);
+ rect_object_impact(&object, &platforms->rects[i], sides);
+ }
+
+ vec_t opposing_force = {
+ .x = 0.0f,
+ .y = 0.0f
+ };
+
+ for (rect_side_t side = 0; side < RECT_SIDE_N; ++side) {
+ if (sides[side]) {
+ vec_add(
+ &opposing_force,
+ opposing_rect_side_forces[side]);
+ }
}
+
+ return opposing_force;
}
SDL_Renderer *renderer,
const camera_t *camera);
-void platforms_rect_object_collide(const platforms_t *platforms,
- const rect_t *object,
- int *sides);
+vec_t platforms_rect_object_collide(const platforms_t *platforms,
+ rect_t object);
#endif // PLATFORMS_H_
free(player);
}
+rect_t player_hitbox(const player_t *player)
+{
+ rect_t hitbox = {
+ .x = player->position.x,
+ .y = player->position.y,
+ .w = PLAYER_WIDTH,
+ .h = PLAYER_HEIGHT
+ };
+
+ return hitbox;
+}
+
int render_player(const player_t * player,
SDL_Renderer *renderer,
const camera_t *camera)
float d = (float) delta_time / 1000.0f;
- rect_t player_object = rect_from_point(
- vec_sum(
- player->position,
- vec_scala_mult(
- vec_sum(
- player->velocity,
- player->movement),
- d)),
- PLAYER_WIDTH,
- PLAYER_HEIGHT);
-
- int sides[4] = {0, 0, 0, 0};
-
- platforms_rect_object_collide(platforms, &player_object, sides);
-
- if (sides[RECT_SIDE_LEFT] || sides[RECT_SIDE_RIGHT]) {
- player->velocity.x = 0.0f;
- player->movement.x = 0.0f;
- }
-
- if (sides[RECT_SIDE_TOP] || sides[RECT_SIDE_BOTTOM]) {
- player->velocity.y = 0.0f;
- player->movement.y = 0.0f;
- }
-
-
- vec_add(
- &player->position,
+ player->velocity.y += PLAYER_GRAVITY * d;
+ player->position = vec_sum(
+ player->position,
vec_scala_mult(
vec_sum(
player->velocity,
player->movement),
d));
+ player->position.y = fmodf(player->position.y, 800.0f);
- player->velocity.y += PLAYER_GRAVITY * d;
+ vec_t opposing_force = platforms_rect_object_collide(
+ platforms,
+ player_hitbox(player));
+
+ while (vec_length(opposing_force) > 1e-6) {
+ player->position = vec_sum(
+ player->position,
+ vec_scala_mult(
+ opposing_force,
+ 1e-2f));
+
+ if (fabs(opposing_force.x) > 1e-6 && (opposing_force.x < 0.0f) != ((player->velocity.x + player->movement.x) < 0.0f)) {
+ player->velocity.x = 0.0f;
+ player->movement.x = 0.0f;
+ }
+
+ if (fabs(opposing_force.y) > 1e-6 && (opposing_force.y < 0.0f) != ((player->velocity.y + player->movement.y) < 0.0f)) {
+ player->velocity.y = 0.0f;
+ player->movement.y = 0.0f;
+ }
+
+ opposing_force = platforms_rect_object_collide(
+ platforms,
+ player_hitbox(player));
+ }
}
void player_move_left(player_t *player)
{
assert(player);
- player->velocity.y = -1000.0f;
+ player->velocity.y = -500.0f;
}
void player_focus_camera(player_t *player,
const platforms_t *platforms,
Uint32 delta_time);
+rect_t player_hitbox(const player_t *player);
+
void player_move_left(player_t *player);
void player_move_right(player_t *player);
void player_stop(player_t *player);
+#include <math.h>
#include "./point.h"
vec_t vec(float x, float y)
return result;
}
+vec_t vec_neg(vec_t v)
+{
+ vec_t result = {
+ .x = -v.x,
+ .y = -v.y
+ };
+
+ return result;
+}
+
+float vec_length(vec_t v)
+{
+ return sqrtf(v.x * v.x + v.y * v.y);
+}
+
void vec_add(vec_t *v1, vec_t v2)
{
v1->x += v2.x;
};
return result;
}
+
+vec_t vec_entry_mult(vec_t v1, vec_t v2)
+{
+ vec_t result = {
+ .x = v1.x * v2.x,
+ .y = v1.y * v2.y
+ };
+
+ return result;
+}
vec_t vec(float x, float y);
vec_t vec_sum(vec_t v1, vec_t v2);
+vec_t vec_neg(vec_t v);
void vec_add(vec_t *v1, vec_t v2);
+float vec_length(vec_t v);
vec_t vec_scala_mult(vec_t v, float scalar);
+vec_t vec_entry_mult(vec_t v1, vec_t v2);
#endif // POINT_H_
line_t object_side = rect_side(*object, side);
line_t int_side = rect_side(int_area, side);
- if (line_length(int_side) > 1.0f) {
+ if (line_length(int_side) > 10.0f) {
sides[side] =
(fabs(object_side.p1.x - object_side.p2.x) < 1e-6
&& fabs(object_side.p1.x - int_side.p1.x) < 1e-6