Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 8, 2022 03:52 am GMT

pygame events are queued | Don't make this mistake

pygame events are stored in a queue, by default the most suggested way shown in all tutorials "pumps" the queue, which removes all the messages.

start up pygame

You don't necessarily need a full boilerplate to start looking at events, you just just need to pygame.init() and to capture any keystrokes you need a window to capture them on, so you will need a display running.

import pygame pygame.init() pygame.display.set_mode((854, 480))

get some events

Let's use pygames normal event.get method to get events.

events = pygame.event.get()

printing the events reveal this

[    <Event(1541-JoyDeviceAdded {'device_index': 0, 'guid': '030000005e0400008e02000010010000'})>,    <Event(4352-AudioDeviceAdded {'which': 0, 'iscapture': 0})>,    <Event(4352-AudioDeviceAdded {'which': 1, 'iscapture': 0})>,    <Event(4352-AudioDeviceAdded {'which': 2, 'iscapture': 0})>,    <Event(4352-AudioDeviceAdded {'which': 0, 'iscapture': 1})>,    <Event(4352-AudioDeviceAdded {'which': 1, 'iscapture': 1})>,    <Event(32774-WindowShown {'window': None})>,    <Event(32777-WindowMoved {'x': 535, 'y': 302, 'window': None})>,    <Event(32770-VideoExpose {})>,    <Event(32776-WindowExposed {'window': None})>,    <Event(32788-WindowTakeFocus {'window': None})>,    <Event(32768-ActiveEvent {'gain': 1, 'state': 1})>,    <Event(32785-WindowFocusGained {'window': None})>,    <Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>,    <Event(771-TextInput {'text': 'a', 'window': None})>,    <Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,    <Event(771-TextInput {'text': 's', 'window': None})>,    <Event(769-KeyUp {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>,    <Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,    <Event(771-TextInput {'text': 'd', 'window': None})>,    <Event(769-KeyUp {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,    <Event(769-KeyUp {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,    <Event(768-KeyDown {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,    <Event(771-TextInput {'text': 'f', 'window': None})>,    <Event(769-KeyUp {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,    <Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,    <Event(771-TextInput {'text': 's', 'window': None})>,    <Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,    <Event(771-TextInput {'text': 'd', 'window': None})>,    <Event(769-KeyUp {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,    <Event(769-KeyUp {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,    <Event(768-KeyDown {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,    <Event(771-TextInput {'text': 'f', 'window': None})>,    <Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>,    <Event(771-TextInput {'text': 'a', 'window': None})>,    <Event(769-KeyUp {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,    <Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,    <Event(771-TextInput {'text': 's', 'window': None})>,    <Event(769-KeyUp {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>,    <Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,    <Event(771-TextInput {'text': 'd', 'window': None})>,    <Event(769-KeyUp {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,    <Event(769-KeyUp {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,    <Event(768-KeyDown {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,    <Event(771-TextInput {'text': 'f', 'window': None})>,    <Event(769-KeyUp {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,    <Event(768-KeyDown {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>,    <Event(771-TextInput {'text': 'a', 'window': None})>,    <Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,    <Event(771-TextInput {'text': 's', 'window': None})>,    <Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,    <Event(771-TextInput {'text': 'd', 'window': None})>,    <Event(769-KeyUp {'unicode': 'a', 'key': 97, 'mod': 0, 'scancode': 4, 'window': None})>,    <Event(769-KeyUp {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,    <Event(769-KeyUp {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,    <Event(768-KeyDown {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,    <Event(771-TextInput {'text': 'f', 'window': None})>,    <Event(769-KeyUp {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,    <Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,    <Event(771-TextInput {'text': 's', 'window': None})>,    <Event(769-KeyUp {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,    <Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,    <Event(771-TextInput {'text': 'd', 'window': None})>,    <Event(769-KeyUp {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,    <Event(768-KeyDown {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,    <Event(771-TextInput {'text': 'f', 'window': None})>,    <Event(769-KeyUp {'unicode': 'f', 'key': 102, 'mod': 0, 'scancode': 9, 'window': None})>,    <Event(768-KeyDown {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,    <Event(771-TextInput {'text': 's', 'window': None})>,    <Event(769-KeyUp {'unicode': 's', 'key': 115, 'mod': 0, 'scancode': 22, 'window': None})>,    <Event(768-KeyDown {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,    <Event(771-TextInput {'text': 'd', 'window': None})>,    <Event(769-KeyUp {'unicode': 'd', 'key': 100, 'mod': 0, 'scancode': 7, 'window': None})>,    <Event(768-KeyDown {'unicode': '', 'key': 1073742051, 'mod': 1024, 'scancode': 227, 'window': None})>,    <Event(772-Unknown {})>,    <Event(769-KeyUp {'unicode': '', 'key': 1073742051, 'mod': 0, 'scancode': 227, 'window': None})>,    <Event(32768-ActiveEvent {'gain': 0, 'state': 1})>,    <Event(32786-WindowFocusLost {'window': None})>,    <Event(772-Unknown {})>]

Lets get some more events.

Let's say that we have multpile sprites all asking for the events from different places in our game. If we assume that our game loop runs very fastand we get events one after another the second one will have no events.

events_one = pygame.event.get() events_two = pygame.event.get()

printing the events reveals that there are no events, well i

[]

Making things more maddening

Even simple games don't quite run infinitely fast there is some delay, with this delay most events will go to event_one, while any that occur in the short time between event_one and two will be in event_two's queue.

import time events_one = pygame.event.get() time.sleep(.05) # simulating some delay that would naturally occur events_two = pygame.event.get()

How to Resolve this

Store events for each frame in memory.

Pump

I thought pump=False would be the answer I was looking for, but I was proven wrong. It does not behave intuitivly to me.

events_one = pygame.event.get(pump=False) events_two = pygame.event.get(pump=False) events_three = pygame.event.get()

events_one and events_three will have a list of events, while
events_two will be empty. It seems that pump=False leaves the
events there for the next event.get(), but appears cleared to any
event.get(pump=False).

Keep a Game State

If you want objects to do their own event handling, outside of the main game, you will need to give them some game state with the events in it. However you decide, you may only call event.get() once per game loop otherwise weird things will happen.


Original Link: https://dev.to/waylonwalker/pygame-events-are-queued-dont-make-this-mistake-4h6k

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To