-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCircleActor.cpp
More file actions
77 lines (61 loc) · 1.51 KB
/
CircleActor.cpp
File metadata and controls
77 lines (61 loc) · 1.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "CircleActor.h"
void CircleActor::state( const State& state )
{
s = state.s;
v = state.v;
a = state.a;
}
CircleActor::State CircleActor::state()
{
State st;
st.s = s;
st.v = v;
st.a = a;
return st;
}
void CircleActor::init()
{
isActive = true;
isMovable = true;
isDeadly = true;
isAttractor = false;
}
CircleActor::CircleActor()
{
init();
}
CircleActor::CircleActor( const CircleActor::vector_type& position )
: Actor( position )
{
init();
}
CircleActor::State CircleActor::on_off_screen( State state )
{
if( state.s.x() - radius() < Arena::minX )
state.s.x( Arena::minX + radius() );
else if( state.s.x() + radius() > Arena::maxX )
state.s.x( Arena::maxX - radius() );
if( state.s.y() - radius() < Arena::minY )
state.s.y( Arena::minY + radius() );
else if( state.s.y() + radius() > Arena::maxY )
state.s.y( Arena::maxY - radius() );
return state;
}
CircleActor::State CircleActor::integrate( State state, int dt, value_type maxSpeed )
{
if( !isMovable )
return state;
state = on_off_screen( state );
Actor::simple_integration( state.s, state.v, state.a, dt, maxSpeed );
return state;
}
void CircleActor::move_impl( float dt, value_type maxSpeed )
{
previousS = s;
state( integrate(state(), dt, maxSpeed) );
}
bool collision( const CircleActor& c1, const CircleActor& c2 )
{
return c1.isActive && c2.isActive &&
magnitude(c1.s - c2.s) < c1.radius() + c2.radius();
}