Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Sep 15, 2015, 2:20:34 PM (9 years ago)
Author:
fvultier
Message:

Removed unuses classes and templates. The enemies move now along a path defined in the XML level file and no more along a static hard coded path.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.cc

    r10258 r10586  
    3737 *
    3838 *
    39  *
    4039 *TIPP: Eclipse hilft euch schnell auf bereits vorhanden Funktionen zuzugreifen:
    4140 * einfach "this->" eingeben und kurz warten. Dann tauch eine Liste mit Vorschlägen auf. Wenn ihr jetzt weiter
     
    7675#include "TowerDefenseTower.h"
    7776#include "TowerDefenseCenterpoint.h"
    78 //#include "TDCoordinate.h"
    79 #include "TowerTurret.h"
    8077#include "worldentities/SpawnPoint.h"
    81 #include "worldentities/pawns/Pawn.h"
    82 #include "worldentities/pawns/SpaceShip.h"
    8378#include "controllers/WaypointController.h"
    8479#include "graphics/Model.h"
     
    8984#include "core/command/ConsoleCommand.h"
    9085
     86
    9187namespace orxonox
    9288{
     89    static const std::string __CC_addTower_name  = "addTower";
     90    static const std::string __CC_upgradeTower_name = "upgradeTower";
     91
     92    SetConsoleCommand("TowerDefense", __CC_addTower_name,  &TowerDefense::addTower ).addShortcut().defaultValues(1);
     93    SetConsoleCommand("TowerDefense", __CC_upgradeTower_name, &TowerDefense::upgradeTower).addShortcut().defaultValues(0);
     94
    9395    RegisterUnloadableClass(TowerDefense);
    9496
    95     TowerDefense::TowerDefense(Context* context) : Deathmatch(context)
     97    TowerDefense::TowerDefense(Context* context) : TeamDeathmatch(context)
    9698    {
    9799        RegisterObject(TowerDefense);
    98 /*
    99         for (int i=0; i < 16 ; i++){
    100             for (int j = 0; j< 16 ; j++){
    101                 towermatrix[i][j] = NULL;
    102             }
    103         }*/
    104 
     100
     101        selecter = NULL;
     102        this->player_ = NULL;       
    105103        this->setHUDTemplate("TowerDefenseHUD");
     104        this->nextwaveTimer_.setTimer(10, false, createExecutor(createFunctor(&TowerDefense::nextwave, this)));
     105        this->nextwaveTimer_.stopTimer();
     106        this->waves_ = 0;
     107        this->time = 0;
     108        this->credit_ = 0;
     109        this->lifes_ = 0;
    106110
    107111        //this->stats_ = new TowerDefensePlayerStats();
    108112
    109         /* Temporary hack to allow the player to add towers and upgrade them */
    110         this->dedicatedAddTower_ = createConsoleCommand( "addTower", createExecutor( createFunctor(&TowerDefense::addTower, this) ) );
    111         this->dedicatedUpgradeTower_ = createConsoleCommand( "upgradeTower", createExecutor( createFunctor(&TowerDefense::upgradeTower, this) ) );
     113        ModifyConsoleCommand(__CC_addTower_name).setObject(this);
     114        ModifyConsoleCommand(__CC_upgradeTower_name).setObject(this);
    112115    }
    113116
    114117    TowerDefense::~TowerDefense()
    115     {
    116         /* Part of a temporary hack to allow the player to add towers */
     118    {        /* Part of a temporary hack to allow the player to add towers */
    117119        if (this->isInitialized())
    118120        {
    119             if( this->dedicatedAddTower_ )
    120                 delete this->dedicatedAddTower_;
     121            ModifyConsoleCommand(__CC_addTower_name).setObject(NULL);
     122            ModifyConsoleCommand(__CC_upgradeTower_name).setObject(NULL);
    121123        }
    122124    }
     
    124126    void TowerDefense::setCenterpoint(TowerDefenseCenterpoint *centerpoint)
    125127    {
    126         orxout() << "Centerpoint now setting..." << endl;
    127128        this->center_ = centerpoint;
    128         orxout() << "Centerpoint now set..." << endl;
    129129    }
    130130
    131131    void TowerDefense::start()
    132     {
    133 
    134         Deathmatch::start();
    135 
    136 // Waypoints: [1,3] [10,3] [10,11] [13,11] -> add the points to a matrix so the player cant place towers on the path
    137         for (int i=0; i < 16 ; i++){
    138             for (int j = 0; j< 16 ; j++){
    139                 towermatrix[i][j] = false;
    140             }
    141         }
    142 
    143         for (int k=0; k<3; k++)
    144             towermatrix[1][k]=true;
    145         for (int l=1; l<11; l++)
    146             towermatrix[l][3]=true;
    147         for (int m=3; m<12; m++)
    148             towermatrix[10][m]=true;
    149         for (int n=10; n<14; n++)
    150             towermatrix[n][11]=true;
    151         for (int o=13; o<16; o++)
    152             towermatrix[13][o]=true;
     132    {       
     133        if (center_ != NULL) // There needs to be a TowerDefenseCenterpoint, i.e. the area the game takes place.
     134        {
     135            if (selecter == NULL)
     136            {
     137                selecter = new TowerDefenseSelecter(this->center_->getContext());               
     138            }
     139            selecter->addTemplate(center_->getSelecterTemplate());
     140            center_->attach(selecter);
     141        }
     142        else // If no centerpoint was specified, an error is thrown and the level is exited.
     143        {
     144            orxout(internal_error) << "Jump: No Centerpoint specified." << endl;
     145            return;
     146        }
     147
     148        enemies_.clear();
     149
     150        createFields();
     151
     152        TeamDeathmatch::start();
     153
     154        // Waypoints: [1,3] [10,3] [10,11] [13,11] -> add the points to a matrix so the player cant place towers on the path
     155       
    153156
    154157        //set initial credits, lifes and WaveNumber
    155         this->setCredit(200);
    156         this->setLifes(50);
     158        this->setCredit(1000);
     159        this->setLifes(100);
    157160        this->setWaveNumber(0);
    158         time=0.0;
    159 
    160         //adds initial towers
    161         for (int i=0; i <7; i++){
    162             addTower(i+3,4);
    163         }/*
    164         for (int j=0; j < 7; j++){
    165             addTower(9,j+5);
    166         }*/
     161        time = 0.0;
    167162    }
    168163
    169164    // Generates a TowerDefenseEnemy. Uses Template "enemytowerdefense". Sets position at first waypoint of path.
    170     void TowerDefense::addTowerDefenseEnemy(std::vector<TDCoordinate*> path, int templatenr){
    171 
     165    void TowerDefense::addTowerDefenseEnemy(int templatenr)
     166    {
     167        orxout() << "addTowerDefenseEnemy" << endl;
    172168
    173169        TowerDefenseEnemy* en1 = new TowerDefenseEnemy(this->center_->getContext());
     
    185181            en1->setScale(2);
    186182            en1->setHealth(en1->getHealth() + this->getWaveNumber()*4);
    187             //  en1->setShieldHealth(en1->getShield() = this->getWaveNumber()*2))
    188183            break;
    189184
     
    193188            en1->setHealth(en1->getHealth() + this->getWaveNumber()*4);
    194189            break;
    195         }
    196 
    197         en1->getController();
    198         en1->setPosition(path.at(0)->get3dcoordinate());
    199         TowerDefenseEnemyvector.push_back(en1);
    200 
    201         for(unsigned int i = 0; i < path.size(); ++i)
    202         {
    203             en1->addWaypoint((path.at(i)));
    204         }
     190        }       
     191
     192        en1->setTeam(2);
     193
     194        //orxonox::WeakPtr<WaypointController> controller = new WaypointController(this->center_->getContext());
     195        //controller->setControllableEntity(en1);
     196        //en1->setController(controller);
     197
     198        WaypointController* controller = (WaypointController*)(en1->getXMLController());
     199
     200        if (controller != NULL && waypoints_.size() > 1)
     201        {
     202            en1->setPosition(waypoints_.at(0)->getPosition());
     203            en1->setOrientation(Vector3(0,0,10), Degree(0));
     204            en1->setDirection(Vector3(0,1,0));
     205            en1->lookAt(waypoints_.at(1)->getPosition());
     206
     207            for (unsigned int i = 0; i < waypoints_.size(); ++ i)
     208            {
     209                orxonox::WeakPtr<MovableEntity> waypoint = new MovableEntity(this->center_->getContext());
     210                waypoint->setPosition(waypoints_.at(i)->getPosition());
     211                controller->addWaypoint(waypoints_.at(i));
     212            }
     213        }
     214
     215        enemies_.push_back(en1);
    205216    }
    206217
     
    209220    {
    210221
    211         Deathmatch::end();
     222        TeamDeathmatch::end();
    212223        ChatManager::message("Match is over! Gameover!");
    213224
    214225    }
    215226
     227    void TowerDefense::spawnPlayer(PlayerInfo* player)
     228    {
     229        assert(player);
     230        player_ = player;
     231
     232        orxout() << "spawnPlayer" << endl;
     233
     234        if (selecter->getPlayer() == NULL)
     235        {
     236            player_->startControl(selecter);
     237            players_[player].state_ = PlayerState::Alive;
     238        }
     239    }
     240
     241    /**
     242    @brief
     243        Get the player.
     244    @return
     245        Returns a pointer to the player. If there is no player, NULL is returned.
     246    */
     247    PlayerInfo* TowerDefense::getPlayer(void) const
     248    {
     249        return this->player_;
     250    }
     251
    216252    //not working yet
    217     void TowerDefense::upgradeTower(int x,int y)
    218     {/*
    219         const int upgradeCost = 20;
    220 
    221         if (!this->hasEnoughCreditForTower(upgradeCost))
    222         {
    223             orxout() << "not enough credit: " << (this->getCredit()) << " available, " << upgradeCost << " needed.";
    224             return;
    225         }
    226 
    227         if (towermatrix [x][y] == NULL)
    228         {
    229             orxout() << "no tower on this position" << endl;
    230             return;
    231         }
    232 
    233         else
    234         {
    235             (towermatrix [x][y])->upgradeTower();
    236         }*/
     253    void TowerDefense::addTower(int x,int y)
     254    {
     255        TDCoordinate* coord = new TDCoordinate(x,y);
     256        x = coord->GetX();
     257        y = coord->GetY();
     258
     259        int cost = center_->getTowerCost(1);
     260
     261        if (fields_[x][y]->isFree() == true && getCredit() >= cost)
     262        {
     263            payCredit(cost);
     264            fields_[x][y]->createTower(1);
     265        }
    237266    }
    238267
    239268    /*adds Tower at Position (x,y) and reduces credit and adds the point to the towermatrix. template ("towerturret")
    240269    so towers have ability if the turrets
    241 
    242270    */
    243     void TowerDefense::addTower(int x, int y)
    244     {
    245         const int towerCost = 20;
    246 
    247         if (!this->hasEnoughCreditForTower(towerCost))
    248         {
    249             orxout() << "not enough credit: " << (this->getCredit()) << " available, " << towerCost << " needed.";
     271
     272    void TowerDefense::upgradeTower(int x, int y)
     273    {   
     274        TDCoordinate* coord = new TDCoordinate(x,y);
     275        x = coord->GetX();
     276        y = coord->GetY();     
     277
     278        int cost = center_->getTowerCost(fields_[x][y]->getUpgrade() + 1);
     279
     280        if (fields_[x][y]->isFree() == false && fields_[x][y]->canUpgrade() == true && getCredit() >= cost)
     281        {
     282            payCredit(cost);
     283            fields_[x][y]->upgrade();
     284        }
     285    }   
     286
     287    void TowerDefense::tick(float dt)
     288    {
     289        //orxout() << "tick1" << endl;
     290        SUPER(TowerDefense, tick, dt);
     291        //orxout() << "tick2" << endl;
     292
     293        if (hasStarted() == false || player_ == NULL)
     294        {
    250295            return;
    251296        }
    252 
    253         if (towermatrix [x][y]==true)
    254         {
    255             orxout() << "not possible to put tower here!!" << endl;
    256             return;
    257         }
    258 
    259 /*
    260         unsigned int width = this->center_->getWidth();
    261         unsigned int height = this->center_->getHeight();
    262 */
    263 
    264         int tileScale = (int) this->center_->getTileScale();
    265 
    266         if (x > 15 || y > 15 || x < 0 || y < 0)
    267         {
    268             //Hard coded: TODO: let this depend on the centerpoint's height, width and fieldsize (fieldsize doesn't exist yet)
    269             orxout() << "Can not add Tower: x and y should be between 0 and 15" << endl;
    270             return;
    271         }
    272 
    273         orxout() << "Will add tower at (" << (x-8) * tileScale << "," << (y-8) * tileScale << ")" << endl;
    274 
    275        //Reduce credit
    276         this->buyTower(towerCost);
    277         towermatrix [x][y]=true;
    278 
    279         //Creates tower
    280         TowerDefenseTower* towernew = new TowerDefenseTower(this->center_->getContext());
    281         towernew->addTemplate("towerturret");
    282         towernew->setPosition(static_cast<float>((x-8) * tileScale), static_cast<float>((y-8) * tileScale), 75);
    283         towernew->setGame(this);
    284     }
    285 
    286     bool TowerDefense::hasEnoughCreditForTower(int towerCost)
    287     {
    288         return ((this->getCredit()) >= towerCost);
    289     }
    290 
    291 
    292     bool TowerDefense::hasEnoughCreditForUpgrade()
    293     {
    294         return true;
    295     }
    296 
    297  
    298     void TowerDefense::tick(float dt)
    299     {
    300         SUPER(TowerDefense, tick, dt);
    301         time +=dt;
    302 
    303         TDCoordinate* coord1 = new TDCoordinate(1,1);
    304         std::vector<TDCoordinate*> path;
    305         path.push_back(coord1);
    306         if(time>1 && TowerDefenseEnemyvector.size() < 30)
     297        time += dt;       
     298
     299        //build/upgrade tower at selecter position
     300        if (selecter != NULL && selecter->buildTower_ == true)
     301        {
     302            selecter->buildTower_ = false;
     303
     304            if (getField(selecter->selectedPos_)->canUpgrade() == true)
     305            {
     306                upgradeTower(selecter->selectedPos_->GetX(), selecter->selectedPos_->GetY());
     307            }
     308            else
     309            {
     310                addTower(selecter->selectedPos_->GetX(), selecter->selectedPos_->GetY());
     311            }           
     312        }
     313
     314        if (time >= 1.3 * enemies_.size() && enemies_.size() < 10)
    307315        {
    308316            //adds different types of enemys depending on the WaveNumber
    309             addTowerDefenseEnemy(path, this->getWaveNumber() % 3 +1 );
    310             time = time-1;
    311         }
    312 
    313         Vector3* endpoint = new Vector3(500, 700, 150);
     317            addTowerDefenseEnemy(this->getWaveNumber() % 3 +1 );
     318        }
     319
    314320        //if ships are at the end they get destroyed
    315         for(unsigned int i =0; i < TowerDefenseEnemyvector.size(); ++i)
    316         {
    317             if(TowerDefenseEnemyvector.at(i) != NULL && TowerDefenseEnemyvector.at(i)->isAlive())
    318             {
    319                 //destroys enemys at the end of teh path and reduces the life by 1. no credits gifted
    320 
    321                 Vector3 ship = TowerDefenseEnemyvector.at(i)->getRVWorldPosition();
    322                 float distance = ship.distance(*endpoint);
    323 
    324                 if(distance <50){
    325                     TowerDefenseEnemyvector.at(i)->destroy();
    326                     this->reduceLifes(1);
    327                     this->buyTower(1);
    328                     if (this->getLifes()==0)
    329                     {
    330                         this->end();
    331                     }
     321
     322        std::vector<orxonox::WeakPtr<TowerDefenseEnemy> >::iterator itBegin = enemies_.begin();
     323        std::vector<orxonox::WeakPtr<TowerDefenseEnemy> >::iterator it = itBegin;
     324        std::vector<orxonox::WeakPtr<TowerDefenseEnemy> >::iterator itEnd = enemies_.end();
     325
     326        while(it != itEnd)
     327        {
     328            //destroys enemys at the end of the path and reduces the life by 1. No credits gifted
     329            Vector3 ship = (*it)->getRVWorldPosition();
     330            float distance = ship.distance(endpoint_);
     331            if(distance < 50)
     332            {
     333                std::vector<orxonox::WeakPtr<TowerDefenseEnemy> >::iterator itTemp = it;
     334                ++ it;
     335                orxout() << "enemy deleted" << endl;               
     336                enemies_.erase(itTemp);
     337                (*itTemp)->destroy();
     338                this->reduceLifes(1);
     339                if (this->getLifes() == 0)
     340                {
     341                    this->end();
    332342                }
    333343            }
    334         }
    335         //goes thorugh vector to see if an enemy is still alive. if not next wave is launched
    336         int count= 0;
    337         for(unsigned int i =0; i < TowerDefenseEnemyvector.size(); ++i)
    338         {
    339             if(TowerDefenseEnemyvector.at(i)!= NULL)
    340             {
    341                 ++count;
    342             }
    343         }
    344 
    345         if(count== 0)
    346         {
    347             time2 +=dt;
    348             if(time2 > 10)
    349             {
    350                 TowerDefenseEnemyvector.clear();
    351                 this->nextwave();
    352                 time=0;
    353                 time2=0;
    354             }
    355         }
    356 
    357 
    358     }
    359 
    360     // Function to test if we can add waypoints using code only. Doesn't work yet
    361 
    362     // THE PROBLEM: WaypointController's getControllableEntity() returns null, so it won't track. How do we get the controlableEntity to NOT BE NULL???
    363     /*
    364     void TowerDefense::addWaypointsAndFirstEnemy()
    365     {
    366         SpaceShip *newShip = new SpaceShip(this->center_);
    367         newShip->addTemplate("spaceshipassff");
    368 
    369         WaypointController *newController = new WaypointController(newShip);
    370         newController->setAccuracy(3);
    371 
    372         Model *wayPoint1 = new Model(newController);
    373         wayPoint1->setMeshSource("crate.mesh");
    374         wayPoint1->setPosition(7,-7,5);
    375         wayPoint1->setScale(0.2);
    376 
    377         Model *wayPoint2 = new Model(newController);
    378         wayPoint2->setMeshSource("crate.mesh");
    379         wayPoint2->setPosition(7,7,5);
    380         wayPoint2->setScale(0.2);
    381 
    382         newController->addWaypoint(wayPoint1);
    383         newController->addWaypoint(wayPoint2);
    384 
    385         // The following line causes the game to crash
    386 
    387         newShip->setController(newController);
    388 //        newController -> getPlayer() -> startControl(newShip);
    389         newShip->setPosition(-7,-7,5);
    390         newShip->setScale(0.1);
    391         //newShip->addSpeed(1);
    392 
    393 
    394 
    395 //      this->center_->attach(newShip);
    396     }
    397     */
     344            else
     345            {
     346                ++ it;
     347            }
     348        }       
     349
     350        if (enemies_.size() == 0 && !this->nextwaveTimer_.isActive())
     351        {
     352            this->nextwaveTimer_.startTimer();
     353        }
     354    }
     355
     356    void TowerDefense::createFields()
     357    {
     358        assert(center_);
     359        TDCoordinate coord(0,0);
     360        TDCoordinate startCoord(0,0);
     361
     362        std::string fields = center_->getFields();
     363        int pos = 0;
     364        for (int j = 15; j >= 0; --j)
     365        {
     366            for (int i = 0; i < 16; ++i)
     367            {
     368                coord.Set(i,j);
     369                fields_[i][j] = new TowerDefenseField(center_->getContext());
     370                fields_[i][j]->setCenterpoint(center_);
     371                center_->attach(fields_[i][j]);
     372                fields_[i][j]->setPosition(coord.get3dcoordinate());               
     373                fields_[i][j]->create(fields.at(pos), fields.at(pos+1));           
     374                pos += 2;
     375                if (fields_[i][j]->getType() == START)
     376                {
     377                    startCoord.Set(i,j);
     378                    waypoints_.push_back(fields_[i][j]);
     379                }
     380            }
     381        }
     382
     383        //Place waypoints along the street for the waypoint controllers of the enemies
     384        TDCoordinate* thisCoord = &startCoord;
     385        TDCoordinate* nextCoord;
     386        while ((nextCoord = getNextStreetCoord(thisCoord)) != NULL)
     387        {
     388            waypoints_.push_back(fields_[nextCoord->GetX()][nextCoord->GetY()]);           
     389            thisCoord = nextCoord;
     390            endpoint_ = nextCoord->get3dcoordinate();
     391        }
     392
     393    }
     394
     395    TDCoordinate* TowerDefense::getNextStreetCoord(TDCoordinate* thisCoord)
     396    {       
     397        TowerDefenseField* thisField = fields_[thisCoord->GetX()][thisCoord->GetY()];
     398        TDCoordinate* nextCoord = new TDCoordinate(0,0);
     399
     400        if (thisField->getType() != STREET && thisField->getType() != START)
     401        {
     402            return NULL;
     403        }
     404
     405        if (thisField->getAngle() == 0)
     406        {
     407            nextCoord->Set(thisCoord->GetX(), thisCoord->GetY() - 1);
     408        }
     409        else if (thisField->getAngle() == 1)
     410        {
     411            nextCoord->Set(thisCoord->GetX() + 1, thisCoord->GetY());
     412        }
     413        else if (thisField->getAngle() == 2)
     414        {
     415            nextCoord->Set(thisCoord->GetX(), thisCoord->GetY() + 1);
     416        }
     417        else if (thisField->getAngle() == 3)
     418        {
     419            nextCoord->Set(thisCoord->GetX() - 1, thisCoord->GetY());
     420        }
     421
     422        if (thisCoord->GetX() != nextCoord->GetX() || thisCoord->GetY() != nextCoord->GetY())
     423        {
     424            return nextCoord;
     425        }
     426
     427        return NULL;
     428    }
     429
    398430    /*
    399431    void TowerDefense::playerEntered(PlayerInfo* player)
    400432    {
    401         Deathmatch::playerEntered(player);
     433        TeamDeathmatch::playerEntered(player);
    402434
    403435        const std::string& message = player->getName() + " entered the game";
     
    407439    bool TowerDefense::playerLeft(PlayerInfo* player)
    408440    {
    409         bool valid_player = Deathmatch::playerLeft(player);
     441        bool valid_player = TeamDeathmatch::playerLeft(player);
    410442
    411443        if (valid_player)
     
    437469        }
    438470
    439         Deathmatch::pawnKilled(victim, killer);
     471        TeamDeathmatch::pawnKilled(victim, killer);
    440472    }
    441473
Note: See TracChangeset for help on using the changeset viewer.