Jason Haoyan Shen
Jason Haoyan Shen

Reputation: 35

Why is my move function not working in pygame?

IDK why my player.move() is not working here's my main class:

import pygame
from player import *

pygame.init()

WIDTH, HEIGHT = 900, 600
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("MyGame!")

FPS = 60

player_x = 500
player_y = 500
PLAYER_WIDTH = 60
PLAYER_HEIGHT = 60
PLAYER_VEL = 5

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

keys_pressed = pygame.key.get_pressed()

player_rect = pygame.Rect(player_x, player_y, PLAYER_WIDTH, PLAYER_HEIGHT)
player = Player(player_rect, BLACK, WIN, keys_pressed, PLAYER_VEL)

def draw_window():
    WIN.fill(WHITE)
    pygame.display.update()

def main():
    run = True
    clock = pygame.time.Clock()

    while run:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

        draw_window()
        player.move()
        player.draw_player()

        pygame.display.update()

    pygame.quit()

if __name__ == '__main__':
    main()

and here's my other class called player.py that the move function is not working: import pygame

class Player(object):
    def __init__(self, player, color, surface, keys_pressed, vel):
        self.player = player
        self.color = color
        self.surface = surface
        self.keys_pressed = keys_pressed
        self.vel = vel

    def draw_player(self):
        pygame.draw.rect(self.surface, self.color, self.player)
        pygame.display.update()

    def move(self):
        if self.keys_pressed[pygame.K_a]:
            self.player.x -= self.vel

        if self.keys_pressed[pygame.K_d]:
            self.player.x += self.vel

I tried putting the player = Player(...) before the main function. But whatever I tried, it doesn't seem to work and this is my first time posting a question on stackoverflow. This problem also happened alot in the past so thanks if you helped me out.

Upvotes: 3

Views: 239

Answers (1)

Rabbid76
Rabbid76

Reputation: 210928

pygame.key.get_pressed() returns a sequence with the state of each key. If a key is held down, the state for the key is 1, otherwise 0. The contents of the keys_pressed list don't magically change when the state of the keys changes. keys_pressed is not tied to the keys. You need to get the new state of the keys in every frame:

class Player(object):
    # [...]

    def move(self):

        # get current state of the keys
        self.keys_pressed = pygame.key.get_pressed()
        
        if self.keys_pressed[pygame.K_a]:
            self.player.x -= self.vel

        if self.keys_pressed[pygame.K_d]:
            self.player.x += self.vel

Upvotes: 6

Related Questions