hyperultra/src/player.c

83 lines
2.0 KiB
C
Raw Normal View History

2023-03-18 23:40:10 +01:00
#include "deathpart.h"
2023-03-18 21:54:01 +01:00
#include "entityimpl.h"
2023-03-18 23:40:10 +01:00
#include "game.h"
2023-03-17 16:38:10 +01:00
#include "input.h"
2023-03-17 17:00:47 +01:00
#include <math.h>
2023-03-17 10:51:17 +01:00
2023-03-18 23:40:10 +01:00
IMPL_UPDATE() {
2023-03-17 16:38:10 +01:00
const int on_ground = entity_collide(this, g, 0, 1);
2023-03-17 17:00:47 +01:00
this->vel[0] = 2.0 * this->player.dirx;
2023-03-18 23:40:10 +01:00
this->vel[1] *= AIR_RESISTANCE;
this->vel[1] += GRAVITY;
2023-03-17 16:54:07 +01:00
this->player.scale_x += 0.1 * (1.0 - this->player.scale_x);
this->player.scale_y += 0.1 * (1.0 - this->player.scale_y);
if (fabs(this->player.scale_x - 1.0) < 0.05) this->player.scale_x = 1.01;
if (fabs(this->player.scale_y - 1.0) < 0.05) this->player.scale_y = 1.01;
2023-03-17 16:38:10 +01:00
if (on_ground && input_pressed(K_O)) {
const int diry = input_down(K_UP) - input_down(K_DOWN);
switch (diry) {
case -1:
this->vel[1] = -2.8;
2023-03-17 16:54:07 +01:00
this->player.scale_x = 0.75;
this->player.scale_y = 1.25;
2023-03-17 16:38:10 +01:00
break;
default:
case 0:
this->vel[1] = -3.8;
2023-03-17 16:54:07 +01:00
this->player.scale_x = 0.66;
this->player.scale_y = 1.33;
2023-03-17 16:38:10 +01:00
break;
case 1:
this->vel[1] = -4.8;
2023-03-17 16:54:07 +01:00
this->player.scale_x = 0.5;
this->player.scale_y = 1.5;
2023-03-17 16:38:10 +01:00
break;
}
2023-03-17 18:19:06 +01:00
} else if (on_ground && input_down(K_X)) {
this->vel[0] *= 3;
this->player.scale_x *= 1.05;
2023-03-17 16:38:10 +01:00
}
2023-03-17 11:06:37 +01:00
entity_move(this, g);
2023-03-17 19:03:59 +01:00
if (this->vel[0] == 0.0 && this->vel[1] >= -0.0)
2023-03-17 17:00:47 +01:00
this->player.dirx *= -1;
2023-03-17 21:07:07 +01:00
2023-03-18 23:40:10 +01:00
if (this->bonk_ceiling) {
int dy = this->pos[1] - 6;
for (int y = 0; y < 7; y++) {
int dx = this->pos[0] - 6;
for (int x = 0; x < 7; x++) {
deathpart_init(game_create_entity(g), dx, dy);
dx += 2;
}
dy += 2;
}
this->type = ET_NONE;
g->queue_restart_scene = 30;
}
2023-03-18 19:15:05 +01:00
2023-03-18 21:54:01 +01:00
if (entity_place_meeting(this, g, ET_exit) != NULL)
2023-03-17 21:07:07 +01:00
g->queue_next_scene = true;
2023-03-18 23:40:10 +01:00
} IMPL_END
2023-03-17 10:51:17 +01:00
2023-03-18 23:40:10 +01:00
IMPL_DRAW() {
2023-03-17 13:45:20 +01:00
LZY_DrawSetColor(BLACK);
2023-03-17 16:54:07 +01:00
int width = (int)(this->width / 2) * this->player.scale_x;
int height = (int)(this->height / 2) * this->player.scale_y;
width *= 2;
height *= 2;
LZY_DrawRect(this->pos[0] - width / 2,
this->pos[1] - height / 2,
width, height);
2023-03-18 23:40:10 +01:00
} IMPL_END
2023-03-17 10:51:17 +01:00
2023-03-18 23:40:10 +01:00
IMPL_INIT(player) {
2023-03-17 10:57:19 +01:00
this->width = 12;
this->height = 12;
2023-03-17 16:54:07 +01:00
this->player.scale_x = 1.0;
this->player.scale_y = 1.0;
2023-03-17 17:00:47 +01:00
this->player.dirx = 1;
2023-03-18 23:40:10 +01:00
} IMPL_END