1

I'm trying to make a game with pygame in which an object moves and i'm trying to get rid of its previous image by drawing a background colored object in its previous position, but for some reason it just wont work, and i've extracted the part of the code which fails

import pygame, sys, math
pygame.init()

player = [250, 250]
size = 50
WIDTH = 10*size
HEIGHT = 10*size
speed = 1
prev_pos = player

W = False

screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                W = True
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_w:
                W = False
    print(prev_pos)
    if W:
        player[1] = player[1]-speed
    print(f"wtf? {prev_pos}ww")

    pygame.draw.circle(screen, 'black', center=(prev_pos[0], prev_pos[1]), radius=20)
    pygame.draw.circle(screen, 'blue', center=(player[0], player[1]), radius=20)
    
    prev_pos = player
    print(f"prev pos has changed {prev_pos}")

    pygame.display.flip()
    clock.tick(60)

this is the original code you can move with w key

a = [250, 250]
b = a
while True:

    if a[0] > 0:
        print(b)
        a[0] += 20
        print(b)

print(f"b has changed {b}")

and for some reason when a changes it changes b, now i know it might not be a bug but i can't fix this issue on my own

i tried storing it in another variable, another list and all kinds of stuff but nothing worked

Rabbid76
  • 202,892
  • 27
  • 131
  • 174
Slash
  • 13
  • 2
  • 1
    "when a changes it changes b" the reason being that they are the same object, as indicated by `a = b`. Kids don't learn about pointers anymore these days. – njzk2 Mar 11 '23 at 22:23

1 Answers1

2

prev_pos = player does not create a copy of the list, but only a new reference to the same list. You must copy the elements of the list:

prev_pos = player[:]

Complete code

import pygame, sys, math
pygame.init()

player = [250, 250]
size = 50
WIDTH = 10*size
HEIGHT = 10*size
speed = 1
prev_pos = player[:]

W = False

screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                W = True
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_w:
                W = False
    print(prev_pos)
    if W:
        player[1] = player[1]-speed
    print(f"wtf? {prev_pos}ww")

    pygame.draw.circle(screen, 'black', center=(prev_pos[0], prev_pos[1]), radius=20)
    pygame.draw.circle(screen, 'blue', center=(player[0], player[1]), radius=20)
    
    prev_pos = player[:]
    print(f"prev pos has changed {prev_pos}")

    pygame.display.flip()
    clock.tick(60)

Also see How can I make a sprite move when key is held down

Rabbid76
  • 202,892
  • 27
  • 131
  • 174