Kinoko
A reimplementation of Mario Kart Wii's physics engine in C++
Toggle main menu visibility
Loading...
Searching...
No Matches
ObjectFirebar.cc
1
#include "ObjectFirebar.hh"
2
3
namespace
Kinoko::Field
{
4
6
ObjectFirebar::ObjectFirebar(
const
System::MapdataGeoObj ¶ms) :
ObjectCollidable
(params) {
7
m_spokes = std::max<u32>(1, params.setting(3));
8
size_t
fireballCount = std::max<u32>(1, params.setting(0) * m_spokes);
9
m_angSpeed =
static_cast<
f32
>
(
static_cast<
s16
>
(params.setting(1)));
10
11
m_fireballs = owning_span<ObjectFireball *>(fireballCount);
12
13
for
(
size_t
i = 0; i < fireballCount; ++i) {
14
m_fireballs[i] = EGG::egg_new<ObjectFireball>(params);
15
m_fireballs[i]->load();
16
17
f32 ring = 1.0f +
static_cast<
f32
>
(i / m_spokes);
18
m_fireballs[i]->setDistance(
19
ring * (100.0f *
static_cast<
f32
>
(
static_cast<
s16
>
(params.setting(2)))));
20
m_fireballs[i]->setAngle((360.0f / m_spokes) * (i % m_spokes));
21
}
22
23
EGG::Matrix34f mat;
24
mat.makeR(rot());
25
m_axis = mat.base(2);
26
m_axis.normalise();
27
m_initDir = m_axis.cross(RotateAxisAngle(F_PI / 2.0f, EGG::Vector3f::ex, m_axis));
28
m_initDir.normalise();
29
}
30
32
ObjectFirebar::~ObjectFirebar() =
default
;
33
35
void
ObjectFirebar::init() {
36
m_degAngle = 0.0f;
37
}
38
40
void
ObjectFirebar::calc() {
41
m_degAngle += m_angSpeed / 60.0f;
42
43
if
(m_degAngle > 360.0f) {
44
m_degAngle -= 360.0f;
45
}
else
if
(m_degAngle < 0.0f) {
46
m_degAngle += 360.0f;
47
}
48
49
for
(
auto
*&fireball : m_fireballs) {
50
EGG::Vector3f dir = m_initDir * fireball->distance();
51
fireball->setPos(
52
pos() + RotateAxisAngle((m_degAngle + fireball->angle()) * DEG2RAD, m_axis, dir));
53
}
54
}
55
56
}
// namespace Kinoko::Field
Kinoko::Field::ObjectCollidable
Definition
ObjectCollidable.hh:18
Kinoko::Field
Pertains to collision.
Definition
BoxColManager.cc:10
game
field
obj
ObjectFirebar.cc
Made by
Malleo
. Logo by
vabold
. Website generated by
Doxygen
1.17.0