r79 - in trunk/src: . objects

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Tue Feb 1 08:33:04 EST 2005


Author: jonas
Date: 2005-02-01 08:33:04 -0500 (Tue, 01 Feb 2005)
New Revision: 79

Modified:
   trunk/src/characters_common.cpp
   trunk/src/characters_common.h
   trunk/src/events.cpp
   trunk/src/events.h
   trunk/src/objects/erik.cpp
   trunk/src/objects/fang.cpp
   trunk/src/objects/olaf.cpp
   trunk/src/objects/scorch.cpp
   trunk/src/objects/water.cpp
   trunk/src/objects/zombie.cpp
   trunk/src/players_common.cpp
Log:
Changed the horizontal speed management to be similar to the vertical:
 - Introduced a horizontal inert mass
 - Introduced a constant horizontal air resistance
 - Removed all occurencies of Speed modifiers, increased/decreased the
   maximal horizonzal speed instead
 - simplified (or removed) Speed/Run events
 - tweaked ?\209?\155ome speed settings for zombies and olaf (small)



Modified: trunk/src/characters_common.cpp
===================================================================
--- trunk/src/characters_common.cpp	2005-01-31 19:16:29 UTC (rev 78)
+++ trunk/src/characters_common.cpp	2005-02-01 13:33:04 UTC (rev 79)
@@ -16,7 +16,6 @@
   hspeed(0),
   speed(0),
   gravity(900),
-  speedmod(100),
   Dgrav(0),
   im_die(NULL),
   dense_types(NOTHING),
@@ -86,8 +85,8 @@
 
 Hit Character::move(Uint16 dt, bool check) {
     SDL_Rect dest=pos;
-    dest.x+=Sint16((hspeed*speedmod*dt)/100000);
-    dest.y+=Sint16((speed*speedmod*dt)/100000);
+    dest.x+=Sint16((hspeed*dt)/1000);
+    dest.y+=Sint16((speed*dt)/1000);
     
     Hit hit=checkMove(dest,check);
     

Modified: trunk/src/characters_common.h
===================================================================
--- trunk/src/characters_common.h	2005-01-31 19:16:29 UTC (rev 78)
+++ trunk/src/characters_common.h	2005-02-01 13:33:04 UTC (rev 79)
@@ -9,6 +9,7 @@
 #define V_KRIT          1000
 #define T_GRAV_EFFECT   10
 #define T_AI_EFFECT     20
+#define SPEED_STEP      10
  
 //Character states
 //facing: either left or right (not left)
@@ -60,11 +61,11 @@
         }
         //@}
         //@{
