Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

change rect position in pygame

I am trying to change where the ship from Alien Invasion is drawn when the game starts and I don’t actually know where to make the changes.
I want it to be at a selected position by me when the game starts, not midbottom.
Ship code:

class Ship(Sprite):
"""A class to manage the ship."""

def __init__(self,ai_game):
    """Initialize the ship and set its starting position."""
    super().__init__()
    self.screen = ai_game.screen
    self.settings = ai_game.settings
    self.screen_rect = ai_game.screen.get_rect()

    #Load the ship image and get its rect.
    self.image = pygame.image.load('images/ship.png')
    self.rect = self.image.get_rect()

    #Start each new ship at the bottom center of the screen.
    self.rect.midbottom = self.screen_rect.midbottom

    #Store a decimal value for the ship's horizontal position.
    self.x = float(self.rect.x)
    self.y = float(self.rect.y)

    #Movement flags
    self.moving_right = False
    self.moving_left = False
    self.moving_up = False
    self.moving_down = False

def update(self):
    """Update the ship's position based on the movement flags."""
    #Update the ship's x value, not the rect.
    if self.moving_right and self.rect.right < self.screen_rect.right:
        self.x += self.settings.ship_speed
    if self.moving_left and self.rect.left > 0:
        self.x -= self.settings.ship_speed
    if self.moving_up and self.rect.top > 0:
        self.y -= self.settings.ship_speed
    if self.moving_down and self.rect.bottom <= self.screen_rect.bottom:
        self.y += self.settings.ship_speed


    #Update rect object from self.x.
    self.rect.x = self.x
    self.rect.y = self.y
        

def blitme(self):
        """Draw the ship at its current location."""
        self.screen.blit(self.image, self.rect)

def center_ship(self):
    """Center the ship on the screen."""
    self.rect.midbottom = self.screen_rect.midbottom
    self.x = float(self.rect.x)
    self.y = float(self.rect.y)     

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

You need to set the position of the ship in the rect attribute. You can do this when you get the bounding rectangle from the image:

self.rect = self.image.get_rect()
self.rect.x = 200
self.rect.y = 100

Or even shorter using the keyword attributes of the method get_rect:

self.rect = self.image.get_rect(topleft = (200, 100))

I suggest to add x and y attributes to the constructor of the Ship class:

class Ship(Sprite):
"""A class to manage the ship."""

    def __init__(self, ai_game, x, y):
        # [...]

        #Load the ship image and get its rect.
        self.image = pygame.image.load('images/ship.png')
        self.rect = self.image.get_rect(topleft = (x, y))

        # [...]
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading