Hi !
Featured games (84)
games approved by the League of Dukes
Games in Showcase (604)
Games in Android Showcase (171)
games submitted by our members
Games in WIP (654)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  [Solved] Removing An Event Broadcaster From Within A Listener  (Read 395 times)
0 Members and 1 Guest are viewing this topic.
Offline CodeHead

JGO Knight

Medals: 51

From rags to rags.

« Posted 2013-11-13 01:54:43 »

In my game engine I have an animation class that maintains a set of listeners and broadcasts events to them when certain animation states occur, namely animation start, animation update, and animation end. The engine maintains an array list of active animations that get updated every game tick which in turn trigger the related events. In my particular instance, there is a button in the engine which creates a new window and an animation that's used to control the widow's position. The animation is assigned an anonymous listener that handles the events and updates the position accordingly. Finally the animation is started and added to the list of active animations. So far so good.

Now the question. When the animation class broadcasts the animation end event, I would like to be able to remove it from the list of active animations. Of course if I try to remove the animation from the "active list" from within the "animation end" event handler, I get a concurrent update exception. What would be the proper way to handle this situation? So far the only solution that I've thought of would involve marking the animation as "dead" and having the master animation list remove it (or any other dead animations) on the next iteration through the list. I have a nagging feeling that there is probably a better solution to this which is eluding me at the moment. Does anyone have any advice on how to approach this, or is the "mark and sweep" method the only way? Huh

Arthur: Are all men from the future loud-mouthed braggarts?
Ash: Nope. Just me baby...Just me.
Offline Danny02
« Reply #1 - Posted 2013-11-13 12:46:28 »

you can make the removal safe by iterating backwards with an index over the listener collection. So instead of:
for(Animation a: animations)
{ a.process(); }

for(int i=a.length - 1; i >= 0; i--)

Offline CodeHead

JGO Knight

Medals: 51

From rags to rags.

« Reply #2 - Posted 2013-11-13 17:30:14 »

Danke schön! Using a 'listIterator' to traverse the animations list in reverse worked like a charm. Grin I had a feeling that the answer was a lot simpler than my lack of sleep and over-analysis was letting me comprehend. Shocked

Update: After a bit of poking around with the code I've found that the 'listIterator' can still cause this error in the case where two animations are removed in the same game tick. Going with the solution as originally posted does however work without a hitch. I just wish this were possible using the iterator pattern.

Arthur: Are all men from the future loud-mouthed braggarts?
Ash: Nope. Just me baby...Just me.
Pages: [1]
  ignore  |  Print  
You cannot reply to this message, because it is very, very old.

bilznatch (27 views)
2015-08-04 11:03:17

SHC (44 views)
2015-08-01 03:58:20

Jesse (25 views)
2015-07-29 04:35:27

Riven (48 views)
2015-07-27 16:38:00

Riven (26 views)
2015-07-27 15:35:20

Riven (28 views)
2015-07-27 12:26:13

Riven (19 views)
2015-07-27 12:23:39

BurntPizza (42 views)
2015-07-25 00:14:37

BurntPizza (56 views)
2015-07-24 22:06:39

BurntPizza (35 views)
2015-07-24 06:06:53
List of Learning Resources
by gouessej
2015-07-09 11:29:36

How Do I Expand My Game?
by bashfrog
2015-06-14 11:34:43

List of Learning Resources
by PocketCrafter7
2015-05-31 05:37:30

Intersection Methods
by Roquen
2015-05-29 08:19:33

List of Learning Resources
by SilverTiger
2015-05-05 10:20:32

How to: JGO Wiki
by Mac70
2015-02-17 20:56:16

2D Dynamic Lighting
by ThePixelPony
2015-01-01 20:25:42

How do I start Java Game Development?
by gouessej
2014-12-27 19:41:21 is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!