Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


dealing with multiple sub-systems and sharing data between them


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
4 replies to this topic

#1 ic0de   Members   -  Reputation: 909

Like
0Likes
Like

Posted 22 July 2013 - 11:01 AM

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?


Edited by ic0de, 22 July 2013 - 11:01 AM.

you know you program too much when you start ending sentences with semicolons;


Sponsor:

#2 FLeBlanc   Crossbones+   -  Reputation: 3117

Like
1Likes
Like

Posted 22 July 2013 - 11:56 AM

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.



#3 BeerNutts   Crossbones+   -  Reputation: 3017

Like
3Likes
Like

Posted 22 July 2013 - 02:04 PM

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)

#4 Ravyne   GDNet+   -  Reputation: 8192

Like
0Likes
Like

Posted 22 July 2013 - 02:48 PM

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.



#5 ic0de   Members   -  Reputation: 909

Like
0Likes
Like

Posted 22 July 2013 - 06:37 PM

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.


Edited by ic0de, 22 July 2013 - 07:00 PM.

you know you program too much when you start ending sentences with semicolons;





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS