[Orxonox-commit 5932] r10591 - in code/branches/towerdefenseFabien: data/levels data/overlays src/modules/towerdefense

fvultier at orxonox.net fvultier at orxonox.net
Thu Sep 17 15:32:50 CEST 2015


Author: fvultier
Date: 2015-09-17 15:32:50 +0200 (Thu, 17 Sep 2015)
New Revision: 10591

Modified:
   code/branches/towerdefenseFabien/data/levels/towerDefense.oxw
   code/branches/towerdefenseFabien/data/overlays/towerdefenseHUD.oxo
   code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.cc
   code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.h
   code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseEnemy.cc
   code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseField.cc
   code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseField.h
   code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseHUDController.cc
Log:
Different wave types with different enemies. New field type: obstacle. It is impossible to build a tower on a field with an obstacle.

Modified: code/branches/towerdefenseFabien/data/levels/towerDefense.oxw
===================================================================
--- code/branches/towerdefenseFabien/data/levels/towerDefense.oxw	2015-09-17 12:19:51 UTC (rev 10590)
+++ code/branches/towerdefenseFabien/data/levels/towerDefense.oxw	2015-09-17 13:32:50 UTC (rev 10591)
@@ -234,20 +234,20 @@
    spawnparticleduration  = 3
    explosionchunks        = 6
 
-   health            = 1
-   maxhealth         = 2
-   initialhealth     = 1
+   health            = 15
+   maxhealth         = 15
+   initialhealth     = 15
 
-   shieldhealth        = 30
-   initialshieldhealth = 30
-   maxshieldhealth     = 50
+   shieldhealth        = 15
+   initialshieldhealth = 15
+   maxshieldhealth     = 15
    shieldabsorption    = 0.8
    reloadrate          = 1
    reloadwaittime      = 1
 
-   primaryThrust     = 100
+   primaryThrust     = 1000
    auxilaryThrust    = 30
-   rotationThrust    = 50
+   rotationThrust    = 80
 
    lift = 1;
    stallSpeed = 220;
@@ -261,7 +261,7 @@
    shakeAmplitude = 9
 
    collisionType     = "dynamic"
-   mass              = 100
+   mass              = 10
    linearDamping     = 0.7
    angularDamping    = 0.9999999
 
@@ -286,8 +286,7 @@
       <BoxCollisionShape position="0,0.1,-19"  halfExtents="1.4, 1, 2" />
     </collisionShapes>
     <controller>
-      <WaypointController accuracy=60>
-      </WaypointController>
+       <WaypointController accuracy = 50/>
     </controller>
   </TowerDefenseEnemy>
 </Template>
@@ -300,20 +299,20 @@
    spawnparticleduration  = 3
    explosionchunks        = 6
 
-   health            = 100
-   maxhealth         = 200
-   initialhealth     = 100
+   health            = 30
+   maxhealth         = 30
+   initialhealth     = 30
 
-   shieldhealth        = 30
-   initialshieldhealth = 30
-   maxshieldhealth     = 50
+   shieldhealth        = 0
+   initialshieldhealth = 0
+   maxshieldhealth     = 0
    shieldabsorption    = 0.8
    reloadrate          = 1
    reloadwaittime      = 1
 
    primaryThrust     = 100
    auxilaryThrust    = 30
-   rotationThrust    = 50
+   rotationThrust    = 80
 
    lift = 1;
    stallSpeed = 220;
@@ -337,10 +336,10 @@
     <engines>
       <Engine position=" 0, 0, 0" 
         boostfactor    = 2
-        speedfront     = 150
+        speedfront     = 100
         speedback      =  50
         speedleftright =  50
-        speedupdown    =  50         
+        speedupdown    =  50        
         accelerationfront     = 500
         accelerationbrake     = 500
         accelerationback      =  125
@@ -358,11 +357,10 @@
       <BoxCollisionShape position="0,0,7"      halfExtents="3, 2, 2" />
       <BoxCollisionShape position="0,0.1,-11"  halfExtents="2.2, 1.8, 6" />
       <BoxCollisionShape position="0,0.1,-19"  halfExtents="1.4, 1, 2" />
-    </collisionShapes>
+    </collisionShapes> 
     <controller>
-      <WaypointController accuracy=60>
-      </WaypointController>
-    </controller>    
+       <WaypointController accuracy = 50/>
+    </controller>
   </TowerDefenseEnemy>
 </Template>
 
@@ -374,20 +372,20 @@
    spawnparticleduration  = 3
    explosionchunks        = 6
 
-   health            = 100
-   maxhealth         = 200
-   initialhealth     = 100
+   health            = 15
+   maxhealth         = 15
+   initialhealth     = 15
    
-   shieldhealth        = 30
-   initialshieldhealth = 30
-   maxshieldhealth     = 50
+   shieldhealth        = 5
+   initialshieldhealth = 5
+   maxshieldhealth     = 5
    shieldabsorption    = 0.8
    reloadrate          = 1
    reloadwaittime      = 1
 
    primaryThrust     = 100
    auxilaryThrust    = 30
-   rotationThrust    = 50
+   rotationThrust    = 80
 
    lift = 1;
    stallSpeed = 220;
@@ -411,15 +409,15 @@
     <engines>
       <Engine position=" 0, 0, 0" 
         boostfactor    = 2
-        speedfront     = 150
-        speedback      =  50
-        speedleftright =  50
-        speedupdown    =  50         
+        speedfront     = 300
+        speedback      =  300
+        speedleftright =  300
+        speedupdown    =  300         
         accelerationfront     = 500
         accelerationbrake     = 500
-        accelerationback      =  125
-        accelerationleftright =  125
-        accelerationupdown    =  125
+        accelerationback      =  500
+        accelerationleftright =  500
+        accelerationupdown    =  500
       />
     </engines>
     <attached>
@@ -434,9 +432,8 @@
       <BoxCollisionShape position="0,0.1,-19"  halfExtents="1.4, 1, 2" />
     </collisionShapes>
     <controller>
-      <WaypointController accuracy=60>
-      </WaypointController>
-    </controller>    
+       <WaypointController accuracy = 50/>
+    </controller>
   </TowerDefenseEnemy>
 </Template>
 
@@ -485,9 +482,9 @@
     fields="F1F1F1R1I1I1I1I1O1F1F1F1F1F1F1F1
             F1F1F1I2F1F1F1F1F1F1F1F1F1F1F1F1
             F1F1F1I2F1F1F1F1F1F1F1F1F1F1F1F1
+            F1F1F1I2F1F1F1F1F1F1F1Y1Y1Y1F1F1
             F1F1F1I2F1F1F1F1F1F1F1F1F1F1F1F1
-            F1F1F1I2F1F1F1F1F1F1F1F1F1F1F1F1
-            F1F1F1I2F1F1F1F1F1F1F1F1F1F1F1F1
+            F1F1F1I2F1F1F1F1F1F1F1Y1Y1Y1F1F1
             F1F1F1R2I3I3I3I3L3F1F1F1F1F1F1F1
             F1F1F1F1F1F1F1F1I2F1F1F1F1F1F1F1
             F1F1F1F1F1F1F1F1I2F1F1F1F1F1F1F1

Modified: code/branches/towerdefenseFabien/data/overlays/towerdefenseHUD.oxo
===================================================================
--- code/branches/towerdefenseFabien/data/overlays/towerdefenseHUD.oxo	2015-09-17 12:19:51 UTC (rev 10590)
+++ code/branches/towerdefenseFabien/data/overlays/towerdefenseHUD.oxo	2015-09-17 13:32:50 UTC (rev 10591)
@@ -1,81 +1,75 @@
 <Template name="TowerDefenseHUD">
-
-
   <OverlayGroup name="TowerDefenseHUD" scale = "1, 1">
-  
-  
-    <OverlayText
-     position  = "0.83, 0.05"
+    
+     <TowerDefenseHUDController
+     position  = "0.9, 0.10"
      pickpoint = "0.0, 0.0"
      font      = "ShareTechMono"
      textsize  = 0.05
      colour    = "1.0, 1.0, 1.0, 1.0"
      align     = "left"
-
-     caption = "Cash:"
+        showlives = false
+        showcredits = true
+        showwaves = false
     />
