'Double jump issue pygame with get key presses
I have created double jump in a few games now, but always in key events in game loop. This is not working for me here now I have put it into 'get key presses' in player class. I have created the boolean to show '1' when in air, and then reset it back to 0 when jumped while its on '1'. but then when I jump it instantly goes back to 0 so I can infinitely jump.
#player movement
self.movement = pygame.math.Vector2()
self.speed = speed
self.gravity = 1
self.collision_sprites = collision_sprites
self.grounded = False
self.jump_counter = 0
def input(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_d]:
self.movement.x = 1
elif keys[pygame.K_a]:
self.movement.x = -1
else:
self.movement.x = 0
if keys[pygame.K_w] and self.grounded == True:
self.movement.y = -JUMP_SPEED
self.jump_counter = 1
if keys[pygame.K_w] and self.jump_counter == 1:
self.movement.y = -JUMP_SPEED
self.jump_counter = 0
print(self.jump_counter)
def x_collisions(self):
for sprite in self.collision_sprites.sprites():
if sprite.rect.colliderect(self.rect):
if self.movement.x < 0:
self.rect.left = sprite.rect.right
if self.movement.x > 0:
self.rect.right = sprite.rect.left
def y_collisions(self):
for sprite in self.collision_sprites.sprites():
if sprite.rect.colliderect(self.rect):
if self.movement.y > 0:
self.rect.bottom = sprite.rect.top
self.grounded = True
self.jump_counter = 0
self.movement.y = 0
if self.movement.y < 0:
self.rect.top = sprite.rect.bottom
self.movement.y = 0
if self.grounded == True and self.movement.y != 0:
self.grounded = False
def apply_gravity(self):
self.movement.y += self.gravity
self.rect.y += self.movement.y
if self.movement.y > TERMINAL_VELOCITY:
self.movement.y = TERMINAL_VELOCITY
def update(self):
self.input()
self.rect.x += self.movement.x * self.speed
self.x_collisions()
self.apply_gravity()
self.y_collisions()
Solution 1:[1]
You need to set self.jump_counter = 2 instead of self.jump_counter = 0. The player can therefore only jump again when it is self.grounded.
Also, you should use the keyboard events instead of pygame.key.get_pressed() for jumping. pygame.key.get_pressed() returns a list with the state of each key. If a key is held down, the state for the key is True, otherwise False. Use pygame.key.get_pressed() to evaluate the current state of a button and get continuous movement. The keyboard events (see pygame.event module) occur only once when the state of a key changes. The KEYDOWN event occurs once every time a key is pressed. KEYUP occurs once every time a key is released. Use the keyboard events for a single action like jumping:
def input(self, event_list):
[...]
start_jump = False
for event in event_list:
start_jump = event.type == pygame.KEYDOWN and event.key == pygame.K_w:
if start_jump and self.grounded == True:
self.movement.y = -JUMP_SPEED
self.jump_counter = 1
if start_jump and self.jump_counter == 1:
self.movement.y = -JUMP_SPEED
self.jump_counter = 2
# [...]
run = True
while run:
event_list = pygame.event.get()
for event in event_list:
if event.type == pygame.QUIT:
run = False
player.input(event_list)
# [...]
See also How to make a character jump in Pygame? and How can I do a double jump in pygame?.
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 |
