dealing with multiple sub-systems and sharing data between them

Started by
3 comments, last by ic0de 10 years, 8 months ago

In my game I use the Bullet physics engine to do physics. Bullet has a class called btRigidBody which represents a single rigid object in the physics world. My enemy class contains a pointer to a btRigidBody which represents the enemy's physical body. I also have some code to create an explosion, the code gathers all btRigidBodys close to the center of the explosion and apply's a force to them proportional to their distance from the center. The problem is that at this point the explosion code can only obtain a reference to a btRigidBody but not the class that contains it. I need access to the enemy that contains the btRigidBody so I can apply damage to it. At this time what I do is look through my list of enemies until I find one that contains a btRigidBody with the same address as the one which is being hit with the explosion and then apply damage to that enemy. While this seems works pretty reliably it is terribly inefficient and doesn't scale well when the list of enemies becomes larger. given that I cannot actually modify the btRigidBody class how can I store a reference to its owner in order to avoid an expensive search?

Advertisement

Seems like you are allowing things to see the rigid bodies that shouldn't be. Seems like the explosion management system should instead gather up objects within the radius, and pass them damage and force events instead, and let the objects physics components worry about translating a force event to an actual force impulse on the physics bodies. Anything outside of the physics component system shouldn't even know what a btRigidBody is.

I don't know how bullet physics does it, but with other physics library, they often have a user data pointer in their body structure that can point to whatever the programmer wants.

So, in this case, the user data pointer would point to the object that owns it; no need to search objects to find it. I would assume bullet has something like that as well.

My Gamedev Journal: 2D Game Making, the Easy Way

---(Old Blog, still has good info): 2dGameMaking
-----
"No one ever posts on that message board; it's too crowded." - Yoga Berra (sorta)

Or, why not have the code that creates an explosion gather all the enemies close to the center of the explosion, and then get the btRigidBody member from it when you apply the physics. If you're wanting to apply both the physical force and the damage from the same method, then you don't really want the rigid body, but the enemy. Otherwise, and perhaps better, would be to separate concerns and not apply forces and deal damage in the same method.

throw table_exception("(? ???)? ? ???");

Or, why not have the code that creates an explosion gather all the enemies close to the center of the explosion, and then get the btRigidBody member from it when you apply the physics. If you're wanting to apply both the physical force and the damage from the same method, then you don't really want the rigid body, but the enemy. Otherwise, and perhaps better, would be to separate concerns and not apply forces and deal damage in the same method.

I don't actually apply forces and deal damage in the same function I just notify the enemy that it has been hit and how hard. The enemy class itself decides how damage is dealt. The reason I gather up rigidBodys instead of enemies is because bullet has a simple way to gather all the objects that overlap with an arbitrary collision shape. I'll look into BeerNutts suggestion.

EDIT: I looked into it and bullet provides setUserPointer/getUserPointer functions, I'm surprised I overlooked that.

This topic is closed to new replies.

Advertisement