hey hi, i add jump to my game but the charracter can keep jumping infinitely, how do i fix that? heres my code
import pygame, sys
level_map = [
' ',
' ',
' XX XXX XX ',
' XX P ',
' XXXX XX XX ',
' XXXX XX ',
' XX X XXXX XX XX ',
' X XXXX XX XXX ',
' XXXX XXXXXX XX XXXX ',
'XXXXXXXX XXXXXX XX XXXX ']
title_size = 64
screen_width = 1200
screen_height = len(level_map) * title_size
class Tile(pygame.sprite.Sprite):
def __init__(self,pos,size):
super().__init__()
self.image = pygame.Surface((size,size))
self.image.fill('grey')
self.rect = self.image.get_rect(topleft = pos)
def update(self,x_shift):
self.rect.x += x_shift
class Player(pygame.sprite.Sprite):
def __init__(self,pos):
super().__init__()
self.image = pygame.Surface((32,64))
self.image.fill('red')
self.rect = self.image.get_rect(topleft = pos)
#player movment
self.direction = pygame.math.Vector2(0,0)
self.speed = 8
self.gravity = 0.8
self.jump_speed = -16
self.jump_counter= 1
def get_input(self):
keys = pygame.key.get_pressed()
#COMANDOS
if keys[pygame.K_RIGHT]:
self.direction.x = 1
elif keys[pygame.K_LEFT]:
self.direction.x = -1
else:
self.direction.x = 0
if self.jump_counter==1:
if keys[pygame.K_UP] or keys[pygame.K_SPACE]:
self.jump()
self.jump_counter+1
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()
class Level:
def __init__(self,level_data,surface):
# level setup
self.display_surface = surface
self.setup_level(level_data)
self.world_shift = 0
def setup_level(self,layout):
self.tiles = pygame.sprite.Group()
self.player = pygame.sprite.GroupSingle()
for row_index,row in enumerate(layout):
for col_index,cell in enumerate(row):
x = col_index * title_size
y = row_index * title_size
if cell == 'X':
tile = Tile((x,y),title_size)
self.tiles.add(tile)
if cell == 'P':
player_sprite = Player((x,y))
self.player.add(player_sprite)
def scream_scroll(self):
Player = self.player.sprite
Player_x = Player.rect.centerx
direction_x = Player.direction.x
if Player_x < screen_width / 10 and direction_x < 0:
self.world_shift = 5
Player.speed = 0
elif Player_x > screen_width - (screen_width / 10) and direction_x > 0:
self.world_shift = -5
Player.speed = 0
else:
self.world_shift = 0
Player.speed = 5
def colision_x(self):
player = self.player.sprite
player.rect.x += player.direction.x * player.speed
for sprite in self.tiles.sprites():
if sprite.rect.colliderect(player.rect):
if player.direction.x < 0:
player.rect.left = sprite.rect.right
elif player.direction.x > 0:
player.rect.right = sprite.rect.left
def colision_y(self):
player = self.player.sprite
player.apply_gravity()
for sprite in self.tiles.sprites():
if sprite.rect.colliderect(player.rect):
if player.direction.y > 0:
player.rect.bottom = sprite.rect.top
player.direction.y = 0
elif player.direction.y < 0:
player.rect.top = sprite.rect.bottom
player.direction.y = 0.5
def run(self):
#level tiles
self.tiles.update(self.world_shift)
self.tiles.draw(self.display_surface)
self.scream_scroll()
#player
self.player.update()
self.colision_x()
self.colision_y()
self.player.draw(self.display_surface)
pygame.init()
screen = pygame.display.set_mode((screen_width,screen_height))
clock = pygame.time.Clock()
level = Level(level_map,screen)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
screen.fill('black')
level.run()
pygame.display.update()
clock.tick(60)