-    
-    
-     <TowerDefenseHUDController
-     position  = "0.88, 0.10"
+
+    <TowerDefenseHUDController
+     position  = "0.9, 0.25"
      pickpoint = "0.0, 0.0"
      font      = "ShareTechMono"
      textsize  = 0.05
      colour    = "1.0, 1.0, 1.0, 1.0"
      align     = "left"
-		showlives = false
-		showcredits = true
-		showwaves = false
-    />
-    
-        <OverlayText
-     position  = "0.83, 0.22"
+        showlives = true
+        showcredits = false
+        showwaves = false
+    />  
+      
+    <TowerDefenseHUDController
+     position  = "0.9, 0.40"
      pickpoint = "0.0, 0.0"
      font      = "ShareTechMono"
      textsize  = 0.05
      colour    = "1.0, 1.0, 1.0, 1.0"
      align     = "left"
+        showlives = false
+        showcredits = false
+        showwaves = true
+    />      
 
-     caption = "Lifes:"
-    />
-    
-         <TowerDefenseHUDController
-     position  = "0.88, 0.27"
+    <OverlayText
+     position  = "0.8, 0.1"
      pickpoint = "0.0, 0.0"
      font      = "ShareTechMono"
      textsize  = 0.05
      colour    = "1.0, 1.0, 1.0, 1.0"
      align     = "left"
-		showlives = true
-		showcredits = false
-		showwaves = false
+
+     caption = "Cash:"
     />
     
-            <OverlayText
-     position  = "0.83, 0.39"
+    <OverlayText
+     position  = "0.8, 0.25"
      pickpoint = "0.0, 0.0"
      font      = "ShareTechMono"
      textsize  = 0.05
      colour    = "1.0, 1.0, 1.0, 1.0"
      align     = "left"
 
-     caption = "Waves:"
+     caption = "Lifes:"
     />
     
-         <TowerDefenseHUDController
-     position  = "0.88, 0.44"
+    <OverlayText
+     position  = "0.8, 0.40"
      pickpoint = "0.0, 0.0"
      font      = "ShareTechMono"
      textsize  = 0.05
      colour    = "1.0, 1.0, 1.0, 1.0"
      align     = "left"
-     	showlives = false
-		showcredits = false
-		showwaves = true
 
+     caption = "Waves:"
     />
     
-    
   </OverlayGroup>
 </Template>
 

Modified: code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.cc
===================================================================
--- code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.cc	2015-09-17 12:19:51 UTC (rev 10590)
+++ code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.cc	2015-09-17 13:32:50 UTC (rev 10591)
@@ -86,12 +86,6 @@
 
 namespace orxonox
 {
-    static const std::string __CC_addTower_name  = "addTower";
-    static const std::string __CC_upgradeTower_name = "upgradeTower";
-
-    SetConsoleCommand("TowerDefense", __CC_addTower_name,  &TowerDefense::addTower ).addShortcut().defaultValues(1);
-    SetConsoleCommand("TowerDefense", __CC_upgradeTower_name, &TowerDefense::upgradeTower).addShortcut().defaultValues(0);
-
     RegisterUnloadableClass(TowerDefense);
 
     TowerDefense::TowerDefense(Context* context) : TeamDeathmatch(context)
@@ -101,25 +95,22 @@
         selecter = NULL;
         this->player_ = NULL;        
         this->setHUDTemplate("TowerDefenseHUD");
-        this->nextwaveTimer_.setTimer(10, false, createExecutor(createFunctor(&TowerDefense::nextwave, this)));
-        this->nextwaveTimer_.stopTimer();
-        this->waves_ = 0;
-        this->time = 0;
+        this->waveNumber_ = 0;
+        this->timeSinceLastSpawn_ = 0.0;
+        this->timeUntilNextWave_ = 0.0;
         this->credit_ = 0;
         this->lifes_ = 0;
+        this->waveSize_ = 0;
+        offset_ = Vector3(0,0,10);
 
         //this->stats_ = new TowerDefensePlayerStats();
-
-        ModifyConsoleCommand(__CC_addTower_name).setObject(this);
-        ModifyConsoleCommand(__CC_upgradeTower_name).setObject(this);
     }
 
     TowerDefense::~TowerDefense()
