Esempio n. 1
0
/*** This should be called when Objects colided. If 1/2 of the object height is > the other objects minY
it will hurt the other object with damage dmg.***/
void EnemyObject::simpleWalkerHurt(GameObject* pPlayer, const uint32_t otherType) {
    auto player = pPlayer->getHitbox();
    auto rThis = getHitbox();
    if (rThis->getMidY() > player->getMinY()) {
      pPlayer->hurt(dmg, Vec2(getVelocityX(), fSimpleHurtForce));
    }
}
Esempio n. 2
0
	void Mogh::collision(gen::Sprite* other, gen::World* w){
		
		if(Troll* ch = dynamic_cast<Troll*>(other)){
			damaged = true; 
			setCurrentAnimationVector("DAMAGED"); 
			setHealth(getHealth() - 10);
			setTimer( SDL_GetTicks() + 2000  );
			setCollidable(false);
			setVelocityX(getVelocityX()*2); 
			setVelocityY(getVelocityY()*2);
		
		}
		else if(gen::Object* o = dynamic_cast<gen::Object*>(other)){
			std::string direction = getKeyOfCurrentAnimationVector(); 
			if(direction == "LEFT"){
				setMovementX(getVelocityX());
				moveX(w);
			}
			else if(direction == "RIGHT"){
				setMovementX(-getVelocityX());
				moveX(w);
			}
			else if(direction == "BACK"){
				setMovementY(getVelocityY());
				moveY(w);
			} 
			else if(direction == "FRONT"){
				setMovementY(-getVelocityY());
				moveY(w);
			}
		}
		else if(SeaStar* s = dynamic_cast<SeaStar*>(other)){
			damaged = true; 
			setCurrentAnimationVector("DAMAGED"); 
			setHealth(getHealth() - s->getDamage()); 			
			setTimer( SDL_GetTicks() + 2000 );
			setCollidable(false);
			setVelocityX(getVelocityX()*2); 
			setVelocityY(getVelocityY()*2);
		}
	} 
Esempio n. 3
0
void Ground::update(int deltaTime)
{

    setOffsetX(getOffsetX() - (getVelocityX() * (deltaTime/1000.0f)));
    //cout << "Ground Offset X: " << getOffsetX() << endl;
    if (getOffsetX() <= -808.0f)
    {
        setOffsetX(0.0f);
    }

    //Shift the collision boxes
    shiftCollisionBoxes();

}
Esempio n. 4
0
//A stupid Walk algorithm. Change Direction When The Objects X-velocity is == 0
void EnemyObject::stupidWalk(const float delta) {
  if (getVelocityX() == 0) {
    if (getPrevDir() == GO_LEFT) {
      setVelocityX(speed);
      setPrevDir(GO_RIGHT);
      objectSprite->setScaleX(1 * abs(objectSprite->getScale()));;
    }
    else {
      setVelocityX(-speed);
      setPrevDir(GO_LEFT);
      objectSprite->setScaleX(-1 * abs(objectSprite->getScale()));;
    }
  }
}
Esempio n. 5
0
void UfoObject::deadState(){
  HP = 0;
  plingSFX->play(0.3f);
  addGravityToObject(true);
  this->bWallCollisions = false;
  setVelocityY(70);
  this->unschedule(schedule_selector(UfoObject::AIUpdate));
  this->unschedule(schedule_selector(UfoObject::update));
  removeWhenBelowZero();
  setVelocityX(getVelocityX()*0.1);
  setVelocityY(getVelocityY()*0.1);
  objectSprite->setRotation(25);
  dropCoin(3);
}
Esempio n. 6
0
/*** Add this function to the objects update function to make it turn at edges. This Algorithm was not designed For slopes.
If the objects path includes slopes use a predefined zone instead***/
void EnemyObject::turnAtEdge(const float delta) {
  const float lookAhead = 0.5f*getVelocityX() / delta;
  auto const hitbox = getHitbox();
  if (!isBlocked((uint32_t)((hitbox->getMidX() + lookAhead) / 16.0), (uint32_t)(hitbox->getMinY() - 1) / 16.0)) {
    if (getPrevDir() == GO_LEFT) {
      setVelocityX(speed);
      setPrevDir(GO_RIGHT);
      objectSprite->setScaleX(1);
    }
    else {
      setVelocityX(-speed);
      setPrevDir(GO_LEFT);
      objectSprite->setScaleX(-1);
    }
  }
}
Esempio n. 7
0
	void Mogh::tick(gen::GameEngine* ge){
		if(getHealth() < 1){
			SDL_Flip(gen::global.screen);
			SDL_Delay(4000);
			ge->setGameOver(true);
			return; 
		}

		if(damaged){
			if(SDL_GetTicks() > getTimer()){
				setCollidable(true);
				setVelocityX(getVelocityX()/2); 
				setVelocityY(getVelocityY()/2);
				damaged = false; 
			}		
		} 
		Hero::tick(ge);

		if(hpText == 0){
			hpText =  gen::Text::createText("c:\\WINDOWS\\Fonts\\arial.ttf", 30, "0", 0, 0, 0);
			hpText->setPositions(10, 10);
		}
		std::stringstream s;
		s << "HP: "; 
		s << getHealth();
		hpText->setMessage(s.str()); 
		
		if(amountKilled == 0){
			amountKilled =  gen::Text::createText("c:\\WINDOWS\\Fonts\\arial.ttf", 30, "0", 0, 0, 0);
			amountKilled->setPositions(200, 10);
		}
		std::stringstream s2;
		s2 << "Killscore: "; 
		s2 << Character::getAmountRemoved();
		amountKilled->setMessage(s2.str()); 
		
		hpText->tick(ge);
		amountKilled->tick(ge); 

	}
