'pygame not catching keyboard inputs
I have a checkboard game set up with two gun sprites. I want to be able to move the gun sprites around freely but for some reason, pygame keeps missing my inputs. The code I have set up for the gun sprites is
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.blit(background, (0, 0))
if gunrotationcheck == 0: #Checks if gunrotationcheck is set to 0. If true, replace gun with up sprite
gun = pygame.image.load('gun_up.png')
screen.blit(gun, (gunx,guny))
elif gunrotationcheck == 1: #Checks if gunrotationcheck is set to 1. If true, replace gun with left sprite
gun = pygame.image.load('gun_left.png')
screen.blit(gun, (gunx-25,guny+30)) #Position fix
elif gunrotationcheck == 3: #Checks if gunrotationcheck is set to 3. If true, replace gun with down sprite
gun = pygame.image.load('gun_down.png')
screen.blit(gun, (gunx,guny))
elif gunrotationcheck == 2: #Checks if gunrotationcheck is set to 2. If true, replace gun with right sprite
gun = pygame.image.load('gun_right.png')
screen.blit(gun, (gunx-25,guny+30)) #Position fix
events = pygame.event.get()
for event in events:
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a: #Move left
gunx -= 50
if event.key == pygame.K_d: #Move right
gunx += 50
if event.key == pygame.K_w: #Move up
guny -= 50
if event.key == pygame.K_s: #Move down
guny += 50
if event.key == pygame.K_j: #Turn left
gunrotationcheck = 1
gun = pygame.image.load('gun_left.png')
screen.blit(gun, (gunx,guny))
if event.key == pygame.K_l: #Turn right
gunrotationcheck = 2
gun = pygame.image.load('gun_right.png')
screen.blit(gun, (gunx,guny))
if event.key == pygame.K_i: #Turn up
gunrotationcheck = 0
gun = pygame.image.load('gun_up.png')
screen.blit(gun, (gunx,guny))
if event.key == pygame.K_k: #Turn down
gunrotationcheck = 3
gun = pygame.image.load('gun_down.png')
screen.blit(gun, (gunx,guny))```
Solution 1:[1]
pygame.event.get() get all the messages and remove them from the queue. See the documentation:
This will get all the messages and remove them from the queue. [...]
If pygame.event.get() is called in multiple event loops, only one loop receives the events, but never all loops receive all events. As a result, some events appear to be missed.
Implement only one event loop:
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_a: #Move left
gunx -= 50
if event.key == pygame.K_d: #Move right
gunx += 50
if event.key == pygame.K_w: #Move up
guny -= 50
if event.key == pygame.K_s: #Move down
guny += 50
# [...]
screen.blit(background, (0, 0))
# [...]
See also Faster version of 'pygame.event.get()'. Why are events being missed and why are the events delayed?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Rabbid76 |