-        void applySpeedMod(Uint16 speedm) {
-            speedmod=Uint16(speedmod*speedm/100);
+        Uint16 addMaxSpeed(Sint16 dmax) {
+            return maxspeedx=max(0,maxspeedx+dmax);
         }
-        void setSpeedMod(Uint16 speedm) {
-            speedmod=speedm;
+        Uint16 setMaxSpeed(Uint16 maxs) {
+            return maxspeedx=maxs;
         }
         //@}
         //@{
@@ -165,8 +166,6 @@
         Sint16 speed;
         //current gravity
         Sint16 gravity;
-        //current speedmod
-        Uint16 speedmod;
         //temporary attributes
         Sint16 Dgrav;
         //Die animation

Modified: trunk/src/events.cpp
===================================================================
--- trunk/src/events.cpp	2005-01-31 19:16:29 UTC (rev 78)
+++ trunk/src/events.cpp	2005-02-01 13:33:04 UTC (rev 79)
@@ -124,37 +124,32 @@
     CEvent::cancel();
 }
 
-ESpeed::ESpeed(Character* chr, Uint16 length, Sint16 avspeed, Sint16 ahspeed, Uint16 edelay, Uint32 switchstate, Mix_Chunk* esound, Animation* runanim, bool delanim):
-  CAnimEvent(chr,length,edelay,switchstate,esound,runanim,delanim),
-  vspeed(avspeed),
-  hspeed(ahspeed) { }
-void ESpeed::start() {
-    charowner->addSpeed(vspeed);
-    charowner->addHSpeed(hspeed);
-    CAnimEvent::start();
-}
-void ESpeed::end() {
-    if (started) charowner->addHSpeed(-hspeed);
-    CAnimEvent::end();
-}
-void ESpeed::cancel() {
-    if (started) charowner->addHSpeed(-hspeed);
-    CAnimEvent::cancel();
-}
 
-
-ERun::ERun(Character* chr, Uint16 length, Sint16 inispeed, Sint16 ahspeed, Uint16 edelay, Uint32 switchstate, Mix_Chunk* esound, Animation* runanim, bool delanim):
-  ESpeed(chr,length,0,ahspeed,edelay,(switchstate|STATE_PRESS_LR),esound,runanim,delanim),
-  ispeed(inispeed),
+ERun::ERun(Character* chr, Uint16 length, Sint16 edmax, Uint16 edelay, Uint32 switchstate, Mix_Chunk* esound, Animation* runanim, bool delanim):
+  CAnimEvent(chr,length,edelay,(switchstate|STATE_PRESS_LR),esound,runanim,delanim),
+  dmax(edmax),
   t_reset(0) {
     charowner->setState(STATE_RUN);
-    charowner->addHSpeed(ispeed);
 }
 ERun::~ERun() {
     charowner->unsetState(STATE_RUN);
-    charowner->addHSpeed(-ispeed);
     owner->clearEvents();
 }
+void ERun::start() {
+    charowner->addMaxSpeed(dmax);
+    CAnimEvent::start();
+}
+
+void ERun::end() {
+    if (started) charowner->addMaxSpeed(-dmax);
+    CAnimEvent::end();
+}
+
+void ERun::cancel() {
+    if (started) charowner->addMaxSpeed(-dmax);
+    CAnimEvent::cancel();
+}
+
 void ERun::reset() {
     t_reset=0;
 }
@@ -164,7 +159,7 @@
     if (t_reset>100) {
         evstate=EV_CANCEL;
     } else {
-        evstate=ESpeed::update(dt);
+        evstate=CAnimEvent::update(dt);
     } 
     return evstate;
 }

Modified: trunk/src/events.h
===================================================================
--- trunk/src/events.h	2005-01-31 19:16:29 UTC (rev 78)
+++ trunk/src/events.h	2005-02-01 13:33:04 UTC (rev 79)
@@ -113,43 +113,28 @@
         Uint16 mask;
 };
 
-/** \brief Speed modification event
-
-    Modifies the vertical and/or the horizontal speed.
-*/
-class ESpeed : public CAnimEvent {
-    public:
-        /// \param avspeed Vertical speed to be add when the event starts
-        /// \param ahspeed Horizontal speed to be add when the event starts
-        ESpeed(Character* chr, Uint16 length, Sint16 avspeed, Sint16 ahspeed=0, Uint16 edelay=0,
-          Uint32 switchstate=0, Mix_Chunk* esound=NULL, Animation* runanim=NULL, bool delanim=false);
-        virtual void start();
-        virtual void end();  
-        virtual void cancel();
-    protected:
-        Sint16 vspeed;
-        Sint16 hspeed;
-};
-
 /** \brief Delayed (accelerated) run event
 
     A special speed event that increases the horizontal speed after a while,
     has to be constantly maintained using reset().
 */
-class ERun : public ESpeed {
+class ERun : public CAnimEvent {
     public:
         /// Adds the initial speed
         /// \param inispeed Initial horizontal speed to be added
         /// \param ahspeed Horizontal speed to be added when the event starts
-        ERun(Character* chr, Uint16 length, Sint16 inispeed, Sint16 ahspeed, Uint16 edelay=0,
+        ERun(Character* chr, Uint16 length, Sint16 edmax, Uint16 edelay=0,
           Uint32 switchstate=0, Mix_Chunk* esound=NULL, Animation* runanim=NULL, bool delanim=false);
         virtual ~ERun();
         /// Forces the event to continue
+        virtual void start(); 
+        virtual void end(); 
+        virtual void cancel(); 
         virtual void reset(); 
         /// If the event wasn't forced to continue it will shortly end
         virtual Uint16 update(Uint16 dt);
     protected:
-        Sint16 ispeed;
+        Sint16 dmax;
         Sint16 t_reset;
 };
 

Modified: trunk/src/objects/erik.cpp
===================================================================
--- trunk/src/objects/erik.cpp	2005-01-31 19:16:29 UTC (rev 78)
+++ trunk/src/objects/erik.cpp	2005-02-01 13:33:04 UTC (rev 79)
@@ -46,10 +46,12 @@
     if (state&STATE_ACT_2) {
     } else if (state&STATE_ACT_1) {
         setState(STATE_ACT_2);
-        setEvent(new ESpeed(this,DE_JUMP,jump2,0,0,0,au_jump));
+        addSpeed(jump2);
+        setEvent(new CAnimEvent(this,DE_JUMP,0,0,au_jump));
     } else {
         setState(STATE_ACT_1);
-        setEvent(new ESpeed(this,DE_JUMP,jump));
+        addSpeed(jump);
+        setEvent(new CAnimEvent(this,DE_JUMP));
     }
 }
 
@@ -61,15 +63,11 @@
         if (state&STATE_RUN) cancelEvent();
         return;
     }
