1
1
#include " ActorStateMachine.h"
2
2
3
3
extern char debug[1024 ];
4
-
4
+ extern SCENEid sID ;
5
5
using namespace std ;
6
6
#define MOVE_LENGTH 20.0
7
7
@@ -12,6 +12,9 @@ ActorStateMachine::ActorStateMachine(void)
12
12
13
13
ActorStateMachine::~ActorStateMachine (void )
14
14
{
15
+ FnScene scene;
16
+ scene.Object (sID );
17
+ scene.DeleteObject (this ->bloodID );
15
18
}
16
19
17
20
ActorStateMachine::ActorStateMachine (ACTORid character, char * ActionFilename){
@@ -22,10 +25,35 @@ ActorStateMachine::ActorStateMachine(ACTORid character, char * ActionFilename){
22
25
this ->lastAttackIndex = 0 ;
23
26
this ->newAttack = FALSE ;
24
27
this ->effectiveAttack = FALSE ;
25
- this ->life = 3 ;
26
28
this ->initActionIDMap (ActionFilename);
29
+ this ->initLife ();
27
30
}
28
31
32
+ BOOL ActorStateMachine::initLife (){
33
+ this ->life = 100 ;
34
+
35
+ FnScene scene;
36
+ scene.Object (sID );
37
+ bloodID = scene.CreateObject (ROOT);
38
+ FnObject blood;
39
+ blood.Object (bloodID);
40
+ // FnBillBoard blood;
41
+ // blood.Object(bloodID, 0);
42
+ FnActor actor;
43
+ actor.Object (this ->character );
44
+ OBJECTid baseID = actor.GetBaseObject ();
45
+
46
+ float pos[3 ], size[2 ], color[3 ];
47
+ pos[0 ] = 0 .0f ;
48
+ pos[1 ] = 0 .0f ;
49
+ pos[2 ] = 80 .0f ;
50
+ size[0 ] = 50 .0f ;
51
+ size[1 ] = 2 .0f ;
52
+ color[0 ] = 1 .0f ; color[1 ] = color[2 ] = 0 .0f ;
53
+ blood.Billboard (pos, size, NULL , 0 , color);
54
+ blood.SetParent (baseID);
55
+ return TRUE ;
56
+ }
29
57
BOOL ActorStateMachine::initActionIDMap (char *ActionFilename){
30
58
FILE *fp = fopen (ActionFilename," r" );
31
59
if (fp == NULL ){
@@ -100,14 +128,6 @@ int ActorStateMachine::ChangeState(ActorState s, BOOL forceSet){
100
128
this ->currentAttackIndex = 0 ;
101
129
this ->lastAttackIndex = 0 ;
102
130
this ->SetNewAction (" HeavyDamage" );
103
- this ->life --;
104
- sprintf (debug, " %s life=%d\n " , debug, this ->life );
105
- if (this ->life <= 0 ) {
106
- // it will make a recursive call.
107
- this ->ChangeState (STATEDIE, TRUE );
108
- // prevent the damage actionID will replace the die actionID
109
- return 0 ;
110
- }
111
131
}else if (s == STATEDIE){
112
132
this ->SetNewAction (" Die" );
113
133
}
@@ -176,7 +196,7 @@ BOOL ActorStateMachine::PlayAction(int skip){
176
196
BOOL ActorStateMachine::PlayAttackAction (int skip){
177
197
FnActor actor;
178
198
actor.Object (this ->character );
179
- ACTIONid actionID;
199
+ // ACTIONid actionID;
180
200
181
201
char attackName[20 ] = " \0 " ;
182
202
if (this ->startAttack == TRUE ){// first attack
@@ -261,4 +281,40 @@ BOOL ActorStateMachine::UpdateEffectiveAttack(){
261
281
int ActorStateMachine::AttackEnemy (float enemyPos[3 ]){
262
282
// the return value is the attack power
263
283
return FALSE ;
284
+ }
285
+
286
+ void ActorStateMachine::TakeDamage (float damage, BOOL beShot, float *attackerPos ){
287
+ FnActor actor;
288
+ actor.Object (character);
289
+ float pos[3 ];
290
+ float dir[3 ];
291
+ actor.GetWorldPosition (pos);
292
+ actor.GetWorldDirection (dir, NULL );
293
+ if (attackerPos !=NULL ){
294
+ float newDir[3 ];
295
+ newDir[0 ] = attackerPos[0 ] - pos[0 ];
296
+ newDir[1 ] = attackerPos[1 ] - pos[1 ];
297
+ newDir[2 ] = 0 .0f ;
298
+ actor.SetWorldDirection (newDir,NULL );
299
+ if (beShot == TRUE ){
300
+ actor.MoveForward (-OUTSHOT_DIS,TRUE , FALSE , 0.0 , TRUE );
301
+ }else {
302
+ actor.MoveForward (-1 .0f ,TRUE , FALSE , 0.0 , TRUE );
303
+ }
304
+ actor.SetWorldDirection (dir,NULL );
305
+ }
306
+ this ->life -= damage;
307
+ sprintf (debug, " %s life=%d\n " , debug, this ->life );
308
+ if (this ->life <= 0 ) {
309
+ this ->ChangeState (STATEDIE, TRUE );
310
+ }else {
311
+ this ->ChangeState (STATEDAMAGE, TRUE );
312
+ }
313
+
314
+ FnBillBoard blood;
315
+ blood.Object (bloodID, 0 );
316
+ float size[2 ];
317
+ blood.GetSize (size);
318
+ size[0 ] = life / MAX_LIFE * 50 .0f ;
319
+ blood.SetSize (size);
264
320
}
0 commit comments