-    {        /* Part of a temporary hack to allow the player to add towers */
+    {
         if (this->isInitialized())
         {
-            ModifyConsoleCommand(__CC_addTower_name).setObject(NULL);
-            ModifyConsoleCommand(__CC_upgradeTower_name).setObject(NULL);
+
         }
     }
 
@@ -148,24 +139,20 @@
         enemies_.clear();
 
         createFields();
-
         TeamDeathmatch::start();
 
-        // Waypoints: [1,3] [10,3] [10,11] [13,11] -> add the points to a matrix so the player cant place towers on the path
-        
-
         //set initial credits, lifes and WaveNumber
         this->setCredit(1000);
-        this->setLifes(100);
+        this->setLifes(100);        
+        this->timeSinceLastSpawn_ = 0.0;
+        this->timeUntilNextWave_ = 5.0;
+        this->waveSize_ = 0;
         this->setWaveNumber(0);
-        time = 0.0;
     }
 
     // Generates a TowerDefenseEnemy. Uses Template "enemytowerdefense". Sets position at first waypoint of path.
     void TowerDefense::addTowerDefenseEnemy(int templatenr)
     {
-        orxout() << "addTowerDefenseEnemy" << endl;
-
         TowerDefenseEnemy* en1 = new TowerDefenseEnemy(this->center_->getContext());
         
         switch(templatenr)
@@ -199,15 +186,15 @@
 
         if (controller != NULL && waypoints_.size() > 1)
         {
-            en1->setPosition(waypoints_.at(0)->getPosition());
+            en1->setPosition(waypoints_.at(0)->getPosition() + offset_);
             en1->setOrientation(Vector3(0,0,10), Degree(0));
             en1->setDirection(Vector3(0,1,0));
-            en1->lookAt(waypoints_.at(1)->getPosition());
+            en1->lookAt(waypoints_.at(1)->getPosition() + offset_);
 
             for (unsigned int i = 0; i < waypoints_.size(); ++ i)
             {
                 orxonox::WeakPtr<MovableEntity> waypoint = new MovableEntity(this->center_->getContext());
-                waypoint->setPosition(waypoints_.at(i)->getPosition());
+                waypoint->setPosition(waypoints_.at(i)->getPosition() + offset_);
                 controller->addWaypoint(waypoint);
             }
         }
@@ -229,8 +216,6 @@
         assert(player);
         player_ = player;
 
-        orxout() << "spawnPlayer" << endl;
-
         if (selecter->getPlayer() == NULL)
         {
             player_->startControl(selecter);
@@ -286,15 +271,14 @@
 
     void TowerDefense::tick(float dt)
     {
-        //orxout() << "tick1" << endl;
         SUPER(TowerDefense, tick, dt);
-        //orxout() << "tick2" << endl;
 
         if (hasStarted() == false || player_ == NULL)
         {
             return;
         }
-        time += dt;       
+        timeUntilNextWave_ -= dt;
+        timeSinceLastSpawn_ += dt;
 
         //build/upgrade tower at selecter position
         if (selecter != NULL && selecter->buildTower_ == true)
@@ -310,30 +294,22 @@
                 addTower(selecter->selectedPos_->GetX(), selecter->selectedPos_->GetY());
             }            
         }
-
-        if (time >= 1.3 * enemies_.size() && enemies_.size() < 10)
-        {
-            //adds different types of enemys depending on the WaveNumber
-            addTowerDefenseEnemy(this->getWaveNumber() % 3 +1 );
-        }
-
-        //if ships are at the end they get destroyed
-
+        
         for (std::list<WeakPtr<TowerDefenseEnemy> >::iterator it = enemies_.begin(); it != enemies_.end(); )
         {
             if (*it == NULL)
             {
                 // the enemy was destroyed by a tower - remove it from the list
                 enemies_.erase(it++);
+                addCredit(1);
             }
             else
             {
-                //destroys enemys at the end of the path and reduces the life by 1. No credits gifted
+                //if ships are at the end they get destroyed
                 Vector3 ship = (*it)->getRVWorldPosition();
                 float distance = ship.distance(endpoint_);
-                if(distance < 50)
+                if(distance < 40)
                 {
-                    orxout() << "enemy deleted" << endl;
                     (*it)->destroy();
                     enemies_.erase(it++);
                     this->reduceLifes(1);
@@ -347,12 +323,26 @@
                     ++ it;
                 }
             }
-        }        
+        }  
 
