how to move a rectangle in a pygame program

Question:

Good day, I am writing a pygame program that uses sockets. Right now I am just trying to get the rectangles to move in the x-axis and I keep getting this error

self.rect.x += self.dx
AttributeError: 'tuple' object has no attribute 'x' ". 

My goal is just to move the rect left and right. using the move method below.

import pygame
class Player():
    def __init__(self, x, y, width, height, color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.rect = pygame.Rect((x, y, width, height))
        self.vel = 3
        self.dx = 0
        self.dy = 0
        self.jump = False


    def draw(self, win):
        pygame.draw.rect(win, self.color, self.rect)

    def move(self, screen_width, screen_height):
        SPEED = 10
        dx = 0
        dy = 0
        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT]:
            self.dx = -SPEED

        if keys[pygame.K_RIGHT]:
            self.dx = SPEED

        self.update()

    def update(self):
        # update player position
        self.rect.x += self.dx
        self.rect.y += self.dy
        self.rect = (self.x, self.y, self.width, self.height)
        self.dx = 0
        self.dy = 0
Asked By: coldflows

||

Answers:

o move the rectangle in your pygame program, you can update the x and y positions of the rect attribute of your Player object.

You can do this by using the arrow keys to change the dx and dy values of your Player object and then adding these values to the x and y positions of the rect attribute in the update method.

For example, you can modify your code as follows:

import pygame

class Player():
    def __init__(self, x, y, width, height, color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.rect = pygame.Rect((x, y, width, height))
        self.vel = 3
        self.dx = 0
        self.dy = 0
        self.jump = False

    def draw(self, win):
        pygame.draw.rect(win, self.color, self.rect)

    def move(self, screen_width, screen_height):
        SPEED = 10
        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT]:
            self.dx = -SPEED

        if keys[pygame.K_RIGHT]:
            self.dx = SPEED

        if keys[pygame.K_UP]:
            self.dy = -SPEED

        if keys[pygame.K_DOWN]:
            self.dy = SPEED

        self.update()

    def update(self):
        # update player position
        self.rect.x += self.dx
        self.rect.y += self.dy
        self.dx = 0
        self.dy = 0

In this example, the move method is modified to update the dx and dy values based on the arrow keys being pressed. The update method is then responsible for updating the x and y positions of the rect attribute by adding the dx and dy values.

You can then call the move method in your game loop to move the rectangle in response to user input.

Answered By: Ranjit Maity

I see that you already created a pygame.Rect object and updated it correct, why recreate that object?
Change this:

def update(self):
    # update player position
    self.rect.x += self.dx
    self.rect.y += self.dy
    self.rect = (self.x, self.y, self.width, self.height)
    self.dx = 0
    self.dy = 0

To:

def update(self):
    # update player position
    self.rect.x += self.dx
    self.rect.y += self.dy
    self.dx = 0
    self.dy = 0

Also you might want to remove this as it doesn’t do anything:

self.x = x
self.y = y

Unless you need the position where it was first created

Answered By: YoutuberTom
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.