feat: added spawner and player/truck are now rigidbody
parent
8b233db1b6
commit
4f6d68c503
|
@ -1,4 +1,5 @@
|
||||||
#include "player.hpp"
|
#include "player.hpp"
|
||||||
|
#include "truck.hpp"
|
||||||
#include "core/callable.hpp"
|
#include "core/callable.hpp"
|
||||||
#include "core/canvas_engine.hpp"
|
#include "core/canvas_engine.hpp"
|
||||||
#include "core/collidable_node.hpp"
|
#include "core/collidable_node.hpp"
|
||||||
|
@ -7,15 +8,14 @@
|
||||||
#include "core/input/input_map.hpp"
|
#include "core/input/input_map.hpp"
|
||||||
#include "core/math/transform.hpp"
|
#include "core/math/transform.hpp"
|
||||||
#include "core/sprite.hpp"
|
#include "core/sprite.hpp"
|
||||||
#include "truck.hpp"
|
|
||||||
#include <SDL2/SDL_keyboard.h>
|
#include <SDL2/SDL_keyboard.h>
|
||||||
#include <SDL2/SDL_keycode.h>
|
#include <SDL2/SDL_keycode.h>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
Player::Player()
|
Player::Player()
|
||||||
: ce::CollidableNode("player", 0x1u, 0x1u)
|
: ce::RigidBody("player", 1.f, 0x1u, 0x1u)
|
||||||
, sprite{this->create_child<ce::Sprite>("bike", "bike")}
|
, sprite{this->create_child<ce::Sprite>("bike", "bike")} {
|
||||||
, shape{this->create_child<ce::CollisionShape>("player_col_shape", ce::Shape::make_box(.4f, 0.75f))} {
|
this->create_child<ce::CollisionShape>("player_col_shape", 0.4, 0.1f);
|
||||||
this->set_global_transform(this->get_global_transform()
|
this->set_global_transform(this->get_global_transform()
|
||||||
.translated({0.f, 2.f})
|
.translated({0.f, 2.f})
|
||||||
);
|
);
|
||||||
|
@ -36,7 +36,7 @@ Player::Player()
|
||||||
new ce::KeyboardScancode(SDL_SCANCODE_W),
|
new ce::KeyboardScancode(SDL_SCANCODE_W),
|
||||||
new ce::KeyboardScancode(SDL_SCANCODE_S)
|
new ce::KeyboardScancode(SDL_SCANCODE_S)
|
||||||
)
|
)
|
||||||
}) .changed.connect(ce::Callable<void, ce::InputValue>::make(
|
}).changed.connect(ce::Callable<void, ce::InputValue>::make(
|
||||||
this, &Player::_input_vertical_movement)
|
this, &Player::_input_vertical_movement)
|
||||||
);
|
);
|
||||||
this->overlap_enter.connect(ce::Callable<void, ce::CollisionShape *, ce::CollidableNode *, ce::CollisionShape *>::make(
|
this->overlap_enter.connect(ce::Callable<void, ce::CollisionShape *, ce::CollidableNode *, ce::CollisionShape *>::make(
|
||||||
|
@ -44,17 +44,13 @@ Player::Player()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::_tick(double const &delta) {
|
|
||||||
this->velocity = ce::Vecf::move_towards(
|
|
||||||
this->velocity,
|
|
||||||
this->input.scaled(SPEED),
|
|
||||||
ACCELERATION * delta
|
|
||||||
);
|
|
||||||
ce::Transform trans{this->get_global_transform().translated(this->velocity * delta)};
|
|
||||||
void Player::_tick(double delta) {
|
void Player::_tick(double delta) {
|
||||||
|
this->RigidBody::_tick(delta);
|
||||||
|
ce::Transform trans{this->get_global_transform()};
|
||||||
trans.position.x = std::clamp(trans.position.x, -LIMITS.x, LIMITS.x);
|
trans.position.x = std::clamp(trans.position.x, -LIMITS.x, LIMITS.x);
|
||||||
trans.position.y = std::clamp(trans.position.y, -LIMITS.y, LIMITS.y);
|
trans.position.y = std::clamp(trans.position.y, -LIMITS.y, LIMITS.y);
|
||||||
this->set_global_transform(trans);
|
this->set_global_transform(trans);
|
||||||
|
this->add_acceleration(input * ACCELERATION);
|
||||||
|
|
||||||
if(this->invincibility > 0.f) {
|
if(this->invincibility > 0.f) {
|
||||||
this->invincibility -= delta;
|
this->invincibility -= delta;
|
||||||
|
@ -73,11 +69,9 @@ void Player::_input_vertical_movement(ce::InputValue value) {
|
||||||
this->input.y = value.get<float>().value_or(0.f);
|
this->input.y = value.get<float>().value_or(0.f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::_on_overlap_enter(ce::CollisionShape *, ce::CollidableNode *other, ce::CollisionShape *) {
|
void Player::_on_overlap_enter(ce::CollisionShape *, ce::CollidableNode *other, ce::CollisionShape *shape) {
|
||||||
if(this->invincibility > 0.f)
|
if(this->invincibility > 0.f)
|
||||||
return;
|
return;
|
||||||
if(Truck *truck{dynamic_cast<Truck*>(other)}) {
|
if(Truck *truck{dynamic_cast<Truck*>(other)})
|
||||||
this->invincibility = 2.f;
|
this->invincibility = 2.f;
|
||||||
this->velocity = (this->get_global_transform().position - other->get_global_transform().position).normalized() * DAMAGE_FORCE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,22 @@
|
||||||
#ifndef PLAYER_HPP
|
#ifndef PLAYER_HPP
|
||||||
#define PLAYER_HPP
|
#define PLAYER_HPP
|
||||||
|
|
||||||
#include "core/collidable_node.hpp"
|
|
||||||
#include "core/input/input_value.hpp"
|
#include "core/input/input_value.hpp"
|
||||||
|
#include "core/rigidbody.hpp"
|
||||||
|
|
||||||
namespace ce {
|
namespace ce {
|
||||||
class CollisionShape;
|
class CollisionShape;
|
||||||
class Sprite;
|
class Sprite;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Player : public ce::CollidableNode {
|
class Player : public ce::RigidBody {
|
||||||
ce::Vecf const SPEED{3.f, 2.5f};
|
ce::Vecf const SPEED{3.f, 2.5f};
|
||||||
float const ACCELERATION{10.f};
|
float const ACCELERATION{10.f};
|
||||||
ce::Vecf const LIMITS{3.f, 3.f};
|
ce::Vecf const LIMITS{2.5f, 3.f};
|
||||||
float const DAMAGE_FLASH_FREQ{.1f};
|
float const DAMAGE_FLASH_FREQ{.1f};
|
||||||
float const DAMAGE_FORCE{6.f};
|
float const DAMAGE_FORCE{6.f};
|
||||||
|
|
||||||
ce::Vecf velocity{0.f, 0.f};
|
|
||||||
ce::Vecf input{0.f, 0.f};
|
ce::Vecf input{0.f, 0.f};
|
||||||
ce::CollisionShape *shape{nullptr};
|
|
||||||
ce::Sprite *sprite{nullptr};
|
ce::Sprite *sprite{nullptr};
|
||||||
float invincibility{0.f};
|
float invincibility{0.f};
|
||||||
public:
|
public:
|
||||||
|
@ -26,7 +24,7 @@ public:
|
||||||
virtual void _tick(double delta) override;
|
virtual void _tick(double delta) override;
|
||||||
void _input_horizontal_movement(ce::InputValue value);
|
void _input_horizontal_movement(ce::InputValue value);
|
||||||
void _input_vertical_movement(ce::InputValue value);
|
void _input_vertical_movement(ce::InputValue value);
|
||||||
void _on_overlap_enter(ce::CollisionShape *, ce::CollidableNode *node, ce::CollisionShape*);
|
void _on_overlap_enter(ce::CollisionShape *, ce::CollidableNode *node, ce::CollisionShape *shape);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // !PLAYER_HPP
|
#endif // !PLAYER_HPP
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
#include "spawner.hpp"
|
||||||
|
#include "truck.hpp"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
Spawner::Spawner()
|
||||||
|
: ce::Node("Spawner")
|
||||||
|
{}
|
||||||
|
|
||||||
|
void Spawner::_tick(double delta) {
|
||||||
|
this->timer -= delta;
|
||||||
|
if(this->timer < 0.0) {
|
||||||
|
this->timer = this->time_between_trucks;
|
||||||
|
this->time_between_trucks = std::max(
|
||||||
|
this->time_between_trucks - this->TIME_LESS_PER_TRUCK,
|
||||||
|
this->MIN_TIME_BETWEEN_TRUCKS
|
||||||
|
);
|
||||||
|
this->spawn_truck();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Spawner::spawn_truck() {
|
||||||
|
Truck *truck{this->create_child<Truck>(std::rand() % 2 != 0)};
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
#ifndef SPAWNER_HPP
|
||||||
|
#define SPAWNER_HPP
|
||||||
|
|
||||||
|
#include "core/node.hpp"
|
||||||
|
|
||||||
|
class Spawner : public ce::Node {
|
||||||
|
private:
|
||||||
|
double const MIN_TIME_BETWEEN_TRUCKS{2.f};
|
||||||
|
double const TIME_LESS_PER_TRUCK{0.25};
|
||||||
|
double time_between_trucks{7.0};
|
||||||
|
double timer{0.0};
|
||||||
|
public:
|
||||||
|
Spawner();
|
||||||
|
virtual void _tick(double delta) override;
|
||||||
|
private:
|
||||||
|
void spawn_truck();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // !SPAWNER_HPP
|
|
@ -1,29 +1,34 @@
|
||||||
#include "truck.hpp"
|
#include "truck.hpp"
|
||||||
#include "core/collision_shape.hpp"
|
#include "core/math/transform.hpp"
|
||||||
#include "core/sprite.hpp"
|
#include "core/sprite.hpp"
|
||||||
|
#include "core/collision_shape.hpp"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
#include <SDL2/SDL_log.h>
|
#include <SDL2/SDL_log.h>
|
||||||
|
|
||||||
Truck::Truck(bool left)
|
Truck::Truck(bool left)
|
||||||
: ce::CollidableNode("truck", 0x1u, 0x1u)
|
: ce::RigidBody("truck", 20.f, 0x1u, 0x1u)
|
||||||
, sprite{this->create_child<ce::Sprite>("sprite", "truck")}
|
, sprite{this->create_child<ce::Sprite>("truck_sprite", "truck")} {
|
||||||
, shape{this->create_child<ce::CollisionShape>("truck_col_shape", ce::Shape::make_box(.5f, 1.f))}
|
this->create_child<ce::CollisionShape>("truck_col_shape_0", 0.6f, 0.1f)->set_transform(ce::Transform().translated({0.f, 0.5f}));
|
||||||
, spawned_left{left} {
|
this->create_child<ce::CollisionShape>("truck_col_shape_1", 0.6f, 0.1f)->set_transform(ce::Transform().translated({0.f, -0.5f}));
|
||||||
this->sprite->set_global_transform(this->get_global_transform() .scaled({2.5f, 2.5f}));
|
this->sprite->set_global_transform(this->get_global_transform().scaled({2.5f, 2.5f}));
|
||||||
this->set_global_transform(this->get_global_transform().translated({
|
this->set_global_transform(this->get_global_transform().translated({
|
||||||
.x=this->spawned_left ? -1.4f : 1.4f,
|
.x=left ? -1.4f : 1.4f,
|
||||||
.y=-4.5f
|
.y=-4.5f
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
wave_time += delta * FREQUENCY;
|
|
||||||
ce::Transform const transform{this->get_global_transform()
|
|
||||||
.translated(ce::Vecf{
|
|
||||||
.x=std::sin(wave_time) * AMPLITUDE * (this->spawned_left > 0.f ? 1.f : -1.f),
|
|
||||||
.y=this->RELATIVE_VERTICAL_SPEED
|
|
||||||
} * float(delta))
|
|
||||||
};
|
|
||||||
this->set_global_transform(transform);
|
|
||||||
void Truck::_tick(double delta) {
|
void Truck::_tick(double delta) {
|
||||||
|
this->ce::RigidBody::_tick(delta);
|
||||||
|
ce::Transform const transform{this->get_global_transform()};
|
||||||
|
this->add_acceleration({
|
||||||
|
(transform.position.x > 0.f ? -this->ACCELERATION.x : this->ACCELERATION.x),
|
||||||
|
this->ACCELERATION.y
|
||||||
|
});
|
||||||
|
ce::Transform trans{this->get_global_transform()};
|
||||||
|
trans.position.x = std::clamp(trans.position.x, -LIMITS.x, LIMITS.x);
|
||||||
|
trans.position.y = std::max(trans.position.y, -LIMITS.y);
|
||||||
|
this->set_global_transform(trans);
|
||||||
if(transform.position.y > 4.5f)
|
if(transform.position.y > 4.5f)
|
||||||
this->flag_for_deletion();
|
this->flag_for_deletion();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,20 @@
|
||||||
#ifndef TRUCK_HPP
|
#ifndef TRUCK_HPP
|
||||||
#define TRUCK_HPP
|
#define TRUCK_HPP
|
||||||
|
|
||||||
#include "core/collidable_node.hpp"
|
#include "core/rigidbody.hpp"
|
||||||
|
|
||||||
namespace ce {
|
namespace ce {
|
||||||
class Sprite;
|
class Sprite;
|
||||||
class CollisionShape;
|
class CollisionShape;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Truck : public ce::CollidableNode {
|
class Truck : public ce::RigidBody {
|
||||||
float const AMPLITUDE{4.f};
|
|
||||||
float const FREQUENCY{3.f};
|
|
||||||
float const RELATIVE_VERTICAL_SPEED{1.5f};
|
|
||||||
float wave_time{0.f};
|
|
||||||
bool spawned_left{false};
|
|
||||||
ce::Sprite *sprite{nullptr};
|
ce::Sprite *sprite{nullptr};
|
||||||
ce::CollisionShape *shape{nullptr};
|
ce::Vecf const LIMITS{2.5f, 5.f};
|
||||||
|
ce::Vecf const ACCELERATION{5.f, 25.f};
|
||||||
public:
|
public:
|
||||||
Truck(bool left);
|
Truck(bool left);
|
||||||
virtual void _tick(double const &delta) override;
|
virtual void _tick(double delta) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // !TRUCK_HPP
|
#endif // !TRUCK_HPP
|
||||||
|
|
Loading…
Reference in New Issue