-        if (enemies_.size() == 0 && !this->nextwaveTimer_.isActive())
+        // Add new enemy?
+        if (timeSinceLastSpawn_ >= 1.0 && waveSize_ > 0)
         {
-            this->nextwaveTimer_.startTimer();
+            // Add new enemy
+            timeSinceLastSpawn_ -= 1.0;
+            -- waveSize_;
+            addTowerDefenseEnemy(this->getWaveNumber() % 3 + 1);
         }
+        else if (timeUntilNextWave_ <= 0.0 && waveSize_ <= 0)
+        {
+            //New wave
+            ++ waveNumber_;
+            timeSinceLastSpawn_ = 0.0;
+
+            timeUntilNextWave_ = waveNumber_+10;
+            waveSize_ = waveNumber_+5;
+        }
+
     }
 
     void TowerDefense::createFields()
@@ -360,7 +350,6 @@
         assert(center_);
         TDCoordinate coord(0,0);
         TDCoordinate startCoord(0,0);
-
         std::string fields = center_->getFields();
         int pos = 0;
         for (int j = 15; j >= 0; --j)
@@ -371,8 +360,8 @@
                 fields_[i][j] = new TowerDefenseField(center_->getContext());
                 fields_[i][j]->setCenterpoint(center_);
                 center_->attach(fields_[i][j]);
-                fields_[i][j]->setPosition(coord.get3dcoordinate());                
-                fields_[i][j]->create(fields.at(pos), fields.at(pos+1));           
+                fields_[i][j]->setPosition(coord.get3dcoordinate()); 
+                fields_[i][j]->create(fields.at(pos), fields.at(pos+1));
                 pos += 2;
                 if (fields_[i][j]->getType() == START)
                 {
@@ -381,7 +370,6 @@
                 }
             }
         }
-
         //Place waypoints along the street for the waypoint controllers of the enemies
         TDCoordinate* thisCoord = &startCoord;
         TDCoordinate* nextCoord;
@@ -428,53 +416,4 @@
 
         return NULL;
     }
-
-    /*
-    void TowerDefense::playerEntered(PlayerInfo* player)
-    {
-        TeamDeathmatch::playerEntered(player);
-
-        const std::string& message = player->getName() + " entered the game";
-        ChatManager::message(message);
-    }
-
-    bool TowerDefense::playerLeft(PlayerInfo* player)
-    {
-        bool valid_player = TeamDeathmatch::playerLeft(player);
-
-        if (valid_player)
-        {
-            const std::string& message = player->getName() + " left the game";
-            ChatManager::message(message);
-        }
-
-        return valid_player;
-    }
-
-
-    void TowerDefense::pawnKilled(Pawn* victim, Pawn* killer)
-    {
-        if (victim && victim->getPlayer())
-        {
-            std::string message;
-            if (killer)
-            {
-                if (killer->getPlayer())
-                    message = victim->getPlayer()->getName() + " was killed by " + killer->getPlayer()->getName();
-                else
-                    message = victim->getPlayer()->getName() + " was killed";
-            }
-            else
-                message = victim->getPlayer()->getName() + " died";
-
-            ChatManager::message(message);
-        }
-
-        TeamDeathmatch::pawnKilled(victim, killer);
-    }
-
-    void TowerDefense::playerScored(PlayerInfo* player, int score)
-    {
-        Gametype::playerScored(player, score);
-    }*/
 }

Modified: code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.h
===================================================================
--- code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.h	2015-09-17 12:19:51 UTC (rev 10590)
+++ code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.h	2015-09-17 13:32:50 UTC (rev 10591)
@@ -60,47 +60,37 @@
         int getCredit(){ return this->credit_; }
         void payCredit(int pay){ this->credit_ -= pay; }
         int getLifes(){ return this->lifes_; }
