0

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()

0 Answers0