Ejemplo n.º 1
0
void GameBlock::Move(double delta, GameObjects* Objects){
	if (alive)
	{
		angle += (rand()%20 - 10);
		double Multiplier = 1;
		MoveByAngle(delta, Multiplier);

		int Resoult = NONE;

		Resoult += CollidesWith(Objects->Player);
		if (Resoult % 10 == LEFT)
			x = Objects->Player.x + Objects->Player.w + r;
		if (Resoult % 10 == RIGHT)
			x = Objects->Player.x - r;

		Resoult += OutOfMap();
		Resoult += CollidesWith(Objects->Brick);
		Resoult += CollidesWith(Objects->Block);

		if (Resoult)
		{
			MoveByAngle(delta, -Multiplier);

			if (Resoult % 10 > 0)
				BounceVertical();
			if (Resoult / 10 > 0)
				BounceHorizontal();
		}
	}
}
Ejemplo n.º 2
0
void Player::Update(float deltaTime) {
	if(Lives <= 0) return; 

	if(CurrentAnimation == ExplodeAnimation) {
		if(CurrentAnimation->Finished) {
			CurrentAnimation = 0;
			
			Lives--;

			if(this->LoadedMissile != 0) {
				MainGame->RemoveEntity(LoadedMissile);
				this->LoadedMissile = 0;
			}
					   
			Player::Init();
		}
		
		return;
	}
	
	VelocityX = 0;
	if(MainGame->LeftPressed) {
		VelocityX = -5;    
	}

	if(MainGame->RightPressed) {
		VelocityX = 5;
	}

	PosX += VelocityX;
	PosX = min(SCRWIDTH - SizeX, PosX);
	PosX = max(0, PosX);

	if(MainGame->SpacePressed) {
		if(LoadedMissile != 0) {
			LoadedMissile->Type = "missile_player";
			LoadedMissile->Fire();
			LoadedMissile = 0;

			Mix_PlayChannel(-1, Assets::Sounds["player_shoot"], 0);
		}
	}

	if(CollidesWith("missile_invader") || CollidesWith("invader")) {
		Mix_PlayChannel(-1, Assets::Sounds["player_explode"], 0);

		CurrentAnimation = ExplodeAnimation;
		CurrentAnimation->Play(false);
	}

	if(LoadedMissile != 0) {
		LoadedMissile->PosX = PosX + (Graphic->GetWidth() / 2) - LoadedMissile->Graphic->GetWidth() / 2;
		LoadedMissile->PosY = PosY - 8;
	}
}
Ejemplo n.º 3
0
//Based upon the tested collider, we'll look for a circle-circle collision or a circle-rectangle collision.
bool CCircle::CheckCollision(Collider* collider)
{
	bool isColliding = false;

	if (collider->GetType() == Type::CIRCLE)
	{
		isColliding = CollidesWith((CCircle*)collider);
	}
	else if (collider->GetType() == Type::RECTANGLE)
	{
		isColliding = CollidesWith((CRectangle*)collider);
	}

	return isColliding;
}
Ejemplo n.º 4
0
void LevelTrigger::Update(float deltaTime) {
	if(CollidesWith("player")) {
		GameScene* scene = (GameScene*)Scene;

		int roomX = scene->CurrentLevel->CurrentRoomX;
		int roomY = scene->CurrentLevel->CurrentRoomY;

		if(roomX == 7 && roomY == 7) {
			scene->SwitchLevel("room 1");
			return;
		}

		if(roomX == 4 && roomY == 6) {
			scene->SwitchLevel("boss");
			return;
		}

		if(roomX == 6 && roomY == 6) {
			scene->SwitchLevel("shopkeeper");
			return;
		}


		scene->SwitchLevel("random");
	}
}
Ejemplo n.º 5
0
void GameBullet::Move(double delta, GameObjects* Objects){
	if (alive)
	{
		MoveByAngle(delta, 1.0f);

		CollidesWith(Objects->Brick);
		OutOfMap();
	}
}
Ejemplo n.º 6
0
void GameBall::Move(double delta, GameObjects* Objects){
	if (alive)
	{
		double Multiplier = 1;
		if (glued)
			Multiplier = 0;
		if (Objects->Player.ActiveBonus[SLOW] > 0)
			Multiplier /= 2;

		MoveByAngle(delta, Multiplier);

		int Resoult = NONE;

		Resoult += CollidesWith(Objects->Player);
		if (Resoult % 10 == LEFT)
			x = Objects->Player.x + Objects->Player.w + r;
		if (Resoult % 10 == RIGHT)
			x = Objects->Player.x - r;
		if (Resoult == CENTER)
			y = Objects->Player.y - r;

		Resoult += OutOfMap();
		Resoult += CollidesWith(Objects->Brick);
		CollidesWith(Objects->Block);

		if (Resoult)
		{
			MoveByAngle(delta, -Multiplier);

			if (Resoult % 10 > 0)
				BounceVertical();
			if (Resoult / 10 > 0)
				BounceHorizontal();
			if (newAngle)
			{
				angle = newAngle;
				newAngle = 0.0f;
			}
		}
	}
}
Ejemplo n.º 7
0
void GameBonus::Move(double delta, GameObjects* Objects){
	if (alive)
	{
		double Multiplier = 1;
		if (Objects->Player.ActiveBonus[SLOW] > 0)
			Multiplier /= 2;

		MoveByAngle(delta, Multiplier);

		CollidesWith(Objects->Player);
		if (OutOfMap() == DOWN)
			Destroy();
	}
}
Ejemplo n.º 8
0
void Entity::NotifyCollisions() {
    std::vector<RectangleShape*> collidables;
    level_->CollidablesFor(this, collidables);

    for(RectangleShape* collidable : collidables) {
        if(collidable->IsEntity() && ((Entity*)collidable)->IsMob()) {
            Mob* mob = (Mob*)collidable;

            if(CanCollideWith(mob) && CollidesWith(mob)) {
                if(HandleCollisionWith(mob)) {
                    return;
                }
            }
        }
    }
}
Ejemplo n.º 9
0
bool Quad::CollidesWith (Line& line, Vector* vIntersection)
{
	if (GetAsyncKeyState (0x41 + 'b' - 'a'))
		int blah = 0;
	// first, check if the line even intersects the plane containing the quad
	Vector vNormal = (v2 - v1) & (v4 - v1);
	Vector vPlaneIntersection;
	if (Plane(vNormal, v1).CollidesWith (line, &vPlaneIntersection) == false)
		return false;

	// now check of the plane's intersection point is in the quad
	if (!CollidesWith (vPlaneIntersection))
		return false;

	// the line intersects the quad, so return the result
	if (vIntersection)
		*vIntersection = vPlaneIntersection;
	return true;
}
Ejemplo n.º 10
0
// default collision algorithms
bool BoundingShape::CollidesWith (Triangle& triangle, Vector* vIntersection)
{
    // test the plane on which the triangle lies
    Vector vPlaneIntersect;
    if (!CollidesWith (Plane (triangle.vNormal, triangle.v1), &vPlaneIntersect))
        return false;

    // run 3 half-space tests
    if (! Line(triangle.v1, triangle.v2).SameSide (triangle.v3, vPlaneIntersect))
        return false;
    if (! Line(triangle.v2, triangle.v3).SameSide (triangle.v1, vPlaneIntersect))
        return false;
    if (! Line(triangle.v3, triangle.v1).SameSide (triangle.v2, vPlaneIntersect))
        return false;

    if (vIntersection)
        *vIntersection = vPlaneIntersect;
    return true;
}
Ejemplo n.º 11
0
bool BoundingShape::CollidesWith (Quad& quad, Vector* vIntersection)
{
    // test the plane on which the triangle lies
    Vector vPlaneIntersect;
    Vector vQuadNormal = ((quad.v2 - quad.v1) & (quad.v3 - quad.v1)).Normalize();
    if (!CollidesWith (Plane (vQuadNormal, quad.v1), &vPlaneIntersect))
        return false;

    // run 4 half-space tests
    if (! Line(quad.v1, quad.v2).SameSide (quad.v3, vPlaneIntersect))
        return false;
    if (! Line(quad.v2, quad.v3).SameSide (quad.v4, vPlaneIntersect))
        return false;
    if (! Line(quad.v3, quad.v4).SameSide (quad.v1, vPlaneIntersect))
        return false;
    if (! Line(quad.v4, quad.v1).SameSide (quad.v2, vPlaneIntersect))
        return false;

    if (vIntersection)
        *vIntersection = vPlaneIntersect;
    return true;
}
Ejemplo n.º 12
0
void Alien::update() {
	Move(motionX, motionY);
	if(GetY() < 0) {
		SetY(0);
		resetMotion();
	}
	else if(GetY() > 480-GetHeight()) {
		SetY(480-GetHeight());
		resetMotion();
	}
	
	int i;
	for(i=0;i<numEnemyShots;i++) {
		if(enemyShots[i]->isFired() == false) continue;
		
		if(CollidesWith(enemyShots[i])) {
			enemyShots[i]->remove();
			resetPosition();
			resetMotion();
			resetShotCountdown();
			score++;
			break;
		}
	}
	
	if(--lockMotionFrames == 0) resetMotion();	
	if(GetX() < 0) resetPosition();
	if(--nextShotCountdown == 0) {
		resetShotCountdown();
		for(i=0;i<numOwnShots;i++) {
			if(ownShots[i]->isFired() == false) {
				ownShots[i]->fire(GetX(), GetY() + (GetHeight() / 2) - 10, -6);
				break;
			}
		}
	}

}