[Bf-committers] Feedback on BGE Collision API

Jim Williams sphere1952 at gmail.com
Sun Mar 20 12:24:38 CET 2011


Why not on collision try calling each object's on_collision method if
it exists, and handle events like every other modern system?  I thought
there was some way in python of getting an object's methods.

I'd suggest looking for on_collision_start, and on_collision_continuing
methods to call.....

(I'm new to both python and Blender....)

On Sun, Mar 20, 2011 at 2:12 AM, Alex Fraser <alex at phatcore.com> wrote:
> Hi Mitchell,
>
> On Sun, Mar 20, 2011 at 12:39 PM, Mitchell Stokes <mogurijin at gmail.com> wrote:
>> I'm getting tired of not having access to collision information from
>> the BGE Python API, so I've decided to address this.
>
> Great! I would love to have such a feature in the BGE.
>
>> However, I'm uncertain as to how the user should access this events.
>
> I prefer the list (obj.collisions), but it would be very useful to
> know when that list changes, like what we already get from the Near
> sensor - a list and an impulse.
>
> Maybe this is a good opportunity to add other events, too? Things I
> would be interested in registering callbacks for are:
>  - Collisions
>  - End object
>  - Property change
>  - Parent set
>  - Children added/removed
>
>> Other events like keyboard and mouse events are done by checking some
>> sort of list.
>
> If we wanted to get really fancy, we could add callbacks for mouse events too.
>
>> A callback example would look something like:
>>
>> def col_bomb(self, ce):
>>        if ce.object.name == "Bomb":
>>                self.endObject()
>>
>> obj.register(col_bomb)
>
> That looks good, but I have a couple of suggestions. Firstly, if in
> that example self == obj, I would prefer it to be a member of ce:
>
> | def col_bomb(ce):
> |        if ce.other.name == "Bomb":
> |                ce.owner.endObject()
>
> And to allow registration of other event handlers, let's rename
> 'register' to 'add_collision_callback'.
>
> | obj.add_collision_callback(col_bomb)
>
> What if the callback is a method? You might try using a closure, like this:
>
> | class Foo:
> |     def add_object(self, obj):
> |         def col_bomb(ce):
> |             if ce.other.name == "Bomb":
> |                 self.whatever(ce.owner)
> |
> |         obj.add_collision_callback(col_bomb)
>
> However keeping a reference to self in the inner function will prevent
> it from being deleted (so weak references won't work). I guess you
> could keep a weak reference to self in the inner function instead.
>
> Alternatively we could allow class instances to be passed in as
> handlers, and standarise on the method names for callbacks:
>
> | class Foo:
> |     def on_collision(self, ce):
> |         if ce.other.name == "Bomb":
> |             self.whatever(ce.obj)
> |
> |     def add_object(self, obj):
> |         obj.add_collision_handler(self)
>
> But then you have the same problem - add_collision_handler would have
> to have an option to only keep a weak reference. So maybe it's better
> to just accept a callback function, and let class methods use a
> closure if they need it.
>
> I see you have CollisionEvent.force in your proposal in the wiki - great idea!
>
> Cheers,
> Alex
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers
>



-- 
No essence.  No permanence.  No perfection.  Only action.


More information about the Bf-committers mailing list