Esempio n. 1
0
   ////////////////////////////////////////////////////////////////////////
   ///
   /// @fn void VuePerspectiveCiel::zoomerOutSmooth()
   ///
   /// Permet de faire un zoom out smooth selon l'incrément de zoom.
   /// 
   /// @return Aucune.
   ///
   ////////////////////////////////////////////////////////////////////////
   void VuePerspectiveCiel::zoomerOutSmooth()
   {
	   Vecteur3 deplacement = obtenirCamera().obtenirPosition()-obtenirCamera().obtenirPointVise();
       deplacement.normaliser();
       deplacement*=1.5f;
	   obtenirCamera().deplacerXYZ(deplacement);
   }
Esempio n. 2
0
////////////////////////////////////////////////////////////////////////
///
/// @fn VisiteurCollision::mettreDansPortail(NoeudPortail& noeud)
///
/// Fonction qui place la rondelle sur un portail
/// TODO: sortir avec une direction aleatoire
///
/// @param[in] noeud : le portail ou l'on veut placer la rondelle
///
/// @return Aucune.
///
////////////////////////////////////////////////////////////////////////
void VisiteurCollision::mettreDansPortail(NoeudPortail& noeud)
{	
	/// Trouver la vitesse de la rondelle
	Vecteur3 vitesseVect = rondelle_->obtenirVitesse();
	double vitesse = vitesseVect.norme();

	/// Donner une direction aleatoire a notre rondelle lors de la sortie de celle-ci
	for( int i = 0; i < 2; i++)
		vitesseVect[i] = rand()/((double)RAND_MAX);

	/// Donner la nouvelle vitesse
	vitesseVect.normaliser();
	rondelle_->modifierVitesse(vitesseVect*vitesse);

	/// Donner la nouvelle position
	rondelle_->assignerPositionRelative(noeud.obtenirPositionRelative());
	/// Desactiver l'attraction du portail en question
	noeud.desactiverAttraction();
}
Esempio n. 3
0
void PlayerHuman::PlayTick( float time )
{
	auto maillet = getControlingMallet();
	if(maillet)
	{
		if(mControllerType & CONTROLLER_TYPE_KEYBOARD)
		{
			// if any key is pressed
			if(EventManager::mMalletDirection.mValue)
			{
				Vecteur3 newPos;
				// give direction according to key pressed
				if(EventManager::mMalletDirection.IsFlagSet(MALLET_UP))
				{
					++newPos[VY];
				}
				if(EventManager::mMalletDirection.IsFlagSet(MALLET_DOWN))
				{
					--newPos[VY];
				}
				if(EventManager::mMalletDirection.IsFlagSet(MALLET_LEFT))
				{
					--newPos[VX];
				}
				if(EventManager::mMalletDirection.IsFlagSet(MALLET_RIGHT))
				{
					++newPos[VX];
				}

				// make sure final direction is length 8
				newPos.normaliser();
				newPos *= 8;
				newPos += maillet->getPosition();
				
				maillet->setTargetDestination(newPos);
			}
		}
		else if(mControllerType & CONTROLLER_TYPE_MOUSE)
		{
			maillet->setTargetDestination(EventManager::mMouseGamePos);
		}
	}
}
Esempio n. 4
0
////////////////////////////////////////////////////////////////////////
///
/// @fn VisiteurCollision::visiter(NoeudPortail& noeud)
///
/// Fonction qui permet de taiter la collision entre la
///	rondelle et les portails
///
/// @param[in] typeNoeud : Le type du noeud.
///
/// @return Aucun
///
////////////////////////////////////////////////////////////////////////
void VisiteurCollision::visiter(NoeudPortail& noeud)
{
	/// fistances entre la rondelle et le portail
	GLdouble dx = noeud.obtenirPositionRelative()[X] - rondelle_->obtenirPositionRelative()[X];
	GLdouble dy = noeud.obtenirPositionRelative()[Y] - rondelle_->obtenirPositionRelative()[Y];
	/// vecteur de la direction qui pointe de la rondelle au portail
	Vecteur3 direction = Vecteur3(dx,dy,0);
	direction.normaliser();

	/// calcul de la distance entre deux points
	GLdouble distance = sqrt( (dx*dx) + (dy*dy) );
	/// savoir si la rondelle est dans le champs d'attraction
	GLdouble distAttraction = distance - noeud.obtenirRayonAttraction() - rondelle_->obtenirRayon();
	/// prendre en compte les rayons de nos objets
	distance = distance - rondelle_->obtenirRayon();

	/// si il y a collision, teleportation
	if (distance < 0) 
	{
		size_t nombrePortails = portails_.size();

		if (nombrePortails == 1.0) // il y a juste un portail
		{
			noeud.desactiverAttraction();
		}
		else
		{
			if (noeud.obtenirAttraction())
			{
				GestionnaireSon::obtenirInstance()->jouerSonCollision(ArbreRenduINF2990::NOM_PORTAIL);
				teleporter(noeud);
			}
		}
	}
	/// si il n'y a pas de collision, attirer la rondelle quand la rondelle est dans la zone d'attraction
	else
	{
		if (distAttraction < 0.0)
		{
			if (distance > 1.0f)
				noeud.varierRotation(1.0f / (GLfloat)distance * 10.0f);
			else
				noeud.varierRotation((GLfloat)distance + 1.0f);

			if (noeud.obtenirAttraction())
			{
				Vecteur3 vitesse = rondelle_->obtenirVitesse();

				for (int i = 0; i < 2; ++i) {
					vitesse[i] += direction[i] * (noeud.obtenirRayon()*FORCE_PORTAIL/distance);
				}
				rondelle_->modifierVitesse(vitesse);
			}
		}
		else
		{
			if (portails_.size() > 1)
				noeud.activerAttraction();	 
		}
	}
}