-    dense_types|=OTYPE_MONSTER;
     if (state&STATE_RUN) {
+        dense_types|=OTYPE_MONSTER;
         if (state&STATE_FALL) cancelEvent();
-    } else if (state&STATE_MLEFT) {
-        sfxeng->playWAV(au_run);
-        setEvent(new ERun(this,10000,Sint16(-1/2*maxspeedx),-maxspeedx,500,ESTATE_ABORT,au_run));
-    } else if (state&STATE_MRIGHT) {
-        sfxeng->playWAV(au_run);
-        setEvent(new ERun(this,10000,Sint16(1/2*maxspeedx),maxspeedx,500,ESTATE_ABORT,au_run));
+    } else if (state&(STATE_MLEFT|STATE_MRIGHT)) {
+        setEvent(new ERun(this,10000,maxspeedx,500,ESTATE_ABORT,au_run));
     }
 }
 

Modified: trunk/src/objects/fang.cpp
===================================================================
--- trunk/src/objects/fang.cpp	2005-01-31 19:16:29 UTC (rev 78)
+++ trunk/src/objects/fang.cpp	2005-02-01 13:33:04 UTC (rev 79)
@@ -48,6 +48,10 @@
 }
 
 void Fang::fall(Uint16 dt) {
+    if (!getState(STATE_MRIGHT|STATE_MLEFT)) {
+        if (!getState(STATE_FALL)) hspeed*=0.9;
+        else hspeed*=0.96;  
+    }
     Dgrav+=dt;
     if (Dgrav>T_GRAV_EFFECT) {
         if (state&STATE_FALL) {
@@ -74,15 +78,20 @@
         unsetState(STATE_LEFT);
         unsetState(STATE_CLIMB_L);
         setState(STATE_ACT_1);
-        setEvent(new ESpeed(this,T_JUMPOFF,V_JUMPOFF,Sint16(maxspeedx*1.5),0,0,au_jump));
+        addSpeed(V_JUMPOFF);
+        addHSpeed(maxspeedx);
+        setEvent(new CAnimEvent(this,T_JUMPOFF,0,0,au_jump));
     } else if (state&STATE_CLIMB_R) {
         setState(STATE_LEFT);
         unsetState(STATE_CLIMB_R);
         setState(STATE_ACT_1);
-        setEvent(new ESpeed(this,T_JUMPOFF,V_JUMPOFF,Sint16(-maxspeedx*1.5),0,0,au_jump));
+        addSpeed(V_JUMPOFF);
+        addHSpeed(-maxspeedx);
+        setEvent(new CAnimEvent(this,T_JUMPOFF,0,0,au_jump));
     } else if ((!(state&STATE_FALL)) && (!(state&STATE_ACT_1))){
         setState(STATE_ACT_1);
-        setEvent(new ESpeed(this,DE_JUMP,V_JUMP,0,0,0,au_jump));
+        addSpeed(V_JUMP);
+        setEvent(new CAnimEvent(this,DE_JUMP,0,0,au_jump));
     }
 }
 

Modified: trunk/src/objects/olaf.cpp
===================================================================
--- trunk/src/objects/olaf.cpp	2005-01-31 19:16:29 UTC (rev 78)
+++ trunk/src/objects/olaf.cpp	2005-02-01 13:33:04 UTC (rev 79)
@@ -124,11 +124,11 @@
             //as we don't fall most states are off anyway
             unsetState(STATE_SHIELD);
             setState(STATE_SMALL);
-            maxspeedx/=4;
+            addMaxSpeed(-200);
         } else {
             sfxeng->playWAV(au_big);
             unsetState(STATE_SMALL);
-            maxspeedx*=4;
+            addMaxSpeed(200);
         }
         return true;
     } else return false;
