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->
Premiers pas avec Activeperl
- Fenêtres Bar
- Comment est-il difficile d'apprendre la programmation?
- Comment configurer votre réseau Windows Vista connections
- Contrats de coût cible - Programmation Agile Methodology
- Dernières tendances de programmation entre developers
- Apprendre à connaître Windows
- Importance de l'assurance qualité de jeux pour la marque Value
- Mysql Scheduler
- JSON File
- Création d'un jeu de plateforme flash avec Flixel et Flex - Enemies
Construire votre première appl…