Main Page   Modules   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   Related Pages  

/home/rdbrown/doxygen/cse125g1/src/modules/actor/Actor.cpp

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 //      anim.Load(tokens,skel.numJoints);
00015 //      animPlayer.SetAnimation(&anim);
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                                         //cerr << player->getName() << " moving.\n";
00034                                         feet->play();
00035                                 } else if (feet->isPlaying() && !player->isMoving()) {
00036                                         //cerr << player->getName() << " stopped.\n";
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                 //cerr << player->getName() << " rewinding.\n";
00089                 feet->rewind();
00090         }
00091         if(InputKeyIsDown('o') || InputKeyIsDown('O'))
00092                 ToggleSkin();
00093         if(InputKeyIsDown('p') || InputKeyIsDown('P'))
00094                 ToggleSkel();
00095         
00096 //      for(int i = 0; i < ACTOR_MAX_WEAPONS; i++)
00097         /*
00098         if(player) weaponState = player->weaponState - 1;
00099         else weaponState = 0;
00100         if(weapons[weaponState])
00101                 weapons[weaponState]->update(dt);*/
00102 }
00103 void Actor::SetAnimation1(char newAnim)
00104 {
00105         if(newAnim != anim1)
00106         {
00107                 //cerr << newAnim << endl;
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                 //cerr << newAnim << endl;
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         //grab anim info from the player, if there is one
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         for(int i = 0; i < ACTOR_MAX_WEAPONS; i++)
00164                 if(weapons[i])
00165                         weapons[i]->draw();
00166                         */
00167 }
00168 
00169 
00170 void Actor::Pose(float time)
00171 {
00172         /*
00173         int k = 3;
00174         float *pose = anim.GetPose(time);
00175 
00176         skel.joints.ResetIterator();
00177         for(int i = 0; i < skel.joints.GetLength(); i++)
00178         {
00179                 BallJoint *joint = (BallJoint*)skel.joints.IteratorNext();
00180                 joint->x.SetVal(pose[k++]);
00181                 joint->y.SetVal(pose[k++]);
00182                 joint->z.SetVal(pose[k++]);
00183         }
00184         BallJoint *root= (BallJoint*)skel.joints.GetItem(0);
00185         root->offset.Set(pose[0],pose[1],pose[2]);
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 }

Generated on Thu Aug 18 16:03:09 2005 for Robin Hood: Thieves & Knights by doxygen1.2.18