- Timestamp:
- Sep 15, 2015, 2:20:34 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefense.cc
r10258 r10586 37 37 * 38 38 * 39 *40 39 *TIPP: Eclipse hilft euch schnell auf bereits vorhanden Funktionen zuzugreifen: 41 40 * einfach "this->" eingeben und kurz warten. Dann tauch eine Liste mit Vorschlägen auf. Wenn ihr jetzt weiter … … 76 75 #include "TowerDefenseTower.h" 77 76 #include "TowerDefenseCenterpoint.h" 78 //#include "TDCoordinate.h"79 #include "TowerTurret.h"80 77 #include "worldentities/SpawnPoint.h" 81 #include "worldentities/pawns/Pawn.h"82 #include "worldentities/pawns/SpaceShip.h"83 78 #include "controllers/WaypointController.h" 84 79 #include "graphics/Model.h" … … 89 84 #include "core/command/ConsoleCommand.h" 90 85 86 91 87 namespace orxonox 92 88 { 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 93 95 RegisterUnloadableClass(TowerDefense); 94 96 95 TowerDefense::TowerDefense(Context* context) : Deathmatch(context)97 TowerDefense::TowerDefense(Context* context) : TeamDeathmatch(context) 96 98 { 97 99 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; 105 103 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; 106 110 107 111 //this->stats_ = new TowerDefensePlayerStats(); 108 112 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); 112 115 } 113 116 114 117 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 */ 117 119 if (this->isInitialized()) 118 120 { 119 if( this->dedicatedAddTower_ )120 delete this->dedicatedAddTower_;121 ModifyConsoleCommand(__CC_addTower_name).setObject(NULL); 122 ModifyConsoleCommand(__CC_upgradeTower_name).setObject(NULL); 121 123 } 122 124 } … … 124 126 void TowerDefense::setCenterpoint(TowerDefenseCenterpoint *centerpoint) 125 127 { 126 orxout() << "Centerpoint now setting..." << endl;127 128 this->center_ = centerpoint; 128 orxout() << "Centerpoint now set..." << endl;129 129 } 130 130 131 131 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 153 156 154 157 //set initial credits, lifes and WaveNumber 155 this->setCredit( 200);156 this->setLifes( 50);158 this->setCredit(1000); 159 this->setLifes(100); 157 160 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; 167 162 } 168 163 169 164 // 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; 172 168 173 169 TowerDefenseEnemy* en1 = new TowerDefenseEnemy(this->center_->getContext()); … … 185 181 en1->setScale(2); 186 182 en1->setHealth(en1->getHealth() + this->getWaveNumber()*4); 187 // en1->setShieldHealth(en1->getShield() = this->getWaveNumber()*2))188 183 break; 189 184 … … 193 188 en1->setHealth(en1->getHealth() + this->getWaveNumber()*4); 194 189 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); 205 216 } 206 217 … … 209 220 { 210 221 211 Deathmatch::end();222 TeamDeathmatch::end(); 212 223 ChatManager::message("Match is over! Gameover!"); 213 224 214 225 } 215 226 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 216 252 //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 } 237 266 } 238 267 239 268 /*adds Tower at Position (x,y) and reduces credit and adds the point to the towermatrix. template ("towerturret") 240 269 so towers have ability if the turrets 241 242 270 */ 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 { 250 295 return; 251 296 } 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) 307 315 { 308 316 //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 314 320 //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(); 332 342 } 333 343 } 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 398 430 /* 399 431 void TowerDefense::playerEntered(PlayerInfo* player) 400 432 { 401 Deathmatch::playerEntered(player);433 TeamDeathmatch::playerEntered(player); 402 434 403 435 const std::string& message = player->getName() + " entered the game"; … … 407 439 bool TowerDefense::playerLeft(PlayerInfo* player) 408 440 { 409 bool valid_player = Deathmatch::playerLeft(player);441 bool valid_player = TeamDeathmatch::playerLeft(player); 410 442 411 443 if (valid_player) … … 437 469 } 438 470 439 Deathmatch::pawnKilled(victim, killer);471 TeamDeathmatch::pawnKilled(victim, killer); 440 472 } 441 473
Note: See TracChangeset
for help on using the changeset viewer.