*   >> Leitura Educação Artigos >> science >> programação

Fazendo um jogo 3D com Ogre - Detecção de colisão

mazenados nas newObjects coleções temporárias e DeletedObjects (via as funções AddCollisionObject e RemoveCollisionObject), com os novos e excluídos os objetos que estão sendo sincronizados com a coleção principal (via os AddNewObjects e funções RemoveDeletedObjects) antes de começarmos um loop sobre ele na função FrameEnded. Este é o mesmo processo usado com FrameListeners, e um efeito colateral é que os objetos removidos permanecem na coleção principal depois de ser "removida" e têm suas funções chamado.


Ao estender a classe PersistentFrameListener e permanecendo em uma piscina em um estado desativado (que é o que os inimigos e armas já fazem), objetos que se estendem a classe CollisionObject ainda existem e podem ter suas funções chamado sem derrubar o sistema. O CollisionManager só vai chamar a função de colisão se o CollisionObject está ativa, garantindo que desligar objetos não participam de colisões.


A razão pela qual o código de detecção de colisão está na função FrameEnded é porque queremos que todos os nossos objetos para ter actualizado para suas novas posições antes de detectar colisões. Porque seria difícil de assegurar que a função CollisionManagers FrameStarted foi chamado antes ou depois de todos os outros objectos de jogo, fazendo a detecção de colisão na função FrameStarted poderia conduzir a uma situação inconsistente onde metade dos objectos de jogo-se actualizado, o de detecção de colisão .

foi calculado, e, em seguida, a última metade de outros objetos atualizado si

 anular CollisionManager :: AddCollisionObject (CollisionObject * object) {newObjects.push_back (objeto);} vazio CollisionManager :: RemoveCollisionObject (CollisionObject * object) { deletedObjects.push_back (objeto);} vazios CollisionManager :: AddNewObjects () {for (CollisionObjectList :: iterator iter = newObjects.begin (); iter = newObjects.end (!); iter ++) {collisionObjectList.push_back (* iter ); } NewObjects.

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

end (); iter2 ++) {CollisionObject * const object1 = * iter1; CollisionObject * const object2 = * iter2; if (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 Leitura Educação Artigos,https://artigos.nmjjxx.com All rights reserved.