int main(int argc, char** args) { srand(time(0)); SDL_Init(SDL_INIT_EVERYTHING); TTF_Init(); SDL_WM_SetCaption(W_TITLE, 0); SDL_Surface* screen = SDL_SetVideoMode(W_WIDTH, W_HEIGHT, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); SDL_Surface* bground = IMG_Load("bground.bmp"); //Create new Text objects. Text* scoreTxt = new Text("Score: 0", 0, 0, {0, 255, 0}, 20); Text* livesTxt = new Text("Lives: 24", 520, 0, {0, 255, 0}, 20); Text* bulletTxt = new Text("Bullets: 199", 160, 0, {0, 255, 0}, 20); Text* rocketTxt = new Text("Rockets: 100", 320, 0, {0, 255, 0}, 20); Text* gameTxt = new Text("Game Over", 150, 220, {255, 0, 0}, 60); Text* msgTxt = new Text("Enter Name: ", 130, 120, {255, 0, 0}, 22); //Create new SpaceShip object. SpaceShip* objShip = new SpaceShip("rocket.bmp", SHIP_X, SHIP_Y); objShip->setColorKey(0, 0, 0); //Create new Meteor objects. meteorVec.push_back(new Meteor("meteor1.bmp", 50, rand()%300)); meteorVec.push_back(new Meteor("meteor2.bmp", 100, rand()%300)); meteorVec.push_back(new Meteor("meteor3.bmp", 150, rand()%300)); meteorVec.push_back(new Meteor("meteor1.bmp", 200, rand()%300)); meteorVec.push_back(new Meteor("meteor2.bmp", 250, rand()%300)); meteorVec.push_back(new Meteor("meteor3.bmp", 300, rand()%300)); //Create new Bullet objects. for(int i = 0; i < 200; i++) { bulletVec.push_back(new Bullet("bullet.bmp")); } for(int i = 0; i < 100; i++) { rocketVec.push_back(new Bullet("rckt.bmp")); } for(int i = 0; i < 100; i++) { rocketVec2.push_back(new Bullet("rckt.bmp")); } Intro(screen); //Start drawing the game. SDL_BlitSurface(bground, NULL, screen, NULL); for(unsigned i = 0; i < meteorVec.size(); i++) { meteorVec[i]->setColorKey(255, 255, 255); meteorVec[i]->setSpeed((rand()%8 - 4), (1 + rand()%5)); meteorVec[i]->drawObject(screen, bground); } // bonusVec.push_back(new Meteor("rBonus.bmp", 350, rand()%300)); // for(unsigned i = 0; i < bonusVec.size(); i++) { // bonusVec[i]->setColorKey(255, 0, 255); // bonusVec[i]->setSpeed((rand()%8 - 4), (1 + rand()%5)); // bonusVec[i]->drawObject(screen, bground); // } // Text* tt = new Text("TIME: 0", 100, 190, {255, 0, 0}, 22); //Start timer for bonuses tb.start(); objShip->drawObject(screen, bground); scoreTxt->drawText(screen); // tt->drawText(screen); bulletTxt->drawText(screen); //rocketTxt->drawText(screen); livesTxt->drawText(screen); SDL_UpdateRect(screen, 0, 0, 0, 0); bool keysHold[323] = {false}; SDL_Event event; //Start the game. while(true) { if(SDL_PollEvent(&event)) { if(event.type == SDL_QUIT) { break; } if(objShip->isColision(bonusVec,screen)){ bonus=true; rocketTxt->drawText(screen); } if(tb.getTicks()/1000 >= 10){ tb.stop(); bonusState=true; tb.start(); } else if(tb.getTicks()/1000 < 10){bonusState=false;} if(bonusState==true && bonus==false){ bonusVec.push_back(new Meteor("rBonus.bmp", 350, rand()%300)); for(unsigned i = 0; i < bonusVec.size(); i++) { bonusVec[i]->setColorKey(255, 0, 255); bonusVec[i]->setSpeed((rand()%8 - 4), (1 + rand()%5)); bonusVec[i]->drawObject(screen, bground); } } if(event.type == SDL_KEYDOWN) { keysHold[event.key.keysym.sym] = true; if(event.key.keysym.sym == SDLK_ESCAPE) break; if(event.key.keysym.sym == SDLK_SPACE) { if(BULLET < 199) { bulletVec[BULLET]->setSpeed(0, -8); bulletVec[BULLET]->setDstRect(objShip->getDstRect().x+20, objShip->getDstRect().y-20); bulletVec[BULLET]->setColorKey(0, 0, 0); bulletVec[BULLET]->drawObject(screen, bground); BULLET++; bulletTxt->setTextRender("Bullets: ", 199-BULLET); } if(objShip->isColision(bonusVec,screen)){ bonus=true; rocketTxt->drawText(screen); } if(ROCKET < 100 && bonus==true) { rocketVec[ROCKET]->setSpeed(0, -6); rocketVec[ROCKET]->setDstRect(objShip->getDstRect().x, objShip->getDstRect().y); rocketVec[ROCKET]->setColorKey(255, 0, 255); rocketVec[ROCKET]->drawObject(screen, bground); rocketVec2[ROCKET]->setSpeed(0, -6); rocketVec2[ROCKET]->setDstRect(objShip->getDstRect().x+40, objShip->getDstRect().y); rocketVec2[ROCKET]->setColorKey(255, 0, 255); rocketVec2[ROCKET]->drawObject(screen, bground); ROCKET++; if(ROCKET == 99){ for(int i = 0; i < ROCKET; i++){ rocketVec[i]->cleanObject(screen); rocketVec2[i]->cleanObject(screen); } bonus=false; ROCKET = 0; rocketTxt->cleanText(screen); } rocketTxt->setTextRender("Rockets: ", 100-ROCKET); } } } if(event.type == SDL_KEYUP) { keysHold[event.key.keysym.sym] = false; } } //End of event processing. objShip->handleInput(keysHold); if(objShip->isColision(meteorVec, screen)){ livesTxt->setTextRender("Lives: ", --LIVES); } //Redraw Ship object. objShip->cleanObject(screen); objShip->drawObject(screen, bground); //Redraw Bullet objects. for(int i = 0; i < BULLET; i++) { if(!bulletVec[i]->moveObject()) { bulletVec[i]->cleanObject(screen); } else { if(bulletVec[i]->isColision(meteorVec, screen)) { scoreTxt->setTextRender("Score: ", SCORE += 10); } bulletVec[i]->cleanObject(screen); bulletVec[i]->drawObject(screen, bground); } } //Redraw Rocket objects. for(int i = 0; i < ROCKET; i++) { if(!rocketVec[i]->moveObject() || !rocketVec2[i]->moveObject()) { rocketVec[i]->cleanObject(screen); rocketVec2[i]->cleanObject(screen); } else { if(rocketVec[i]->isColision(meteorVec, screen) || rocketVec2[i]->isColision(meteorVec, screen)) { scoreTxt->setTextRender("Score: ", SCORE += 10); } rocketVec[i]->cleanObject(screen); rocketVec[i]->drawObject(screen, bground); rocketVec2[i]->cleanObject(screen); rocketVec2[i]->drawObject(screen, bground); } } //Redraw Meteor objects. for(unsigned i = 0; i < meteorVec.size(); i++) { meteorVec[i]->moveObject(); meteorVec[i]->isColision(meteorVec); meteorVec[i]->cleanObject(screen); meteorVec[i]->drawObject(screen, bground); } //Redraw Bonus objects. for(unsigned i = 0; i < bonusVec.size(); i++) { bonusVec[i]->moveObject(); bonusVec[i]->cleanObject(screen); bonusVec[i]->drawObject(screen, bground); } //tt->setTextRender("TIME: ", tb.getTicks()/1000.f ); //tt->setTextRender("TIME: ", startTime); //Redraw text fields. scoreTxt->cleanText(screen); scoreTxt->drawText(screen); bulletTxt->cleanText(screen); bulletTxt->drawText(screen); if(bonus==true){rocketTxt->cleanText(screen); rocketTxt->drawText(screen);} livesTxt->cleanText(screen); livesTxt->drawText(screen); // tt->cleanText(screen); // tt->drawText(screen); SDL_UpdateRect(screen, 0, 0, 0, 0); if(LIVES == 0) break; //If the game is over. if((fps.getTicks() < 1000/FRAMES_PER_SECOND)) { //Sleep the remaining frame time SDL_Delay((300 /FRAMES_PER_SECOND) - fps.getTicks()); } } // End Game TextInput* name = new TextInput(); name->setTextDst(270, 120, 100, 30); msgTxt->drawText(screen); while(true) { if(SDL_PollEvent(&event)) { name->handleInput(event); if((event.type == SDL_KEYDOWN ) && (event.key.keysym.sym == SDLK_RETURN)) { msgTxt->setTextDst(260, 190, 100, 30); msgTxt->setTextRender(name->getStr().append(" : "), SCORE); msgTxt->drawText(screen); break; } } name->drawText(screen); SDL_UpdateRect(screen, 0, 0, 0, 0); } gameTxt->drawText(screen); SDL_UpdateRect(screen, 0, 0, 0, 0); SDL_Delay(3000); //Cleanup. delete scoreTxt; delete bulletTxt; delete rocketTxt; delete livesTxt; delete gameTxt; delete msgTxt; delete name; // delete tt; delete objShip; for(unsigned i = 0; i < meteorVec.size(); i++) { delete meteorVec[i]; } for(unsigned i = 0; i < bonusVec.size(); i++) { delete bonusVec[i]; } for(unsigned i = 0; i < bulletVec.size(); i++) { delete bulletVec[i]; } for(unsigned i = 0; i < rocketVec.size(); i++) { delete rocketVec[i]; } for(unsigned i = 0; i < rocketVec2.size(); i++){ delete rocketVec2[i]; } SDL_FreeSurface(bground); SDL_FreeSurface(screen); SDL_Quit(); return 0; }//End of Main.