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