Esempio n. 8
0
void Enemy::updateMovement(float timeStep) {

    //Get target X,Y so we can ignore sprite sizes
    int targetYCompare = (int)(currentTarget->getY() - ((getHeight() - currentTarget->getHeight()) / 2.f));
    int targetXCompare = (int)(currentTarget->getX() - ((getWidth() - currentTarget->getWidth()) / 2.f));

    bool tmp_movingY = m_movingY;
    bool tmp_movingX = m_movingX;

    float delta_x = 0.0;
    float delta_y = 0.0;

    //Move vertical
    if(  tmp_movingY && 
       ((getY() < targetYCompare - (config::W_HEIGHT / m_diagonalSensitivity)) || 
        (getY() > targetYCompare + (config::W_HEIGHT / m_diagonalSensitivity)) 
        )) 
        tmp_movingX = true;

    if ( tmp_movingX &&
       ((getX() < targetXCompare - (config::W_WIDTH / m_diagonalSensitivity)) ||
        (getX() > targetXCompare + (config::W_WIDTH / m_diagonalSensitivity))
        ))
        tmp_movingY = true;

    if(tmp_movingY && (getY() == targetYCompare)) tmp_movingX = true;
    if(tmp_movingX && (getX() == targetXCompare)) tmp_movingY = true;

    if(tmp_movingY) {
        if ( getY() < targetYCompare ) {
            delta_y += (getVelocityY() * timeStep);
            if ( (getY() + delta_y) + getHeight() > config::W_HEIGHT) {
                setY(static_cast<float>(config::W_HEIGHT - getHeight())); //Prevent from going out of screen
                delta_y = 0.0;
            }
            if ( (getY() + delta_y) > targetYCompare) {
                setY(float(targetYCompare));
                delta_y = 0.0;
            }
            if (tmp_movingX == false) {
                m_direction = DOWN;
            }
        } else if ( getY() > targetYCompare) {
            delta_y -= (getVelocityY() * timeStep);
            if ( (getY() + delta_y) < 0) {
                setY(0);
                delta_y = 0.0;
            }
            if ( (getY() + delta_y) < targetYCompare) {
                setY(float(targetYCompare));
                delta_y = 0.0;
            }
            if( tmp_movingX == false ) {
                m_direction = UP;
            }
        }
    }
    //Move horizontal
    if(tmp_movingX) {
        if (getX() < targetXCompare) {
            delta_x += (getVelocityX() * timeStep);
            if ( (getX() + delta_x) + getWidth() > config::W_WIDTH) {
                setX(static_cast<float>(config::W_WIDTH - getWidth()));
                delta_x = 0.0;
            }
            if ( (getX() + delta_x) > targetXCompare) {
                setX(float(targetXCompare));
                delta_x = 0.0;
            }
            if( tmp_movingY == false ) {
                m_direction = RIGHT;
            }

        } else if (getX() > targetXCompare) {
            delta_x -= (getVelocityX() * timeStep);
            if ( (getX() + delta_x) < 0) {
                setX(0);
                delta_x = 0.0;
            }
            if ( (getX() + delta_x) < targetXCompare) {
                setX(float(targetXCompare));
                delta_x = 0.0;
            }
            if( tmp_movingY == false ) {
                m_direction = LEFT;
            }
        }
    }

    // Update the calculated position
    if (delta_x != 0.0 && delta_y != 0.0 && !config::OLD_DIAGONAL_SPEED) {
        /* Going to explain the multiplier value here
         *                      |
         *                    / |
         *   sqrt(2*2 + 3*3)/   |
         *                /     | 3
         *              /       |
         *            / - - - - |
         *                 2
         * And the value I want is ((2+3)/2) / sqrt(2*2 + 3*3)
         * which is :                 2.5    / sqrt(13)
         *                            2.5    / 3.605551275463989    = 0.69~
         * However in our case we can assume the enemy always moves with equal speed in both X and Y,
         * because FPS::FPSControl.GetSpeedFactor() doesn't change between the modifications of delta_x and delta_y.
         * The formula would look like  (x / sqrt( 2(x*x) )
         * ... which is 0.7071067811865475.
         */

        /*
        float d = abs(delta_x);
        float multiplier = d / sqrt(2*(d*d));
        */
        float multiplier = 0.7071068f; //fast-forward to answer, skipping calculation
        delta_x *= multiplier;
        delta_y *= multiplier;
    }

    setX(getX() + delta_x);
    setY(getY() + delta_y);
}
Esempio n. 9
0
void testCannonball()
{
    const double feilmargin = 0.0001;
    
    //AcclX
    assert(avvik(0.0, 
                 acclX()) < feilmargin);
    
    //AcclY
    assert(avvik(-9.81, 
                 acclY()) < feilmargin);
    
    //velX
    assert(avvik(50.0, 
                 velX(50.0, 0)) < feilmargin);
    assert(avvik(50.0, 
                 velX(50.0, 2.5)) < feilmargin);
    assert(avvik(50.0, 
                 velX(50.0, 5.0)) < feilmargin);
    
    //velY
    assert(avvik(25.0, 
                 velY(25.0, 0)) < feilmargin);
    assert(avvik(0.475, 
                 velY(25.0, 2.5)) < feilmargin);
    assert(avvik(-24.05, 
                 velY(25.0, 5.0)) < feilmargin);
    
    //velIntY
    assert(avvik(25.0, 
                 velIntY(25.0, 0)) < feilmargin);
    assert(avvik(0.475, 
                 velIntY(25.0, 2.5)) < feilmargin);
    assert(avvik(-24.05, 
                 velIntY(25.0, 5.0)) < feilmargin);
    
    //posX
    assert(avvik(0.0, 
                 posX(50.0, 0)) < feilmargin);
    assert(avvik(125.0, 
                 posX(50.0, 2.5)) < feilmargin);
    assert(avvik(250.0, 
                 posX(50.0, 5.0)) < feilmargin);
    
    //posIntX
    assert(avvik(0.0, 
                 posIntX(50.0, 0)) < feilmargin);
    assert(avvik(125.0, 
                 posIntX(50.0, 2.5)) < feilmargin);
    assert(avvik(250.0, 
                 posIntX(50.0, 5.0)) < feilmargin);
    
    //posY
    assert(avvik(0.0, 
                 posY(25.0, 0)) < feilmargin);
    assert(avvik(31.84, 
                 posY(25.0, 2.5)) < feilmargin);
    assert(avvik(2.375, 
                 posY(25.0, 5.0)) < feilmargin);
    
    //posIntY
    assert(avvik(0.0, 
                 posIntY(25.0, 0)) < feilmargin);
    assert(avvik(31.84, 
                 posIntY(25.0, 2.5)) < feilmargin);
    assert(avvik(2.375, 
                 posIntY(25.0, 5.0)) < feilmargin);
    
    //flightTime
    assert(avvik(2.03874, 
                 flightTime(10.0)) < feilmargin);
    
    //getVelocityX
    assert(avvik(7.071067812, getVelocityX(
        asin(1) / 2, 10.0
    )) < feilmargin);
    
    //getVelocityY
    assert(avvik(7.071067812, getVelocityY(
        asin(1) / 2, 10.0
    )) < feilmargin);
    
    //getDistanceTraveled
    assert(avvik(20.3874, getDistanceTraveled(
        10.0, 10.0
    )) < feilmargin);
    
    //optimalAngleForMaxDistance
    assert(avvik(0.7853981634, optimalAngleForMaxDistance(
        10.0
    )) < feilmargin);
    
    //getDistanceTraveled
    assert(avvik(-0.3874, targetPractice(
        20.0, 10.0, 10.0
    )) < feilmargin);
}