[Orxonox-commit 5192] r9857 - in code/branches/spacestationentry: data/levels src/modules/docking src/modules/objects

agermann at orxonox.net agermann at orxonox.net
Mon Dec 2 16:05:10 CET 2013


Author: agermann
Date: 2013-12-02 16:05:10 +0100 (Mon, 02 Dec 2013)
New Revision: 9857

Modified:
   code/branches/spacestationentry/data/levels/dockingToASpaceStation.oxw
   code/branches/spacestationentry/src/modules/docking/Dock.cc
   code/branches/spacestationentry/src/modules/docking/Dock.h
   code/branches/spacestationentry/src/modules/objects/ForceField.cc
   code/branches/spacestationentry/src/modules/objects/ForceField.h
Log:
Docking funktioniert nun mit einem eingebauten Trigger ueber undocking XMLPort. Jedoch immer noch mit cmdUndock(). Forcefield wurde um eine homogenes Kraftfeld erweitert, dass Kugelfoermig und mit einer bestimmten Richtung gemacht werden kann.

Modified: code/branches/spacestationentry/data/levels/dockingToASpaceStation.oxw
===================================================================
--- code/branches/spacestationentry/data/levels/dockingToASpaceStation.oxw	2013-12-02 15:00:46 UTC (rev 9856)
+++ code/branches/spacestationentry/data/levels/dockingToASpaceStation.oxw	2013-12-02 15:05:10 UTC (rev 9857)
@@ -70,7 +70,7 @@
       </collisionShapes>
     </StaticEntity>
 
-   <!-- Docking (Andocken) -->
+<!-- Docking  -->
     <Dock position="2830,20,50" roll=0 yaw=0 >
         <animations>
             <MoveToDockingTarget target="destroyer" />
@@ -82,6 +82,10 @@
             <execute>
                 <EventListener event="dockMe" />
             </execute>
+
+	    <undocking>
+		<EventListener event="undockMe" />
+	    </undocking>
 	
             <activity>
                 <EventListener event=notGameEnd />
@@ -92,71 +96,38 @@
             <DistanceTrigger position="0,0,0" distance="200" target="Pawn"
                 beaconMode="exclude" targetname="bcnDestroyer" name="dockMe"
             />
+
+	    <Billboard position="-2730,-19970,50" material="Flares/ringflare2" colour="0.2,0.4,0.8" scale=1 />
+	    <DistanceTrigger position="-2730,-19970,50" distance="50" target="Pawn"
+                beaconMode="identify" targetname="bcnDestroyer" name="undockMe"
+            />
         </attached>
 
     </Dock>
-
-
-	
-
     
-    <!--SpaceShip
-        template            = "spaceshipcollateraldamage"
-        team                = "0"
-        position            = "2890,-40,6"
-        orientation         = "-0.14, 0.68, 0.68, 0.223"
-        lookat              = "0,0,0"
-        roll                = "180"
-        name                = "collateralDamage"
-        radarname           = "Collateral Damage" >
+<FpsPlayer template = "fps" radarname = "First Person Player" position = "0,-19900,0" >
       <attached>
         <DockingTarget name="spaceShip" />
         <DistanceTriggerBeacon name="bcnDestroyer" />
         <DockingTarget name="destroyer" />
       </attached>
-    </SpaceShip-->
-    
-<FpsPlayer template = "fps" radarname = "First Person Player" position = "0,-1900,0" >
-      <attached>
-        <DockingTarget name="spaceShip" />
-        <DistanceTriggerBeacon name="bcnDestroyer" />
-        <DockingTarget name="destroyer" />
-      </attached>
 </FpsPlayer>
 
 <!-- Wuerfel -->
 
-  <StaticEntity position="0,-2000,0" direction="0,-1,0" collisionType=static mass=100000 friction=0.01 >
+  <StaticEntity position="0,-20000,0" direction="0,-1,0" collisionType=static mass=100000 friction=0.01 >
       <attached>
-        <Model position="0,0,0" mesh="crate.mesh" scale3D="66,15,5" />
-        
+        <Model position="0,0,0" mesh="crate.mesh" scale3D="80,80,5" />
       </attached>
       <collisionShapes>
-        <BoxCollisionShape position="0,0,0" halfExtents="330,330,10" />
+        <BoxCollisionShape position="0,0,0" halfExtents="400,400,25" />
       </collisionShapes>
   </StaticEntity>
 
 <!-- Schwerkraftfeld -->
 
-<ForceField position="2500,-92000,2500" mode="sphere" diameter="184000" velocity="-5000" />
-<ForceField position="2500,-92000,-2500" mode="sphere" diameter="184000" velocity="-5000" />
-<ForceField position="-2500,-92000,2500" mode="sphere" diameter="184000" velocity="-5000" />
-<ForceField position="-2500,-92000,-2500" mode="sphere" diameter="184000" velocity="-5000" />
+<ForceField position="0,-20000,0" mode="homogen" diameter="2000" forcedirection = "0,-400,0" />
 
