*   >> Lectura Educación Artículos >> science >> programación

Hacer un juego en 3D con Ogre - Colisión Detection

si modifica una colección (por ejemplo la eliminación de un elemento de la misma), mientras que un bucle sobre ella la aplicación se estrellaría.

Para evitar este problema todo nuevo y eliminado objetos se almacenan en los newObjects colecciones temporales y DeletedObjects (a través de las funciones AddCollisionObject y RemoveCollisionObject), con los nuevos y borrados objetos que se sincronizan con la colección principal (a través de los AddNewObjects y funciones RemoveDeletedObjects) antes de que comencemos bucle sobre ella en la función FrameEnded.

Este es el mismo proceso que se utiliza con FrameListeners, y un efecto secundario es que los objetos eliminados permanecen en la colección principal después de haber sido "eliminado" y han llamado sus funciones.

Al extender la clase PersistentFrameListener y permanecer en una piscina en un estado desactivado (que es lo que los enemigos y las armas que ya lo hacen), todavía existen objetos que extienden la clase CollisionObject y pueden tener sus funciones llaman sin que se caiga el sistema.

El CollisionManager sólo llamar a la función de colisión si el CollisionObject está activo, asegurando que cerraron objetos no participan en las colisiones.

La razón por la que el código de detección de colisiones es en la función FrameEnded es porque queremos que todos nuestros objetos que se han actualizado para sus nuevas posiciones antes de la detección de colisiones.

Porque sería difícil asegurar que la función CollisionManagers frameStarted se llamaba antes o después de que todos los demás objetos del juego, haciendo la detección de colisiones en la función frameStarted podría llevar a una situación incoherente donde la mitad de los objetos del juego sí actualiza, la detección de colisiones . se calculó, y luego la última mitad de otros objetos actualiza a sí mismos

 anulará CollisionManager :: AddCollisionObject (CollisionObject * objeto) {newObjects.

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

clear ();} bool CollisionManager :: FrameEnded (const FrameEvent y evt) {AddNewObjects (); RemoveDeletedObjects (); para (CollisionObjectList :: iterator iter1 = collisionObjectList.begin ();! iter1 = collisionObjectList.end (); ++ iter1) {CollisionObjectList :: iterator iter2 = iter1; ++ iter2; for (;! iter2 = collisionObjectList.

end (); ++ iter2) {CollisionObject * const objeto1 = * iter1; CollisionObject * const objeto2 = * iter2; si (object1-> IsStarted () && object2-> IsStarted ()) {const Esfera y object1Sphere = object1-> GetBoundingSphere (); const Esfera y object2Sphere = object2-> GetBoundingSphere (); if (object1Sphere.intersects (object2Sphere)) {object1-> Collision (objeto2); object2->

Page   <<  [1] [2] [3] [4] [5] [6] >>
Copyright © 2008 - 2016 Lectura Educación Artículos,https://lectura.nmjjxx.com All rights reserved.