0

In my pygame platformer, when I jump it sometimes randomly jumps more than double of the normal jump. I've been trying to understand why this happens but I really don't know. I've been testing it and it appears to be completely random. It does it when I jump while moving, when I jump standing still BUT, surprisingly, it doesn't do it when holding down the jump key instead of clicking each time I jump. Here's the code

import pygame
import time

# Game Settings
DISPLAY_W = 1000
DISPLAY_H = 400
FPS = 60

# Colors
BLACK = pygame.Color(0, 0, 0)
WHITE = pygame.Color(255, 255, 255)
RED = pygame.Color(247, 20, 20)
PINK = pygame.Color(252, 100, 180)
YELLOW = pygame.Color(252, 230, 70)
BLUE = pygame.Color(50, 0, 252)

# assets
icon = pygame.image.load("icon.png")

# variables
PLAYER_SPEED = 6.5
PLAYER_FALLSPEED = 0.01
PLAYER_JUMPSPEED = 4
clock = pygame.time.Clock()
prev_time = time.time()
jumped = False

objectlist = []


class Player:
    def __init__(self):
        # Rect Variables
        self.pos = [100, 0]
        self.posx = self.pos[0]
        self.posy = self.pos[1]
        self.size = (50, 50)
        self.sizex = self.size[0]
        self.sizey = self.size[1]
        self.up = pygame.Rect(self.pos, (self.sizex * 0.1, self.sizey))
        self.down = pygame.Rect((self.posx + self.sizex * 0.9, self.posy), (self.sizex * 0.1, self.sizey))
        self.left = pygame.Rect(self.pos, (self.sizex, self.sizey * 0.1))
        self.right = pygame.Rect((self.posx, self.posy + self.sizey * 0.9), (self.sizex, self.sizey * 0.1))
        self.drawrect = pygame.Rect(self.pos, self.size)

        # init
        self.speed = pygame.Vector2(0, 0)

    def update(self):
        global jumped
        """
        handle input, check pressed keys for movement,
        use input to define a direction vector
        """

        self.vector = pygame.Vector2(0, 0)
        self.gravity = pygame.Vector2(0, 0)

        # Key Input
        keys = pygame.key.get_pressed()
        if keys[pygame.K_d] or keys[pygame.K_RIGHT]:
            self.vector.x += 1
        if keys[pygame.K_a] or keys[pygame.K_LEFT]:
            self.vector.x -= 1
        if (keys[pygame.K_w] or keys[pygame.K_SPACE] or keys[pygame.K_UP]) and not jumped:
            self.vector.y -= 1 * PLAYER_JUMPSPEED
            jumped = True

        self.gravity.y += PLAYER_FALLSPEED  # gravity

        # Speed updates
        self.speed += pygame.Vector2((self.vector.x * PLAYER_SPEED) * dt * FPS, (self.vector.y + self.gravity.y) * dt * FPS)
        self.speed.x = self.speed.x * 0.6

        # Position / rect updates
        self.pos += self.speed
        self.drawrect = (self.pos, self.size)

        # COLLISION

        # Floor Collision
        if self.pos[1] + self.size[1] >= DISPLAY_H:
            self.pos[1] = DISPLAY_H - self.size[1]
            self.speed.y = 0
            jumped = False


class Object:
    def __init__(self, x, y):
        # Rect Variables
        self.pos = (x, y)
        self.size = (50, 50)
        self.objectrect = pygame.Rect(self.pos, self.size)
        objectlist.append(self.objectrect)


class Game:
    """
        Game Class, responsible for initialing pygame modules,
        loading game assets and controlling game states and game loop.
    """

    def __init__(self):
        pygame.init()
        self.display = pygame.display.set_mode((DISPLAY_W, DISPLAY_H))
        pygame.display.set_caption('Just a Platformer')
        pygame.display.set_icon(icon)
        self.playerinstance = Player()

    def update(self):
        global prev_time, dt
        playing = True

        # START LEVEL
        while playing:
            now = time.time()
            dt = now - prev_time
            prev_time = now
            # update all entities (calls update() methods)
            self.playerinstance.update()

            # check events
            for event in pygame.event.get():
                # close window event
                if event.type == pygame.QUIT:
                    playing = False

            # draw the objects
            self.display.fill(WHITE)
            pygame.draw.rect(self.display, BLUE, self.playerinstance.drawrect)

            pygame.display.update()


clock.tick(60)

if __name__ == "__main__":
    g = Game()
    g.update()

Let me know if you have any questions

0 Answers0