*   >> läser Utbildning artiklar >> science >> programming

Att göra en 3D-spel med Ogre - Collision Detection

nya och borttagna objekt lagras i tillfälliga samlingar newObjects och deletedObjects (via AddCollisionObject och RemoveCollisionObject funktioner), med nya och borttagna objekt synkroniseras med huvudkollektionen (via AddNewObjects och RemoveDeletedObjects funktioner) innan vi börjar kretsa över den i FrameEnded funktionen. Detta är samma process som används med FrameListeners, och en sidoeffekt är att borttagna objekt förblir i huvudsamlingen efter att ha blivit "bort" och har deras funktioner kallas.


Genom att förlänga PersistentFrameListener klassen och som finns kvar i en pool i en avaktiverad tillstånd (vilket är vad fiender och vapen redan gör), föremål som utökar CollisionObject klassen fortfarande existerar och kan ha sina funktioner kallas utan att krascha systemet. Den CollisionManager kommer bara ringa kollisionsfunktionen om CollisionObject är aktiv, se till att stänga föremål inte deltar i kollisioner.

Omdömen

Anledningen kollisionsdetektering kod finns i FrameEnded funktionen är att vi vill att alla våra objekt för att ha uppdaterat till sina nya positioner innan upptäcka kollisioner. Eftersom det skulle vara svårt att se till att CollisionManagers FrameStarted funktionen kallades före eller efter alla andra spel objekt, gör kollisionsdetektering i FrameStarted funktion skulle leda till en inkonsekvent situation där hälften av spel objekt uppdateras sig, kollisionsdetektering .

beräknades, och sedan den sista halvan av andra föremål uppdaterade sig Omdömen

 annullera CollisionManager :: AddCollisionObject (CollisionObject * objekt) {newObjects.push_back (objekt);} void CollisionManager :: RemoveCollisionObject (CollisionObject * objekt) { deletedObjects.push_back (objekt);} void CollisionManager :: AddNewObjects () {för (CollisionObjectList :: iterator iter = newObjects.begin (); iter = newObjects.end ();! ++ iter) {collisionObjectList.push_back (* iter ); } NewObjects.

clear ();} void CollisionManager :: RemoveDeletedObjects () {för (CollisionObjectList :: iterator iter = deletedObjects.begin ();! Iter = deletedObjects.end (); ++ iter) {collisionObjectList.remove (* iter ); } DeletedObjects.clear ();} bool CollisionManager :: FrameEnded (const FrameEvent & evt) {AddNewObjects (); RemoveDeletedObjects (); för (CollisionObjectList :: iterator iter1 = collisionObjectList.begin ();! iter1 = collisionObjectList.end (); ++ iter1) {CollisionObjectList :: iterator iter2 = iter1; ++ iter2; för (;! iter2 = collisionObjectList.

end (); ++ iter2) {CollisionObject * const object1 = * iter1; CollisionObject * const object2 = * iter2; if (object1-> IsStarted () && object2-> IsStarted ()) {const Sphere & object1Sphere = object1-> GetBoundingSphere (); const sfär & object2Sphere = object2-> GetBoundingSphere (); if (object1Sphere.intersects (object2Sphere)) {object1-> Kollision (object2); object2->

Page   <<  [1] [2] [3] [4] [5] [6] >>
Copyright © 2008 - 2016 läser Utbildning artiklar,https://utbildning.nmjjxx.com All rights reserved.