0

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()
Matt
  • 45
  • 7

1 Answers1

0

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?.

Rabbid76
  • 202,892
  • 27
  • 131
  • 174