es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El jugador de Pygame puede saltar todo el tiempo que desee.

Estoy tratando de crear un método de salto para mi jugador en pygame. Salta hacia arriba, pero puedo mantener presionada la tecla de barra espaciadora y seguirá subiendo todo el tiempo que quiera y no sé cómo evitarlo. Aquí está el código de mi clase de jugador:

import pygame

class Player(pygame.sprite.Sprite):
    def __init__(self, pos):
        super().__init__()
        self.image = pygame.Surface((32, 64))
        self.image.fill('blue')
        self.rect = self.image.get_rect(topleft=pos)
        self.direction = pygame.math.Vector2(0, 0)
        self.speed = 8
        self.jump_speed = -16
        self.gravity = 0.8

def get_input(self):
    keys = pygame.key.get_pressed()

    if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
        self.direction.x = 1

    elif keys[pygame.K_LEFT] or keys[pygame.K_a]:
        self.direction.x = -1
    else:
        self.direction.x = 0

    if keys[pygame.K_SPACE] or keys[pygame.K_w] or keys[pygame.K_UP]:
        self.jump()

def apply_gravity(self):
    self.direction.y += self.gravity
    self.rect.y += self.direction.y

def jump(self):
    self.direction.y = self.jump_speed

def update(self):
    self.get_input()
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para evitar que el jugador salte continuamente cuando se mantiene presionada la tecla de espacio, se puede añadir una declaración condicional en el método jump para comprobar si el jugador ya está saltando. Si el jugador ya está saltando, se puede evitar que el método jump se ejecute de nuevo hasta que el jugador aterrice en una superficie. Esto se puede hacer añadiendo una variable booleana self.jumping a la clase del jugador y estableciéndola como True cuando se llama al método jump, y volviéndola a establecer como False cuando el jugador aterrice en una superficie. Aquí tienes un ejemplo de implementación:

    class Player(pygame.sprite.Sprite):
        def __init__(self, pos):
            super().__init__()
            # inicializar otros atributos
            self.jumping = False
    
        def get_input(self):
            keys = pygame.key.get_pressed()
            # manejar otros inputs
    
            if keys[pygame.K_SPACE] or keys[pygame.K_w] or keys[pygame.K_UP]:
                if not self.jumping:
                    self.jump()
    
        def jump(self):
            if not self.jumping:
                self.direction.y = self.jump_speed
                self.jumping = True
    
        def update(self):
            self.get_input()
            self.apply_gravity()
            # comprobar si el jugador aterriza en una superficie y establecer self.jumping de nuevo a False
            if self.rect.bottom >= SCREEN_HEIGHT:
                self.rect.bottom = SCREEN_HEIGHT
                self.direction.y = 0
                self.jumping = False
    

    En este ejemplo, self.jumping se establece como True cuando se llama al método jump por primera vez y permanecerá True hasta que el jugador aterrice en una superficie. Cuando el jugador aterriza en una superficie, el atributo rect.bottom se establece como SCREEN_HEIGHT y self.jumping se restablece como False.

Comments are closed.