Exemplo n.º 1
0
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 )
  { }
Exemplo n.º 2
0
Arquivo: manager.cpp Projeto: run/luna
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();
    }
}