-        int getWaveNumber(){ return this->waves_; }
+        int getWaveNumber(){ return this->waveNumber_; }
+        void setWaveNumber(int wavenumber){ waveNumber_=wavenumber; }
         void setCredit(int credit){ credit_ = credit; }
-        void setLifes(int lifes){ lifes_ = lifes; }
-        void setWaveNumber(int wavenumber){ waves_=wavenumber; }
-        void buyTower(int cost){ credit_ -= cost;}
+        void setLifes(int lifes){ lifes_ = lifes; }        
+        void buyTower(int cost){ cost -= cost;}
         void addCredit(int credit) { credit_+=credit; }
-        void nextwave(){ enemies_.clear(); waves_++; time=0;}
         int reduceLifes(int NumberofLifes){ return lifes_-=NumberofLifes; }
         TowerDefenseField* getField(TDCoordinate* coord){ return fields_[coord->GetX()][coord->GetY()]; }
-        /*  Called by TowerDefenseCenterpoint upon game start
-            The centerpoint is used to create towers
-        */
         void setCenterpoint(TowerDefenseCenterpoint* centerpoint);        
-        /* Adds a tower at x, y in the playfield */
         void addTower(int x, int y);
         void upgradeTower(int x, int y); 
         virtual TDCoordinate* getNextStreetCoord(TDCoordinate*);
-
-        //virtual void pawnKilled(Pawn* victim, Pawn* killer = 0);
-        //virtual void playerScored(PlayerInfo* player, int score);
-
+        
         TowerDefenseSelecter* selecter;        
 
-        //TODO: void spawnNewWave()
-        //TODO: create a timer which regularly calls the spawnNewWave function  (time driven)
-        //      or spawn a new wave when the old wave has been killed           (event driven)
-
     private:
+        void createFields();
+
         orxonox::WeakPtr<TowerDefenseCenterpoint> center_;
         PlayerInfo* player_;
-        float time;        
+        float timeSinceLastSpawn_;
+        float timeUntilNextWave_;
+        int waveSize_;
         int credit_;
-        int waves_;
+        int waveNumber_;
         int lifes_;
-        Timer nextwaveTimer_;
         std::list<orxonox::WeakPtr<TowerDefenseEnemy> > enemies_;
         TowerDefenseField* fields_[16][16];
         std::vector<orxonox::WeakPtr<TowerDefenseField> > waypoints_;
         Vector3 endpoint_;
-
-        void createFields();
+        Vector3 offset_;        
     };
 }
 

Modified: code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseEnemy.cc
===================================================================
--- code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseEnemy.cc	2015-09-17 12:19:51 UTC (rev 10590)
+++ code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseEnemy.cc	2015-09-17 13:32:50 UTC (rev 10591)
@@ -34,7 +34,7 @@
 
     TowerDefenseEnemy::~TowerDefenseEnemy()
     {
-        orxout() << "TowerDefenseEnemy::~TowerDefenseEnemy" << endl;
+
     }
 
     void TowerDefenseEnemy::tick(float dt)
