//////////////////////////////////////////////////////////////////////// /// /// @fn VisiteurNoeudTest::testSelectionObjet() /// /// Test pour la sélection d'objets /// /// /// @return void /// //////////////////////////////////////////////////////////////////////// void VisiteurNoeudTest::testSelectionObjet() { RazerGameTree* arbre = new RazerGameTree(NULL,999,999); NoeudAbstrait *noeud1 = arbre->creerNoeud( RAZER_KEY_MALLET ), *noeud2 = arbre->creerNoeud( RAZER_KEY_PORTAL ), *noeud3 = arbre->creerNoeud( RAZER_KEY_PORTAL ), *noeud4 = arbre->creerNoeud( RAZER_KEY_MALLET ), *noeud5 = arbre->creerNoeud( RAZER_KEY_PUCK ); arbre->add(noeud1); arbre->add(noeud2); arbre->add(noeud3); arbre->add(noeud4); arbre->add(noeud5); arbre->setCanBeSelected(false); noeud1->setCanBeSelected(true); noeud2->setCanBeSelected(true); noeud3->setCanBeSelected(true); noeud4->setCanBeSelected(true); noeud5->setCanBeSelected(true); noeud1->setSelection(false); noeud2->setSelection(false); noeud3->setSelection(false); noeud4->setSelection(false); noeud5->setSelection(false); // assignation de position tres eloigné pour éviter que les boites de collisions se touchent noeud1->setPosition(Vecteur3(-500.0,500.0,0.0)); noeud2->setPosition(Vecteur3(500.0,500.0,0)); noeud3->setPosition(Vecteur3(0.0,0.0,0.0)); noeud4->setPosition(Vecteur3(-500.0,-500.0,0.0)); noeud5->setPosition(Vecteur3(500.0,-500.0,0.0)); VisiteurSelection v(Vecteur2(-500.0,500.0),Vecteur2(-500.0,500.0),false); CPPUNIT_ASSERT(v.mToggleSelection == false); arbre->acceptVisitor(v); v.faireSelection(); CPPUNIT_ASSERT(noeud1->IsSelected() == true); CPPUNIT_ASSERT(noeud2->IsSelected() == false); CPPUNIT_ASSERT(noeud3->IsSelected() == false); CPPUNIT_ASSERT(noeud4->IsSelected() == false); CPPUNIT_ASSERT(noeud5->IsSelected() == false); noeud1->setSelection(false); VisiteurSelection v2(Vecteur2(-550.0,450.0),Vecteur2(550.0,550.0),true); CPPUNIT_ASSERT(v2.mToggleSelection == true); arbre->acceptVisitor(v2); v2.faireSelection(); CPPUNIT_ASSERT(noeud1->IsSelected() == true); CPPUNIT_ASSERT(noeud2->IsSelected() == true); CPPUNIT_ASSERT(noeud3->IsSelected() == false); CPPUNIT_ASSERT(noeud4->IsSelected() == false); CPPUNIT_ASSERT(noeud5->IsSelected() == false); arbre->empty(); delete arbre; }
Vecteur2 CameraPinhole::mondeVersImage(const Vecteur3 &P) const { // UVW : Dans le repere camera Vecteur3 dist = P-_position; Vecteur3 UVW = _mondeVersCamera*(dist); // Distance focale reel distance = 1; // UVW' : Projete dans le repere camera Vecteur3 UVW_ = Vecteur3(UVW._x*distance/UVW._z, UVW._y*distance/UVW._z, distance); // uv' : Projete dans le plan image Vecteur2 uv_ = Vecteur2(UVW_._x/_dU, UVW_._y/_dV); // xy : Projete dans les coordonnees image Vecteur2 xy = Vecteur2(int((uv_._u+0.5)*(1./_invNbX)), int((uv_._v+0.5)*(1./_invNbY))); return xy; }
//////////////////////////////////////////////////////////////////////// /// /// @fn SourisEtatAjout::SourisEtatAjout() /// /// Ce constructeur appelle le constructeur de base, cree un noeud de base afin de voir un affichage /// /// @param[in] GestionnaireEtatAbstrait* : contexte. /// /// @return Aucune (constructeur). /// //////////////////////////////////////////////////////////////////////// SourisEtatAjout::SourisEtatAjout(FieldModificationStrategyType modifType): SourisEtatTransformation(modifType) { FieldModificationStrategyEvent event; event.mPosition = Vecteur2(0,0); event.mType = FIELD_MODIFICATION_EVENT_CLICK; FacadeModele::getInstance()->getEditionField()->BeginModification(mModifType,event); }
//////////////////////////////////////////////////////////////////////// /// /// @fn void VisiteurNoeudTest::testDeplacerObjet() /// /// Cas de test: Déplacement d'objets. /// /// @return Aucune. /// //////////////////////////////////////////////////////////////////////// void VisiteurNoeudTest::testDeplacerObjet() { NoeudAbstrait* n = new NoeudAbstrait(RAZER_KEY_NONE); n->setPosition(Vecteur3(0.0,0.0)); n->setSelection(true); VisiteurDeplacement v(Vecteur2(25.0,-10.0)); n->acceptVisitor(v); CPPUNIT_ASSERT(n->getPosition() == Vecteur3(25.0,-10.0)); }
//////////////////////////////////////////////////////////////////////// /// /// @fn void AIRenforcementTest::testDirectionPhaseDeplacement() /// /// Test de la direction lorsque la rondelle traverse la ligne du milieu, s'il commence à se déplacer /// /// /// @return void /// //////////////////////////////////////////////////////////////////////// void AIRenforcementTest::testDirectionPhaseDeplacement() { // Place le maillet NoeudMaillet* wMaillet = partie->getField()->getRightMallet(); wMaillet->setPosition(Vecteur3(55,0,0)); // Place la rondelle NoeudRondelle* wPuck = partie->getField()->getPuck(); wPuck->setPosition(Vecteur3(1,0,0)); wPuck->modifierVelocite(Vecteur3(150,0,0)); // Setup strat auto joueurVirtuel = (std::dynamic_pointer_cast<PlayerReinforcementAI>(wMaillet->getPlayer())); AIMailletRenforcement* aimaillet = (AIMailletRenforcement*)joueurVirtuel->getAiMaillet(); aimaillet->changerStrat(OFFENSIVE_LIGNE_DROITE); AIStratOffensiveRenforcement* strat = ((AIStratOffensiveRenforcement*)aimaillet->getStrategie()); //strat->setMalletTargetPos(Vecteur2()); PAS A SETTER strat->setPointImpact(Vecteur2(50,0)); strat->setPointVise(Vecteur2(-150,0)); strat->setTimeBeforeImpact(0); // pas utilisé pour le moment joueurVirtuel->obtenirDirectionAI(wMaillet); }
//////////////////////////////////////////////////////////////////////// /// /// @fn VisiteurCollision::visiter(NoeudMaillet& noeud) /// /// Fonction qui permet de taiter la collision entre la /// rondelle et les maillets /// /// @param[in] typeNoeud : Le type du noeud. /// /// @return Aucune /// //////////////////////////////////////////////////////////////////////// void VisiteurCollision::visiter(NoeudMaillet& noeud) { rondelleQuitte_ = false; static Vecteur2 forceCollision; // vecteur de la force de la collision en X,Y static Vecteur3 vitesseRondelle; // vitesse de la rondelle static Vecteur3 posMaillet; // position du maillet posMaillet = noeud.obtenirPositionRelative(); vitesseRondelle = rondelle_->obtenirVitesse(); // calcul de la force de collision forceCollision = aidecollision::calculerCollisionCercle( Vecteur2(posMaillet[X], posMaillet[Y]), // position du maillet noeud.obtenirRayon(), // rayon du maillet Vecteur2(rondelle_->obtenirPositionRelative()[X], rondelle_->obtenirPositionRelative()[Y]), // position de la rondelle rondelle_->obtenirRayon(), // rayon de la rondelle noeud.obtenirCoefficientRebondissement(), 0.01, // coefficient de rebondissement et d'amortissement Vecteur2(vitesseRondelle[X], vitesseRondelle[Y])); // vitesse de la rondelle if (forceCollision[X] != 0 || forceCollision[Y] != 0) // vérifier qu'il y a bien une collision { for (int i = 0; i < 2; ++i) // faire varier la vitesse de la rondelle selon la force vitesseRondelle[i] += forceCollision[i]; // jouer un son de collision GestionnaireSon::obtenirInstance()->jouerSonCollision(ArbreRenduINF2990::NOM_MAILLET); rondelle_->modifierVitesse(vitesseRondelle); // s'il y a une collision entre la rondelle et les bordures de la table, // rondelleQuitte_ indiquera au maillet qu'il tente de pouser la rondelle hors de la table // ce qui appliquera une force sur le maillet contraire à son déplacement if (rondelle_->animerCollision()) rondelleQuitte_ = true; else rondelle_->calculerRotation(Vecteur3(forceCollision[X], forceCollision[Y], 0.0)); } }
Vecteur2 CameraPinhole::imageVersEcran(int x, int y) const { return Vecteur2(x*_invNbX - 0.5, y*_invNbY - 0.5); }
//////////////////////////////////////////////////////////////////////// /// /// @fn void VuePerspectiveCiel::deplacerZ(float deplacement) /// /// Ne fait rien, car se déplacer dans l'axe de la profondeur n'a pas /// vraiment de signification avec une vue orthogonale. /// /// @param[in] deplacement : Déplacement selon l'axe Z. /// /// @return Aucune. /// //////////////////////////////////////////////////////////////////////// void VuePerspectiveCiel::deplacerZ(float deplacement) { Vecteur2 deplacementVirtuel = projection_.convertirDistanceClotureAVirtuelle(Vecteur2(deplacement, 0)); obtenirCamera().deplacerZ(deplacementVirtuel[0], 0); }