[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] UI Blues



It doesn't seem that bad to have several queues: The Player could have
a queue of its own events.

Then your main loop is more of a dispatcher. It just sends messages to
each entity telling them what to do and they enqueue their actions.

Then you could even have each queue be processed by a different thread.

-David

On Dec 23, 2007 9:24 PM, JoN <jon@xxxxxxxxxxxxxxxxxx> wrote:
>
> Yeah I see your problem -
>
> You want to clearly differentiate between 'hardware' events and 'Events' in general.
>
> And the double-queue method IS probably the purest way, but its double-handling.
>
> Hmmm...
>
>
>
> Quoting Kris Schnee <kschnee@xxxxxxxxxx>:
>
> > In revisiting my interface code, in light of what I've learned from the
> > tactics-game project, I've hit a snag.
> >
> > Earlier, I'd set up my interface so that hitting a button or something
> > would cause the button to call a "Notify" function of the main game
> > object, sending it a dictionary describing what happened.
> > {"headline":"click","sender":self} That meant having a special event
> > queue in the game object, to be added to by Notify and read by a game
> > loop. That is:
> >
> > -In Screen X, there's an interface. The user hits a button.
> > -The button calls Notify.
> > -The loop for Screen X sees that an "Button B was clicked" message has
> > appeared, and reacts to that.
> >
> > That's the "poorly-formatted random data" situation I was trying to
> > avoid, but I don't see how it _can_ be avoided. With the tactics game I
> > was getting around it by having ad-hoc variables attached to the
> > game-world object, rather than a generic message queue.
> >
> > Another approach to UI handling I've had suggested is to have a double
> > event-handling system. The first part handles raw Pygame events and adds
> > to a queue of _gameplay_ events, to which the UI can also add. The
> > second part handles the gameplay events, like so:
> >
> > for event in pygame.event.get():
> >      if event.type == KEYDOWN and event.key == KEYS_JUMP:
> >          self.game_events.append("jump")
> >
> > for event in self.game_events:
> >      if event == "jump":
> >          self.player.Jump()
> >      elif event == "pause_button_clicked":
> >          self.Pause()
> >
> > Does this setup make any sense?
> >
>
>
>
>
> --------------------------------------------------------------------
> Come and visit Web Prophets Website at http://www.webprophets.net.au
>
>