@@ -56,8 +56,8 @@
 
     void TowerDefenseEnemy::damage(float damage, float healthdamage, float shielddamage, Pawn* originator)
     {
-        orxout() << "TowerDefenseEnemy::damage" << endl;
         Pawn::damage(damage, healthdamage, shielddamage, originator);
+        
         if (getGame() && once_ == false && getHealth() <= 0)
         {
             getGame()->addCredit(1);

Modified: code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseField.cc
===================================================================
--- code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseField.cc	2015-09-17 12:19:51 UTC (rev 10590)
+++ code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseField.cc	2015-09-17 13:32:50 UTC (rev 10591)
@@ -52,12 +52,16 @@
         type_ = FREE;
         center_ = NULL;
         upgrade_ = 0;
-        setPosition(0,0,0);        
-        model_ = new Model(getContext());
-        model_->setScale(25);
-        model_->pitch(Degree(90));
-        attach(model_);
-        setAngle(0); 
+        setPosition(0,0,0);                            
+        modelGround_ = new Model(getContext());
+        modelGround_->setScale(25);
+        modelGround_->pitch(Degree(90));
+        attach(modelGround_);
+        modelObject_ = new Model(getContext());
+        modelObject_->setScale(25);
+        modelObject_->pitch(Degree(90));
+        attach(modelObject_);
+        setAngle(0);
     }
 
     /**
@@ -124,30 +128,52 @@
 
     void TowerDefenseField::setAngle(int newAngle)
     {
-        if (model_ == NULL)
+        if (modelGround_ != NULL)
         {
-            return;
+            switch (newAngle)
+            {
+            case 0:
+                modelGround_->yaw(Degree(0));
+                angle_ = 0;
+                break;
+            case 1:
+                modelGround_->yaw(Degree(90));
+                angle_ = 1;
+                break;    
+            case 2:
+                modelGround_->yaw(Degree(180));
+                angle_ = 2;
+                break;   
+            case 3:
+                modelGround_->yaw(Degree(270));
+                angle_ = 3;
+                break;                                           
+            }
         }
 
-        switch (newAngle)
+        if (modelObject_ != NULL)
         {
+            switch (newAngle)
+            {
             case 0:
-                model_->yaw(Degree(0));
+                modelObject_->yaw(Degree(0));
                 angle_ = 0;
                 break;
             case 1:
-                model_->yaw(Degree(90));
+                modelObject_->yaw(Degree(90));
                 angle_ = 1;
                 break;    
             case 2:
-                model_->yaw(Degree(180));
+                modelObject_->yaw(Degree(180));
                 angle_ = 2;
                 break;   
             case 3:
-                model_->yaw(Degree(270));
+                modelObject_->yaw(Degree(270));
                 angle_ = 3;
                 break;                                           
+            }
         }
+        
     }
 
     int TowerDefenseField::getAngle()
@@ -157,7 +183,7 @@
 
     void TowerDefenseField::createFree(int orientation)
     {            
-        model_->setMeshSource("TD_F1.mesh");
+        modelGround_->setMeshSource("TD_F1.mesh");
         tower_ = NULL;
         type_ = FREE;
         setUpgrade(0);
@@ -166,7 +192,7 @@
 
     void TowerDefenseField::createStart(int orientation)
     {      
-        model_->setMeshSource("TD_S5.mesh");
+        modelGround_->setMeshSource("TD_S5.mesh");
         tower_ = NULL;
         type_ = START;
         setUpgrade(0);
@@ -176,7 +202,7 @@
 
     void TowerDefenseField::createEnd(int orientation)
     {     
-        model_->setMeshSource("TD_S4.mesh");
+        modelGround_->setMeshSource("TD_S4.mesh");
         tower_ = NULL;
         type_ = END;
         setUpgrade(0);
@@ -185,7 +211,7 @@
 
     void TowerDefenseField::createStraight(int orientation)
     {      
-        model_->setMeshSource("TD_S1.mesh");
+        modelGround_->setMeshSource("TD_S1.mesh");
         tower_ = NULL;
         type_ = STREET;
         setUpgrade(0);
@@ -194,7 +220,7 @@
 
     void TowerDefenseField::createRCurve(int orientation)
     {     
-        model_->setMeshSource("TD_S2.mesh");
+        modelGround_->setMeshSource("TD_S2.mesh");
         tower_ = NULL;
         type_ = STREET;
         setUpgrade(0);
@@ -203,43 +229,54 @@
 
     void TowerDefenseField::createLCurve(int orientation)
     {    
-        model_->setMeshSource("TD_S3.mesh");
+        modelGround_->setMeshSource("TD_S3.mesh");
         tower_ = NULL;
         type_ = STREET;
         setUpgrade(0);
         setAngle(orientation);
     } 
 
+    void TowerDefenseField::createObstacle(int orientation)
+    {    
+        modelGround_->setMeshSource("TD_F1.mesh");
+        modelObject_->setMeshSource("TD_O1.mesh");
+        tower_ = NULL;
+        type_ = OBSTACLE;
+        setUpgrade(0);
+        setAngle(orientation);
+    }
+
     void TowerDefenseField::createTower(int upgrade)
     {        
         if (tower_ == NULL)
         {
+            modelGround_->setMeshSource("TD_F1.mesh");
             tower_ = new TowerDefenseTower(center_->getContext());
             attach(tower_);
             type_ = TOWER;
             setUpgrade(upgrade);
-            if (upgrade_ > 0 && model_ != NULL)
+            if (upgrade_ > 0 && modelObject_ != NULL)
             {
                 switch (upgrade_)
                 {
                     case 1:
-                        model_->setMeshSource("TD_T1.mesh");                    
+                        modelObject_->setMeshSource("TD_T1.mesh");                    
                         tower_->addTemplate(center_->getTower1Template());
                         break;
                     case 2:
-                        model_->setMeshSource("TD_T2.mesh");
+                        modelObject_->setMeshSource("TD_T2.mesh");
                         tower_->addTemplate(center_->getTower2Template());
                         break;
                     case 3:
-                        model_->setMeshSource("TD_T3.mesh");
+                        modelObject_->setMeshSource("TD_T3.mesh");
                         tower_->addTemplate(center_->getTower3Template());
                         break;
                     case 4:
-                        model_->setMeshSource("TD_T4.mesh");
+                        modelObject_->setMeshSource("TD_T4.mesh");
                         tower_->addTemplate(center_->getTower4Template());
                         break;
                     case 5:
-                        model_->setMeshSource("TD_T5.mesh");
+                        modelObject_->setMeshSource("TD_T5.mesh");
                         tower_->addTemplate(center_->getTower5Template());
                         break;
                 }
@@ -278,7 +315,10 @@
                 break;     
             case 'O':               
                 createEnd(paramInt);
-                break;    
+                break;
+            case 'Y':               
+                createObstacle(paramInt);
+                break;                 
             case 'T':                               
                 createTower(paramInt);               
                 break;                                                                                                         

Modified: code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseField.h
===================================================================
--- code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseField.h	2015-09-17 12:19:51 UTC (rev 10590)
+++ code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseField.h	2015-09-17 13:32:50 UTC (rev 10591)
@@ -51,6 +51,7 @@
         STREET, 
         START, 
         END,
+        OBSTACLE,
         TOWER
     };
 
@@ -76,14 +77,16 @@
             virtual void createStraight(int orientation);
             virtual void createLCurve(int orientation);
             virtual void createRCurve(int orientation);
+            virtual void createObstacle(int orientation);
             virtual void createTower(int upgrade);
-            virtual int getAngle();
+            virtual int getAngle();            
         private:
             virtual void setAngle(int newAngle);            
             virtual void destroyTower();
             int angle_;
             TowerDefenseFieldType type_;
-            Model* model_;
+            Model* modelGround_;
+            Model* modelObject_;
             TowerDefenseTower* tower_;
             TowerDefenseCenterpoint* center_;
             int upgrade_;

Modified: code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseHUDController.cc
===================================================================
--- code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseHUDController.cc	2015-09-17 12:19:51 UTC (rev 10590)
+++ code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseHUDController.cc	2015-09-17 13:32:50 UTC (rev 10591)
@@ -49,18 +49,23 @@
     void TowerDefenseHUDController::tick(float dt)
     {
         SUPER(TowerDefenseHUDController, tick, dt);
+
         const std::string& lifes = multi_cast<std::string>(this->td->getLifes());
         const std::string& credits = multi_cast<std::string>(this->td->getCredit());
         const std::string& wave = multi_cast<std::string>(this->td->getWaveNumber());
 
         if(showlives == true)
-          this->setCaption(multi_cast<std::string>(lifes));
+        {
+            this->setCaption(multi_cast<std::string>(lifes));
+        }          
         else if(showcredits == true)
-          this->setCaption(multi_cast<std::string>(credits));
+        {
+            this->setCaption(multi_cast<std::string>(credits));
+        }          
         else if(showwaves == true)
-          this->setCaption(multi_cast<std::string>(wave));
-
-
+        {
+            this->setCaption(multi_cast<std::string>(wave));
+        }          
     }
 
     void TowerDefenseHUDController::XMLPort(Element& xmlelement, XMLPort::Mode mode)




More information about the Orxonox-commit mailing list