orton_runner/src/game/collision.c

88 lines
2.7 KiB
C

/*
** EPITECH PROJECT, 2018
** task01
** File description:
** I do task
*/
#include "game/game.h"
#include "game/core.h"
void collision_pik(sfml_t *sfml)
{
uint8_t *map = sfml->scene->level->map;
int x = sfml->scene->player->x;
int y = sfml->scene->player->y;
int width = sfml->scene->level->width;
if (map[(x + 8 >> 6) + (y >> 6) * width] == ID_PIK_LEFT
|| map[(x + 8 >> 6) + (y + 64 >> 6) * width] == ID_PIK_LEFT
|| map[(x + 56 >> 6) + (y >> 6) * width] == ID_PIK_RIGHT
|| map[(x + 56 >> 6) + (y + 64 >> 6) * width] == ID_PIK_RIGHT
|| map[(x + 8 >> 6) + (y + 16 >> 6) * width] == ID_PIK_DOWN
|| map[(x + 56 >> 6) + (y + 16 >> 6) * width] == ID_PIK_DOWN
|| map[(x + 8 >> 6) + (y + 48 >> 6) * width] == ID_PIK_UP
|| map[(x + 56 >> 6) + (y + 48 >> 6) * width] == ID_PIK_UP){
sfml->scene->player->action = PLAYER_DEAD;
sfml->scene->player->dead_counter = 0;
}
}
void collision_player_run(scene_t *scene)
{
uint8_t *map = scene->level->map;
int x = scene->player->x;
int y = scene->player->y;
if (map[(x + 8 >> 6) + (y + 1 >> 6) * scene->level->width] == ID_GROUND
|| map[(x + 8 >> 6) + (y + 63 >> 6) *
scene->level->width] == ID_GROUND){
scene->player->x = ((scene->player->x - 8) >> 6 << 6) + 55;
scene->player->action &= ~(PLAYER_RUN | PLAYER_JUMP);
scene->player->action |= PLAYER_IDLE;
scene->player->dx = 0;
return;
}
if (map[(x + 54 >> 6) + (y + 1 >> 6) * scene->level->width] == ID_GROUND
|| map[(x + 54 >> 6) +
(y + 63 >> 6) * scene->level->width] == ID_GROUND){
scene->player->x = ((scene->player->x - 8) >> 6 << 6) + 9;
scene->player->action &= ~(PLAYER_RUN | PLAYER_JUMP);
scene->player->action |= PLAYER_IDLE;
scene->player->dx = 0;
}
}
void collision_player_jump(scene_t *scene)
{
uint8_t *map = scene->level->map;
int x = scene->player->x;
int y = scene->player->y;
if (map[(x + 9 >> 6) + (y >> 6) * scene->level->width] == ID_GROUND
|| map[(x + 53 >> 6) + (y >> 6) * scene->level->width] == ID_GROUND){
scene->player->y = (scene->player->y >> 6 << 6) + 64;
scene->player->counter_jump = PLAYER_MAX_JUMP;
scene->player->dy = 1;
}
if (map[(x + 53 >> 6) + (y + 64 >> 6) *
scene->level->width] == ID_GROUND
|| map[(x + 9 >> 6) + (y + 64 >> 6) *
scene->level->width] == ID_GROUND){
scene->player->y = ((scene->player->y - 64) >> 6 << 6) + 64;
scene->player->action &= ~(PLAYER_CANT_JUMP | PLAYER_JUMP);
scene->player->counter_jump = 0;
scene->player->dy = 1;
}
}
void collision_wall(sfml_t *sfml)
{
if (sfml->scene->wall->x + WALL_SIZE + 16 > sfml->scene->player->x){
sfml->scene->player->action = PLAYER_DEAD;
sfml->scene->player->dead_counter = 0;
}
if (sfml->scene->wall->x + WALL_SIZE > sfml->scene->level->width << 6)
sfml->scene->wall->x =
(sfml->scene->level->width << 6) - WALL_SIZE;
}