@@ -174,12 +174,17 @@
         //Fart
         } else {
             setState(STATE_ACT_1);
-            setEvent(new ESpeed(this,DE_JUMP,fart,0,0,0,au_fart));
+            addSpeed(fart);
+            setEvent(new CAnimEvent(this,DE_JUMP,0,0,au_fart));
         }
     }
 }
     
 void Olaf::fall(Uint16 dt) {
+    if (!getState(STATE_MRIGHT|STATE_MLEFT)) {
+        if (!getState(STATE_FALL)) hspeed*=0.9;
+        else hspeed*=0.96;  
+    }
     Dgrav+=dt;
     if (Dgrav>T_GRAV_EFFECT) {
         if (state&STATE_FALL) {

Modified: trunk/src/objects/scorch.cpp
===================================================================
--- trunk/src/objects/scorch.cpp	2005-01-31 19:16:29 UTC (rev 78)
+++ trunk/src/objects/scorch.cpp	2005-02-01 13:33:04 UTC (rev 79)
@@ -35,6 +35,10 @@
 }
 
 void Scorch::fall(Uint16 dt) {
+    if (!getState(STATE_MRIGHT|STATE_MLEFT)) {
+        if (!getState(STATE_FALL)) hspeed*=0.9;
+        else hspeed*=0.96;  
+    }
     Dgrav+=dt;
     if (Dgrav>T_GRAV_EFFECT) {
         if (state&STATE_FALL) {
@@ -65,12 +69,14 @@
         setState(STATE_ACT_1);
         setState(STATE_ACT_2);
         unsetState(STATE_GLIDE);
-        setEvent(new ESpeed(this,DE_WING,V_FLY,0,0,0,au_tired));
+        addSpeed(V_FLY);
+        setEvent(new CAnimEvent(this,DE_WING,0,0,au_tired));
     //Use Wings
     } else {
         setState(STATE_ACT_1);
         left_wings--;
-        setEvent(new ESpeed(this,DE_WING,V_FLY,0,0,0,au_swing));
+        addSpeed(V_FLY);
+        setEvent(new CAnimEvent(this,DE_WING,0,0,au_swing));
     }
 }
 

Modified: trunk/src/objects/water.cpp
===================================================================
--- trunk/src/objects/water.cpp	2005-01-31 19:16:29 UTC (rev 78)
+++ trunk/src/objects/water.cpp	2005-02-01 13:33:04 UTC (rev 79)
@@ -19,7 +19,7 @@
     if(Character* ptr = dynamic_cast<Character*>(obj)) {
         sfxeng->playWAV(au_water);
         ptr->setState(STATE_WATER);
-        ptr->applySpeedMod(50);
+        ptr->addMaxSpeed(-200);
         ptr->hit(DIR_ALL,weapon);
     }
 }
@@ -27,7 +27,7 @@
 void Water::leave(Object* obj) {
     if(Character* ptr = dynamic_cast<Character*>(obj)) {
         sfxeng->playWAV(au_water);
-        ptr->applySpeedMod(200);
+        ptr->addMaxSpeed(200);
         ptr->unsetState(STATE_WATER);
     }
 }

Modified: trunk/src/objects/zombie.cpp
===================================================================
--- trunk/src/objects/zombie.cpp	2005-01-31 19:16:29 UTC (rev 78)
+++ trunk/src/objects/zombie.cpp	2005-02-01 13:33:04 UTC (rev 79)
@@ -14,7 +14,7 @@
   Monster(imagename,xcord,ycord,mname),
   au_attack(sndcache->loadWAV("clang.wav")),
   T_Attack_Bite(1500) {
-    maxspeedx=100;
+    maxspeedx=80;
     im_left=new Animation(imgcache->loadImage("olaf1_left.bmp"),2,1000);
     im_right=new Animation(imgcache->loadImage("olaf1_right.bmp"),2,1000);
     weapon=Weapon(-1,W_STRIKE);
@@ -26,14 +26,14 @@
 }
 
 void Zombie::idle(Uint16 dt) {
-    hspeed=0;
     Character::idle(dt);
     runAI(dt);
 }
 
 void Zombie::ai_left(Uint16 dt) {
     SDL_Rect oldpos=pos;
-    hspeed-=maxspeedx;
+    if ((hspeed-SPEED_STEP)>maxspeedx) hspeed-=SPEED_STEP;
+    else if (hspeed>(-maxspeedx)) hspeed=-maxspeedx;
     Hit hit=move(dt,true);
     if (hit.touch&enemy_types) {
         move(dt);
@@ -52,7 +52,8 @@
 
 void Zombie::ai_right(Uint16 dt) {
     SDL_Rect oldpos=pos;
-    hspeed+=maxspeedx;
+    if ((hspeed+SPEED_STEP)<maxspeedx) hspeed+=SPEED_STEP;
+    else if (hspeed<maxspeedx) hspeed=maxspeedx;
     Hit hit=move(dt,true);
     if (hit.touch&enemy_types) {
         move(dt);

Modified: trunk/src/players_common.cpp
===================================================================
--- trunk/src/players_common.cpp	2005-01-31 19:16:29 UTC (rev 78)
+++ trunk/src/players_common.cpp	2005-02-01 13:33:04 UTC (rev 79)
@@ -199,32 +199,24 @@
 
 void Player::in_right(Sint16 dt) {
     if (dt < 0) {
-        if (state&STATE_MRIGHT) {
-            unsetState(STATE_MRIGHT);
-            hspeed-=maxspeedx;
-        }
+        unsetState(STATE_MRIGHT);
         return;
     }
     unsetState(STATE_LEFT);
-    if (!(state&STATE_MRIGHT)) {
-        hspeed+=maxspeedx;
-        setState(STATE_MRIGHT);
-    }
+    setState(STATE_MRIGHT);
+    if ((hspeed+SPEED_STEP)<maxspeedx) hspeed+=SPEED_STEP;
+    else if (hspeed<maxspeedx) hspeed=maxspeedx;
 }
 
 void Player::in_left(Sint16 dt) {
     if (dt < 0) {
-        if (state&STATE_MLEFT) {
-            unsetState(STATE_MLEFT);
-            hspeed+=maxspeedx;
-        }
+        unsetState(STATE_MLEFT);
         return;
     }
     setState(STATE_LEFT);
-    if (!(state&STATE_MLEFT)) {
-        hspeed-=maxspeedx;
-        setState(STATE_MLEFT);
-    }
+    setState(STATE_MLEFT);
+    if ((hspeed-SPEED_STEP)>(-maxspeedx)) hspeed-=SPEED_STEP;
+    else if (hspeed>(-maxspeedx)) hspeed=-maxspeedx;
 }
 void Player::in_up(Sint16) { }
 void Player::in_down(Sint16) { }
@@ -236,6 +228,10 @@
 }
 
 void Player::fall(Uint16 dt) {
+    if (!getState(STATE_MRIGHT|STATE_MLEFT)) {
+        if (!getState(STATE_FALL)) hspeed*=0.9;
+        else hspeed*=0.96;
+    }
     Character::fall(dt);
 }
 
@@ -358,8 +354,15 @@
             case W_TOUCH: {
                 //TODO: play animations (make new Event for this)
                 if (direction&(DIR_UP|DIR_DOWN)) sfxeng->playWAV(aud_hit);
-                if (direction&DIR_LEFT) setEvent(new ESpeed(this,TSTRIKE,-200,-400,0,ESTATE_BUSY,aud_hit));
-                else setEvent(new ESpeed(this,TSTRIKE,-200,400,0,ESTATE_BUSY,aud_hit));
+                if (direction&DIR_LEFT) {
+                    addSpeed(-200);
+                    addHSpeed(-400);
+                    setEvent(new CAnimEvent(this,TSTRIKE,0,ESTATE_BUSY,aud_hit));
+                } else {
+                    addSpeed(-200);
+                    addHSpeed(400);
+                    setEvent(new CAnimEvent(this,TSTRIKE,0,ESTATE_BUSY,aud_hit));
+                }
                 break;
             }
             case W_WATER: {




More information about the lostpenguins-commits mailing list