-<!-- Ausgang - Trigger -->
-
-<Billboard position="150,-1950,150" material="Flares/ringflare2" colour="0.2,0.4,0.8" scale=1 />
-
-<DistanceTrigger name="ausgang" position="100,-1950,100"  target="Pawn" distance=50 stayActive="false" delay=0 />
-    <Script code="undock" onLoad="false">
-        <events>
-            <trigger>
-                <EventListener event=ausgang />
-            </trigger>
-        </events>
-    </Script>
-
-
 <!-- Rest -->
 
     <!-- triple large belt around the planet  -->

Modified: code/branches/spacestationentry/src/modules/docking/Dock.cc
===================================================================
--- code/branches/spacestationentry/src/modules/docking/Dock.cc	2013-12-02 15:00:46 UTC (rev 9856)
+++ code/branches/spacestationentry/src/modules/docking/Dock.cc	2013-12-02 15:05:10 UTC (rev 9857)
@@ -68,7 +68,7 @@
         XMLPortObject(Dock, DockingEffect, "effects", addEffect, getEffect, xmlelement, mode);
         XMLPortObject(Dock, DockingAnimation, "animations", addAnimation, getAnimation, xmlelement, mode);
         XMLPortEventSink(Dock, BaseObject, "execute", execute, xmlelement, mode);
-        //XMLPortEventSink(Dock, BaseObject, "undocking", undocking, xmlelement, mode);
+        XMLPortEventSink(Dock, BaseObject, "undocking", undocking, xmlelement, mode);
 
     }
 
@@ -78,19 +78,51 @@
 
         XMLPortEventSink(Dock, BaseObject, "execute", execute, xmlelement, mode);
 
-        //XMLPortEventSink(Dock, BaseObject, "undocking", undocking, xmlelement, mode);
+        XMLPortEventSink(Dock, BaseObject, "undocking", undocking, xmlelement, mode);
     }
 
-    /*
+
     bool Dock::undocking(bool bTriggered, BaseObject* trigger)
     {
-    	orxout(user_warning)<<"undocking"<<endl;
+    	// Noch lange nicht fertig (leich veraenderte Kopie von execute())
+    	PlayerTrigger* pTrigger = orxonox_cast<PlayerTrigger*>(trigger);
+    	        PlayerInfo* player = NULL;
 
-    	return true;
+    	        // Check whether it is a player trigger and extract pawn from it
+    	        if(pTrigger != NULL)
+    	        {
+    	            if(!pTrigger->isForPlayer()) {  // The PlayerTrigger is not exclusively for Pawns which means we cannot extract one.
+    	                orxout(verbose, context::docking) << "Docking:execute PlayerTrigger was not triggered by a player.." << endl;
+    	                return false;
+    	            }
+    	            player = pTrigger->getTriggeringPlayer();
+    	        }
+    	        else
+    	        {
+    	            orxout(verbose, context::docking) << "Docking::execute Not a player trigger, can't extract pawn from it.." << endl;
+    	            return false;
+    	        }
+    	        if(player == NULL)
+    	        {
+    	            orxout(verbose, context::docking) << "Docking::execute Can't retrieve PlayerInfo from Trigger. (" << trigger->getIdentifier()->getName() << ")" << endl;
+    	            return false;
+    	        }
+
+    	        if(bTriggered)
+    	        {
+    	            cmdUndock();
+    	        }
+    	        else
+    	        {
+    	            // Remove player from candidates list
+    	            candidates_.erase(player);
+    	        }
+
+    	        return true;
     }
 
-    */
 
+
     bool Dock::execute(bool bTriggered, BaseObject* trigger)
     {
         PlayerTrigger* pTrigger = orxonox_cast<PlayerTrigger*>(trigger);

Modified: code/branches/spacestationentry/src/modules/docking/Dock.h
===================================================================
--- code/branches/spacestationentry/src/modules/docking/Dock.h	2013-12-02 15:00:46 UTC (rev 9856)
+++ code/branches/spacestationentry/src/modules/docking/Dock.h	2013-12-02 15:05:10 UTC (rev 9857)
@@ -61,7 +61,7 @@
 
             // Trigger interface
             bool execute(bool bTriggered, BaseObject* trigger);
-            //bool undocking(bool bTriggered, BaseObject* trigger);
+            bool undocking(bool bTriggered, BaseObject* trigger);
 
             // XML interface
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);

Modified: code/branches/spacestationentry/src/modules/objects/ForceField.cc
===================================================================
--- code/branches/spacestationentry/src/modules/objects/ForceField.cc	2013-12-02 15:00:46 UTC (rev 9856)
+++ code/branches/spacestationentry/src/modules/objects/ForceField.cc	2013-12-02 15:05:10 UTC (rev 9857)
@@ -44,10 +44,14 @@
     /*static*/ const std::string ForceField::modeTube_s = "tube";
     /*static*/ const std::string ForceField::modeSphere_s = "sphere";
     /*static*/ const std::string ForceField::modeInvertedSphere_s = "invertedSphere";
+
+    /*static*/ const std::string ForceField::modeHomogen_s = "homogen";
+
     /*static*/ const std::string ForceField::modeNewtonianGravity_s = "newtonianGravity";
     /*static*/ const float ForceField::gravConstant_ = 6.673e-11;
     /*static*/ const float ForceField::attenFactor_ = 1;
 
