*   >> Lecture Éducation Articles >> science >> la programmation

Faire un jeu en 3D avec Ogre - Collision Detection

à même que nous avons été boucle sur pour détecter la collision en premier lieu. Ceci est un problème parce que si vous modifiez une collection (par exemple suppression d'un élément de celle-ci), tandis que boucle sur elle l'application plantait.

Pour éviter ce problème tout nouveau et retiré objets sont stockés dans les collections temporaires newObjects et DeletedObjects (via les fonctions AddCollisionObject et RemoveCollisionObject), avec les nouveaux et les objets supprimés étant synchronisés avec la collection principale (via les AddNewObjects et fonctions RemoveDeletedObjects) avant que nous commencions en boucle sur elle dans la fonction FrameEnded.

Ce processus est le même utilisé avec FrameListeners, et un effet secondaire est que les objets supprimés restent dans la collection principale après avoir été "enlevé" et ont appelé de leurs fonctions.

En étendant la classe PersistentFrameListener et en restant dans une piscine un état désactivé (qui est ce que les ennemis et les armes le font déjà), des objets qui étendent la classe CollisionObject existent toujours et peuvent avoir leurs fonctions appelées sans plantage du système.

Le CollisionManager ne appeler la fonction de collision si la CollisionObject est actif, assurant que arrêtez objets ne participent pas à des collisions.

La raison pour laquelle le code de détection de collision est dans la fonction FrameEnded est parce que nous voulons que tous nos objets ont mis à jour leurs nouvelles positions avant de détecter les collisions.

Parce que ce serait difficile à faire en sorte que la fonction CollisionManagers frameStarted a été appelée avant ou après tous les autres objets de jeu, faire la détection de collision dans la fonction frameStarted pourrait conduire à une situation incohérente où la moitié des objets du jeu eux-mêmes mis à jour, la détection de collision . a été calculé, puis la dernière moitié des autres objets mis à jour eux-mêmes

 annuler CollisionManager :: AddCollisionObject (CollisionObject * objet) {newObjects.

push_back (objet);} vide CollisionManager :: RemoveCollisionObject (CollisionObject * objet) { deletedObjects.push_back (objet);} vides CollisionManager :: AddNewObjects () {for (CollisionObjectList :: iterator iter = newObjects.begin (); iter = newObjects.end ();! ++ iter) {collisionObjectList.push_back (* iter ); } NewObjects.clear ();} vides CollisionManager :: RemoveDeletedObjects () {for (CollisionObjectList :: iterator iter = deletedObjects.begin ();! Iter = deletedObjects.end (); ++ iter) {collisionObjectList.remove (* iter ); } DeletedObjects.

clear ();} bool CollisionManager :: FrameEnded (const FrameEvent & EVT) {AddNewObjects (); RemoveDeletedObjects (); pour (CollisionObjectList :: iterator = iter1 collisionObjectList.begin ();! iter1 = collisionObjectList.end (); ++ iter1) {CollisionObjectList :: iterator = iter2 iter1; ++ iter2; pour (;! iter2 = collisionObjectList.

end (); ++ iter2) {CollisionObject * const object1 = * iter1; CollisionObject * const object2 = * iter2; si (object1-> isStarted () && object2-> isStarted ()) {const Sphere & object1Sphere = object1-> GetBoundingSphere (); const Sphere & object2Sphere = object2-> GetBoundingSphere (); if (object1Sphere.intersects (object2Sphere)) {object1-> Collision (object2); object2->

Page   <<  [1] [2] [3] [4] [5] [6] >>
Copyright © 2008 - 2016 Lecture Éducation Articles,https://lecture.nmjjxx.com All rights reserved.