i am trying to use pygame to create a game for a school project. I have run into a major issue which is that i am unable to hold a key down to keep moving and i can either have the player move forever regardless of if the key or held or release of that axis (always moving left or right/ up or down after the key is pressed) or it just moves once and then stops.
import random
import pygame
import time
running = True #entire process of game is open
pygame.font.init()
temp = 0
blue = 0,0,255
green = 0,255,0
red = 255,0,0
black = 0,0,0
white = 255,255,255
grey = 142,145,143
font = "game.ttf"
true = True
close = True
player_x = 50
player_y = 700
xspeed = 0
yspeed = 0
def screen_open(): #initial boot of screen
(width, height) = (750, 750)
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('test 4')#name of screen
if game != "level_1": #sets the background colour
background_colour = (142,145,143 )
screen.fill(background_colour)
draw_menu(screen)
highlight_option(screen)
take_input_menu()
else:
background_colour = white
screen.fill(background_colour)
take_input_game()
draw_level_1(screen)
pygame.draw.rect(screen, red, pygame.Rect(player_x, player_y, 20, 20))
pygame.display.flip() #last step in render process
def screen_close(close): #closes the screen
if event.type == pygame.QUIT:
running = False
pygame.quit()
#render the text in the game
def text_format(message, textFont, textSize, textColor):
newFont=pygame.font.Font(textFont, textSize)
newText=newFont.render(message, 0, textColor)
return newText
def draw_menu(screen):
#title on menus
if game == "main_menu":
title=text_format("Gravitate", font, 75, black)
title_rect = title.get_rect()
screen.blit(title, (250,30))
if game == "mm_settings":
title=text_format("Settings", font, 75, black)
title_rect = title.get_rect()
screen.blit(title, (250,30))
if highlight == "s_back":
mm_settings_back(screen)
elif highlight == "assist":
mm_settings_assist(screen)
return
def start(screen): #start is highlighted on main menu
pygame.draw.rect(screen, white, pygame.Rect(250, 130, 250, 70))
start=text_format("Start ", font, 50, black)
screen.blit(start, (250,130))
pygame.draw.rect(screen, black, pygame.Rect(250, 240, 250, 70))
load_save=text_format("Load Save ", font, 50, white)
screen.blit(load_save, (250,240))
pygame.draw.rect(screen, black, pygame.Rect(250, 350, 250, 70))
settings=text_format("Settings ", font, 50, white)
screen.blit(settings, (250,350))
pygame.draw.rect(screen, black, pygame.Rect(250, 460, 250, 70))
quit=text_format("Quit ", font, 50, white)
screen.blit(quit, (255,460))
def load_save(screen): #load save is highlighted on main menu
pygame.draw.rect(screen, white, pygame.Rect(250, 240, 250, 70))
load_save=text_format("Load Save ", font, 50, black)
screen.blit(load_save, (250,240))
pygame.draw.rect(screen, black, pygame.Rect(250, 130, 250, 70))
start=text_format("Start ", font, 50, white)
screen.blit(start, (250,130))
pygame.draw.rect(screen, black, pygame.Rect(250, 350, 250, 70))
settings=text_format("Settings ", font, 50, white)
screen.blit(settings, (250,350))
pygame.draw.rect(screen, black, pygame.Rect(250, 460, 250, 70))
quit=text_format("Quit ", font, 50, white)
screen.blit(quit, (255,460))
def settings(screen): #settings is highlighted on main menu
pygame.draw.rect(screen, white, pygame.Rect(250, 350, 250, 70))
settings=text_format("Settings ", font, 50, black)
screen.blit(settings, (250,350))
pygame.draw.rect(screen, black, pygame.Rect(250, 130, 250, 70))
start=text_format("Start ", font, 50, white)
screen.blit(start, (250,130))
pygame.draw.rect(screen, black, pygame.Rect(250, 240, 250, 70))
load_save=text_format("Load Save ", font, 50, white)
screen.blit(load_save, (250,240))
pygame.draw.rect(screen,
black, pygame.Rect(250, 460, 250, 70))
quit=text_format("Quit ", font, 50, white)
screen.blit(quit, (255,460))
def quit(screen): #quit is highlighted on main menu
pygame.draw.rect(screen, white, pygame.Rect(250, 460, 250, 70))
quit=text_format("Quit ", font, 50, black)
screen.blit(quit, (255,460))
pygame.draw.rect(screen, black, pygame.Rect(250, 130, 250, 70))
start=text_format("Start ", font, 50, white)
screen.blit(start, (250,130))
pygame.draw.rect(screen, black, pygame.Rect(250, 240, 250, 70))
load_save=text_format("Load Save ", font, 50, white)
screen.blit(load_save, (250,240))
pygame.draw.rect(screen, black, pygame.Rect(250, 350, 250, 70))
settings=text_format("Settings ", font, 50, white)
screen.blit(settings, (250,350))
def mm_settings_back(screen): #back is highlighted on settings
pygame.draw.rect(screen, white, pygame.Rect(250, 460, 250, 70))
back=text_format("Back ", font, 50, black)
screen.blit(back, (255,460))
if assist == "on":
pygame.draw.rect(screen, black, pygame.Rect(250, 130, 250, 70))
start=text_format("Assist ON ", font, 50, white)
screen.blit(start, (250,130))
elif assist == "off":
pygame.draw.rect(screen, black, pygame.Rect(250, 130, 250, 70))
start=text_format("Assist OFF ", font, 50, white)
screen.blit(start, (250,130))
def mm_settings_assist(screen): #assit is highlighted on settings
pygame.draw.rect(screen, black, pygame.Rect(250, 460, 250, 70))
back=text_format("Back ", font, 50, white)
screen.blit(back, (255,460))
if assist == "on":
pygame.draw.rect(screen, white, pygame.Rect(250, 130, 250, 70))
start=text_format("Assist ON ", font, 50, black)
screen.blit(start, (250,130))
elif assist == "off":
pygame.draw.rect(screen, white, pygame.Rect(250, 130, 250, 70))
start=text_format("Assist OFF ", font, 50, black)
screen.blit(start, (250,130))
def take_input_menu():
global highlight
global game
global assist
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
if highlight == "s_back":
game = "main_menu"
highlight = "Settings"
if highlight == "assist":
if assist == "on":
assist = "off"
elif assist == "off":
assist = "on"
if highlight == "Quit":
pygame.quit()
if highlight == "Settings":
game = "mm_settings"
highlight = "assist"
if highlight == "Start":
game = "level_1"
elif event.key == pygame.K_BACKSPACE:
if game == "mm_settings":
game = "main_menu"
highlight = "Settings"
elif event.key == pygame.K_DOWN:
if highlight == "Start":
highlight = "Load_Save"
elif highlight == "Load_Save":
highlight = "Settings"
elif highlight == "Settings":
highlight = "Quit"
elif highlight == "Quit":
highlight = "Start"
elif highlight == "s_back":
highlight = "assist"
elif highlight == "assist":
highlight = "s_back"
elif event.key == pygame.K_UP:
if highlight == "Start":
highlight = "Quit"
elif highlight == "Load_Save":
highlight = "Start"
elif highlight == "Settings":
highlight = "Load_Save"
elif highlight == "Quit":
highlight = "Settings"
elif highlight == "s_back":
highlight = "assist"
elif highlight == "assist":
highlight = "s_back"
return
def take_input_game():
global game
global assist
global player_x
global player_y
global rotate
global past_rotate
global player_held
global xspeed
global yspeed
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.KEYUP:
## player_held = "nul"
yspeed = 0
xspeed = 0
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_DOWN:
## player_y = player_y + 10
player_held = "down"
yspeed = 10
elif event.key == pygame.K_UP:
## player_y = player_y - 10
player_held = "up"
yspeed = -10
elif event.key == pygame.K_RIGHT:
## player_x = player_x + 10
player_held = "right"
xspeed = 10
elif event.key == pygame.K_LEFT:
## player_x = player_x - 10
player_held = "left"
xspeed = -10
if event.key == pygame.K_w:
rotate = "180"
if past_rotate != "180":
if past_rotate == "0":
if player_x < 375:
player_x = 750 - player_x - 20
elif player_x > 375:
player_x = 750 - player_x - 20
if player_y < 375:
player_y = 750 - player_y - 20
elif player_y > 375:
player_y = 750 - player_y - 20
if past_rotate == "90":
temp = player_x
player_x = player_y
player_y = 750 - temp - 20
if past_rotate == "270":
temp = player_y
player_y = player_x
player_x = 750 - temp - 20
past_rotate = "180"
elif event.key == pygame.K_a:
rotate = "270"
if past_rotate != "270":
if past_rotate == "90":
if player_x < 375:
player_x = 750 - player_x - 20
elif player_x > 375:
player_x = 750 - player_x - 20
if player_y < 375:
player_y = 750 - player_y - 20
elif player_y > 375:
player_y = 750 - player_y - 20
if past_rotate == "180":
temp = player_x
player_x = player_y
player_y = 750 - temp - 20
if past_rotate == "0":
temp = player_y
player_y = player_x
player_x = 750 - temp - 20
past_rotate = "270"
elif event.key == pygame.K_s:
rotate = "0"
if past_rotate != "0":
if past_rotate == "180":
if player_x < 375:
player_x = 750 - player_x - 20
elif player_x > 375:
player_x = 750 - player_x - 20
if player_y < 375:
player_y = 750 - player_y - 20
elif player_y > 375:
player_y = 750 - player_y - 20
if past_rotate == "270":
temp = player_x
player_x = player_y
player_y = 750 - temp - 20
if past_rotate == "90":
temp = player_y
player_y = player_x
player_x = 750 - temp - 20
past_rotate = "0"
elif event.key == pygame.K_d:
rotate = "90"
if past_rotate != "90":
if past_rotate == "270":
if player_x < 375:
player_x = 750 - player_x - 20
elif player_x > 375:
player_x = 750 - player_x - 20
if player_y < 375:
player_y = 750 - player_y - 20
elif player_y > 375:
player_y = 750 - player_y - 20
if past_rotate == "0":
temp = player_x
player_x = player_y
player_y = 750 - temp - 20
if past_rotate == "180":
temp = player_y
player_y = player_x
player_x = 750 - temp - 20
past_rotate = "90"
return
return
def highlight_option(screen):
global highlight
global game
global assist
if game == "main_menu":
if highlight == "Start":
start(screen)
elif highlight == "Load_Save":
load_save(screen)
elif highlight == "Settings":
settings(screen)
elif highlight == "Quit":
quit(screen)
def draw_level_1(screen):
if rotate == "0":
pygame.draw.rect(screen, black, pygame.Rect(0, 720 , 750, 30))
elif rotate == "180":
pygame.draw.rect(screen, black, pygame.Rect(0, 0 , 750, 30))
elif rotate == "270":
pygame.draw.rect(screen, black, pygame.Rect(0, 0 , 30, 750))
elif rotate == "90":
pygame.draw.rect(screen, black, pygame.Rect(720, 0 , 30, 750))
#game---------
assist = "off"
highlight = "Start"
game = "main_menu"
on = "ON"
rotate = "0"
past_rotate = "0"
player_held = "nul"
while on == "ON":
while game == "main_menu":
screen_open()
time.sleep(1/60)
pygame.display.flip()
pygame.init()
while game == "mm_settings":
screen_open()
time.sleep(1/60)
pygame.display.flip()
pygame.init()
while game == "level_1":
screen_open()
time.sleep(1/60)
pygame.display.flip()
print (player_x, player_y)
if player_x < 0 or player_y < 0:
player_x = 350
player_y = 350
if player_x > 750 or player_y > 750:
player_x = 350
player_y = 350
## if player_held == "left":
## player_x = player_x - 10
## if player_held == "right":
## player_x = player_x + 10
## if player_held == "up":
## player_y = player_y - 10
## if player_held == "down":
## player_y = player_y + 10
player_x = player_x + xspeed
player_y = player_y + yspeed
pygame.init()