+
     /**
     @brief
         Constructor. Registers the object and initializes some values.
@@ -88,6 +92,7 @@
         XMLPortParam(ForceField, "massDiameter", setMassDiameter, getMassDiameter, xmlelement, mode).defaultValues(0);
         XMLPortParam(ForceField, "length", setLength  , getLength  , xmlelement, mode).defaultValues(2000);
         XMLPortParam(ForceField, "mode", setMode, getMode, xmlelement, mode);
+        XMLPortParam(ForceField, "forcedirection", setForceDirection, getForceDirection, xmlelement, mode).defaultValues(Vector3(0,-400,0));
     }
     
     void ForceField::registerVariables()
@@ -195,6 +200,21 @@
                 }
             }
         }
+        else if(this->mode_ == forceFieldMode::homogen)
+        {
+        	// Iterate over all objects that could possibly be affected by the ForceField.
+        	for (ObjectList<MobileEntity>::iterator it = ObjectList<MobileEntity>::begin(); it != ObjectList<MobileEntity>::end(); ++it)
+        	{
+        		Vector3 distanceVector = it->getWorldPosition() - this->getWorldPosition();
+        	    float distance = distanceVector.length();
+        	    if (distance < this->radius_ && distance > this->massRadius_)
+        	    {
+        	    	// Add a Acceleration in forceDirection_.
+        	    	// Vector3(0,0,0) is the direction, where the force should work.
+        	    	it->addAcceleration(forceDirection_ , Vector3(0,0,0));
+        	    }
+        	}
+        }
     }
 
     /**
@@ -213,6 +233,10 @@
             this->mode_ = forceFieldMode::invertedSphere;
         else if(mode == ForceField::modeNewtonianGravity_s)
             this->mode_ = forceFieldMode::newtonianGravity;
+
+        else if(mode == ForceField::modeHomogen_s)
+            this->mode_ = forceFieldMode::homogen;
+
         else
         {
             orxout(internal_warning) << "Wrong mode '" << mode << "' in ForceField. Setting to 'tube'." << endl;
@@ -238,6 +262,10 @@
                 return ForceField::modeInvertedSphere_s;
             case forceFieldMode::newtonianGravity:
                 return ForceField::modeNewtonianGravity_s;
+
+            case forceFieldMode::homogen:
+                return ForceField::modeHomogen_s;
+
             default:
                 return ForceField::modeTube_s;
         }

Modified: code/branches/spacestationentry/src/modules/objects/ForceField.h
===================================================================
--- code/branches/spacestationentry/src/modules/objects/ForceField.h	2013-12-02 15:00:46 UTC (rev 9856)
+++ code/branches/spacestationentry/src/modules/objects/ForceField.h	2013-12-02 15:05:10 UTC (rev 9857)
@@ -1,3 +1,4 @@
+
 /*
  *   ORXONOX - the hottest 3D action shooter ever to exist
  *                    > www.orxonox.net <
@@ -56,7 +57,8 @@
             tube, //!< The ForceField has a tube shape.
             sphere, //!< The ForceField has a spherical shape.
             invertedSphere, //!< The ForceField has a spherical shape but "inverted" behavior.
-            newtonianGravity //!< The ForceField imitates Newtonian gravitation for use in stellar bodies.
+            newtonianGravity, //!< The ForceField imitates Newtonian gravitation for use in stellar bodies.
+            homogen //!< Local homogenous Force field with changeable direction for the Space Station
         };
     }
 
@@ -65,6 +67,7 @@
         Implements a force field, that applies a force to any @ref orxonox::MobileEntity "MobileEntity" that enters its range.
 
         The following parameters can be set to specify the behavior of the ForceField.
+        - @b forcedirection The direction and the strength of the homogenous force field. Default is 0,-400,0.
         - @b velocity The amount of force the ForceField excerts. Default is 100.
         - @b diameter The diameter of the ForceField. Default is 500.
         - @b length The length of the ForceField. Default is 2000.
@@ -146,6 +149,13 @@
             inline float getLength()
                 { return this->halfLength_*2; }
 
+            inline void setForceDirection(Vector3 forcedir)
+                { this->forceDirection_ = forcedir; }
+
+            inline Vector3 getForceDirection()
+                { return this->forceDirection_; }
+
+
             void setMode(const std::string& mode); //!< Set the mode of the ForceField.
             const std::string& getMode(void); //!< Get the mode of the ForceField.
 
@@ -156,6 +166,8 @@
             static const std::string modeInvertedSphere_s;
             static const std::string modeNewtonianGravity_s;
 
+            static const std::string modeHomogen_s;
+
             float velocity_; //!< The velocity of the ForceField.
             float radius_; //!< The radius of the ForceField.
             float massRadius_; //!< The radius of the stellar body for the Newtonian ForceField.
@@ -166,6 +178,7 @@
             static const float gravConstant_;
             //! Attenuation factor for Newtonian ForceFields
             static const float attenFactor_;
+            Vector3 forceDirection_;
   };
 }
 




More information about the Orxonox-commit mailing list