Behavior threads not turning off correctly?

I’m using a bunch of behaviors, but I find that when I iterate through a large list of objects, each with a behavior attached to it, and say b.setEnable(false) for each one, I find that not all of them turn off. I made a test button that iterates through the list, and even after 3 or 4 presses, not all of them sometimes turn off.

Has anyone ever had this issue before? Is there a better way to turn off a behavior in such a way that you can still easily turn it back on at a later point?

–DAT

How are you calling that method? Is it possible that some of your behaviours are currently running and can’t be disabled until they have stopped or something like that?

If you are writing your own behaviours you could just write a method that changes the wakeupCriterion to an explicit call from elsewhere. You could even possibly make it static so a single call could replace all the wakeupcriteria (I suspect this won’t work for some reason- I’m thinking this up as I go along but it would be way handy if it did work…)

I think the preferred way to turn off a Behavior is to
use the WakeupCriteria, not to use setEnable(false),
if the behavior has already been activated.

You can have the WakeupCriteria be an AWTEvent, such as a mouse or key event, and then do a “soft” disable in the Behavior itself.

Note: A Behavior that has WakeupOnElapsedFrames(0) will wake up every frame.

Also, the Bounds of the Behavior will determine if it is a candidate for activation, so you could try changing the bounds dynamically if the other approach(es) don’t work.

On a side note, I have had some weirdness with WakeupCriterionAnd and WakeupCriterionOr if I set them after the behavior has already activated. If I do it before the behavior activates then it is fine, however… :stuck_out_tongue: