MultiSprite::MultiSprite(const MultiSprite& s) : Drawable(s.getName(), s.getPosition(), s.getVelocity()), frames(s.frames), worldWidth( s.worldWidth ), worldHeight( s.worldHeight ), dt(s.dt), currentFrame(s.currentFrame), numberOfFrames( s.numberOfFrames ), frameInterval( s.frameInterval ), timeSinceLastFrame( s.timeSinceLastFrame ), frameWidth( s.frameWidth ), frameHeight( s.frameHeight ) { }
void Manager::play() { SDL_Event event; SDLSound sound; bool done = false; bool keyCatch = false; bool jumpping = false; bool walking = false; bool once = true; // change the background only once bool enemyExploding = false; while ( not done ) { walking = false; if (life->getCurrentLife() < 0) break; if (once) { theEnemy->setPosition(1300, 330); } else { theEnemy->setPosition(850, 330); yue.setPosition(1300, 330); } // change the background Vector2f p = thePlayer->getcurrent()->getPosition(); if (once && p[0] > 1200) { delete world; world = new World("back2", Gamedata::getInstance().getXmlInt("back2Factor") ); p[0] = 50; thePlayer->getcurrent()->setPosition(p); once = false; } // The new strategy is when the thePlayer->collides with the Enemy // the thePlayer->should explode if (thePlayer->getcurrent()->collidedWith(theEnemy)) { const Vector2f &tmp = thePlayer->getcurrent()->getPosition(); const Vector2f &vel = thePlayer->getcurrent()->getVelocity(); life->update(); thePlayer->getcurrent()->setVelocity(-vel); thePlayer->getcurrent()->setStatus(JUMP); thePlayer->getcurrent()->setPosition(tmp); viewport.setObjectToTrack(sprites[currentSprite]); } for (unsigned int i = 1; i < sprites.size() - 2; i++) { MultiSprite * tmp = (MultiSprite*) sprites[i]; if (thePlayer->getcurrent()->collidedWith(tmp)) { life->update(); } } if (thePlayer->onGround() == true) { jumpping = false; } if (enemyExploding) { if (static_cast<ExplodingSprite*>(theEnemy)->chunkCount() == 0) { enemyExploding = false; break; theEnemy = enemy; } } SDL_PollEvent(&event); Uint8 *keystate = SDL_GetKeyState(NULL); if (event.type == SDL_QUIT) { done = true; break; } if (event.type == SDL_KEYUP) { keyCatch = false; // if free any key , the sprite become a static sprite if (!keystate[SDLK_RIGHT] && !keystate[SDLK_LEFT] && !jumpping) { const Vector2f &pos = thePlayer->getcurrent()->getPosition(); if (thePlayer->getcurrent() == thePlayer->getleft()) thePlayer->setcurrent(thePlayer->getpauseLeft()); else if (thePlayer->getcurrent() == thePlayer->getright()) thePlayer->setcurrent(thePlayer->getpauseRight()); thePlayer->getcurrent()->setPosition(pos); thePlayer->getcurrent()->setStatus(PAUSE); } } if (event.type == SDL_KEYDOWN) { if (keystate[SDLK_ESCAPE] || keystate[SDLK_q]) { done = true; break; } if (keystate[SDLK_F1] && !keyCatch) { keyCatch = true; F1_help = F1_help ? false : true; } if (keystate[SDLK_LEFT] && !keyCatch && !jumpping) { if (thePlayer->getcurrent() != thePlayer->getleft()) { const Vector2f& tmp = thePlayer->getcurrent()->getPosition(); thePlayer->setcurrent(thePlayer->getleft()); thePlayer->getcurrent()->setPosition(tmp); } const Vector2f& vel = thePlayer->getcurrent()->getVelocity(); if (vel[0] > 0) thePlayer->getcurrent()->setVelocity(-vel); //thePlayer->setSpeed(-200, 0); //sprites[sprites.size() - 1] = thePlayer->getcurrent(); thePlayer->getcurrent()->setStatus(LEFT); viewport.setObjectToTrack(sprites[currentSprite]); walking = true; } if (keystate[SDLK_RIGHT] && !keyCatch && !jumpping) { const Vector2f& tmp = thePlayer->getcurrent()->getPosition(); if (thePlayer->getcurrent() != thePlayer->getright()) { thePlayer->setcurrent(thePlayer->getright()); thePlayer->getcurrent()->setPosition(tmp); } const Vector2f& vel = thePlayer->getcurrent()->getVelocity(); if (vel[0] < 0) thePlayer->getcurrent()->setVelocity(-vel); //thePlayer->setSpeed(200, 0); //sprites[sprites.size() - 1] = thePlayer->getcurrent(); thePlayer->getcurrent()->setStatus(RIGHT); viewport.setObjectToTrack(sprites[currentSprite]); walking = true; } if (keystate[SDLK_SPACE] && !keyCatch && !jumpping) { MultiSprite * tmp = thePlayer->getcurrent(); Vector2f v = tmp->getVelocity(); v[1] = -300; Vector2f pos = tmp->getPosition(); if (v[0] > 0) { thePlayer->setcurrent(thePlayer->getjumpRight()); } else if (v[0] < 0) { thePlayer->setcurrent(thePlayer->getjumpLeft()); } thePlayer->getcurrent()->setVelocity(v); thePlayer->getcurrent()->setPosition(pos); viewport.setObjectToTrack(sprites[currentSprite]); thePlayer->getcurrent()->setStatus(JUMP); jumpping = true; } if (keystate[SDLK_f] && !keyCatch && !jumpping && walking) { sound[3]; // the sword's speed is double than sprite Vector2f v = thePlayer->getcurrent()->getVelocity() * 2; Vector2f p = thePlayer->getcurrent()->getPosition(); shootingSword.shoot(p, v); if (shootingSword.collidedWith(theEnemy)) { sound[5]; if (!enemyExploding) { enemyExploding = true; static_cast<ExplodingSprite*>(explodingEnemy)-> reset(theEnemy->getPosition()); theEnemy = explodingEnemy; explodingTimes++; } } } } draw(); update(); } }