//////////////////////////////////////////////////////////////////////// /// /// @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); }
//////////////////////////////////////////////////////////////////////// /// /// @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(); }
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); } } }
//////////////////////////////////////////////////////////////////////// /// /// @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(); } } }