00001 #include "Actor.h"
00002 #include "audio/audio.h"
00003 #include "input/Input.h"
00004 #include "resources/resources.h"
00005 #include <iostream>
00006
00007 void Actor::Load(char *filename)
00008 {
00009 Tokenizer tokens;
00010 tokens.Open(filename);
00011
00012 skel.Load(tokens);
00013 skin.Load(tokens);
00014
00015
00016 animPlayer1.Play();
00017 animPlayer2.Play();
00018 tokens.Close();
00019 showSkin = true;
00020 showSkel = false;
00021 }
00022
00023 void Actor::update(float dt)
00024 {
00025 skin.SetSkel(skel.joints);
00026 if(player)
00027 {
00028 world = player->world;
00029
00030 if (feet) {
00031 try {
00032 if (!feet->isPlaying()&& player->isMoving()) {
00033
00034 feet->play();
00035 } else if (feet->isPlaying() && !player->isMoving()) {
00036
00037 feet->stop();
00038 }
00039 } catch (AudioException &ex) {
00040 delete feet;
00041 createFeet();
00042 }
00043 }
00044 try {
00045 if (health > player->getHealth())
00046 {
00047 player->game->hitLocation = player->world.d;
00048 player->game->hitLocation.y = 4.0f;
00049 player->game->hitHappened = true;
00050 mouth->playSound(3);
00051 }
00052 } catch (AudioException &ex) {
00053 delete mouth;
00054 createMouth();
00055 }
00056 health = player->getHealth();
00057
00058 skel.SetWorld(world);
00059 weaponState = player->weaponState - 1;
00060 for(int i = 0; i < ACTOR_MAX_WEAPONS; i++) {
00061 if(i == weaponState) weapons[i]->showSkin = true;
00062 else weapons[i]->showSkin = false;
00063 }
00064
00065 Vector3 headLoc = world.d;
00066 headLoc.y += getTop();
00067
00068 if (feet) {
00069 try {
00070 feet->getSource().setPosition(world.d);
00071 } catch (AudioException &ex) {
00072 delete feet;
00073 createFeet();
00074 }
00075 }
00076
00077 try {
00078 mouth->setPosition(headLoc);
00079 } catch (AudioException &ex) {
00080 delete mouth;
00081 createMouth();
00082 }
00083 }
00084 UpdateAnimations(dt);
00085 skel.Update();
00086 skin.Update();
00087 if (feet && !feet->update()) {
00088
00089 feet->rewind();
00090 }
00091 if(InputKeyIsDown('o') || InputKeyIsDown('O'))
00092 ToggleSkin();
00093 if(InputKeyIsDown('p') || InputKeyIsDown('P'))
00094 ToggleSkel();
00095
00096
00097
00098
00099
00100
00101
00102 }
00103 void Actor::SetAnimation1(char newAnim)
00104 {
00105 if(newAnim != anim1)
00106 {
00107
00108 animPlayer1.Stop();
00109 anim1 = newAnim;
00110 animPlayer1.SetAnimation(anims + anim1);
00111 animPlayer1.Play();
00112 }
00113 }
00114 void Actor::SetAnimation2(char newAnim)
00115 {
00116 if(newAnim != anim2)
00117 {
00118
00119 animPlayer2.Stop();
00120 anim2 = newAnim;
00121 animPlayer2.SetAnimation(anims + anim2);
00122 animPlayer2.Play();
00123 }
00124 }
00125 void Actor::UpdateAnimations(float dt)
00126 {
00127 AnimPose *pose1 = NULL, *pose2 = NULL;
00128
00129 if(player)
00130 {
00131 SetAnimation1(player->torsoAnim);
00132 SetAnimation2(player->legsAnim);
00133 }
00134 if(anim1)
00135 {
00136 animPlayer1.Update(dt);
00137 pose1 = animPlayer1.GetPose();
00138 if(anims[anim1].done)
00139 player->clientAnimDone();
00140 }
00141 if(anim2)
00142 {
00143 animPlayer2.Update(dt);
00144 pose2 = animPlayer2.GetPose();
00145 if(anims[anim2].done)
00146 player->clientAnimDone();
00147 }
00148 if(pose1 && pose2)
00149 skel.BlendPose(pose1, pose2);
00150 else if(pose1)
00151 skel.Pose(pose1);
00152 else if(pose2)
00153 skel.Pose(pose2);
00154 }
00155
00156 void Actor::draw()
00157 {
00158 if(showSkin)
00159 skin.Draw();
00160 if(showSkel)
00161 skel.Draw();
00162
00163
00164
00165
00166
00167 }
00168
00169
00170 void Actor::Pose(float time)
00171 {
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187 }
00188
00189 void Actor::SetPlayer(MMNet::Player *player) {
00190 this->player = player;
00191 if (player) {
00192 world = player->world;
00193 health = player->getHealth();
00194 if (feet != NULL)
00195 delete feet;
00196 createFeet();
00197
00198 if (mouth != NULL)
00199 delete mouth;
00200 createMouth();
00201 }
00202 }
00203
00204 void Actor::createMouth() {
00205 mouth = new MMAudio::Source();
00206 mouth->setRolloff(0);
00207 }
00208
00209 void Actor::createFeet() {
00210 char *fn = resFindResource("sounds/footsteps.ogg");
00211 try {
00212 feet = new MMAudio::Stream(fn);
00213 if (player->isLocalPlayer()) {
00214 feet->getSource().setGain(.2);
00215 } else {
00216 feet->getSource().setGain(.5);
00217 feet->getSource().setRolloff(2);
00218 }
00219 free(fn);
00220 } catch (AudioException &ex) {
00221 feet = 0;
00222 }
00223 }