Python Forum
[PyGame] Sprite image.get_rect() moves sprite to 0, 0 - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Game Development (https://python-forum.io/forum-11.html)
+--- Thread: [PyGame] Sprite image.get_rect() moves sprite to 0, 0 (/thread-23145.html)



Sprite image.get_rect() moves sprite to 0, 0 - michael1789 - Dec-13-2019

In the update section I have down below, I have this:
self.image = pygame.transform.rotate(self.ship_img, self.dir)
print("before get_rect", self.rect.x, self.rect.y)
self.rect = self.image.get_rect()
print("after get_rect", self.rect.x, self.rect.y)
the output is this:
Hello from the pygame community. https://www.pygame.org/contribute.html
init 293 575
cleaning up Menu state stuff
update top 293 575
before get_rect 293 575
after get_rect 0 0
update top 0 0
before get_rect 0 0
after get_rect 0 0
update top 0 0
I've never faced this before. I want to .get_rect() so the sprite doesn't wiggle when it rotates. Why does this happen? Wall

class Ship(pygame.sprite.Sprite):
    def __init__(self, x, y):
        
        pygame.sprite.Sprite.__init__(self)
        self.ship_img = pygame.Surface((15,10), pygame.SRCALPHA)
        self.ship_img.fill(red)
        self.image = self.ship_img
        self.rect = self.image.get_rect()
        
        self.hit_rect = ship_HIT_RECT
        self.hit_rect.center = self.rect.center
        self.rect.centerx = x
        self.rect.centery = y
        print("init", self.rect.x, self.rect.y)
        self.hspeed = 0
        self.vspeed = 0
        self.dir = 0
        self.rtspd = 0
        self.thrust = False   
        
        
    def update(self):
        print("update top", self.rect.x, self.rect.y)
        speed = math.sqrt(self.hspeed**2 + self.vspeed**2)
        if self.thrust:
            
            if speed + fd_fric < ship_max_speed:
                self.hspeed += fd_fric * math.cos(self.dir * math.pi / 180)
                self.vspeed += fd_fric * math.sin(self.dir * math.pi / 180)
            else:
                self.hspeed = ship_max_speed * math.cos(self.dir * math.pi / 180)
                self.vspeed = ship_max_speed * math.sin(self.dir * math.pi / 180)
        else:
            if speed - bd_fric > 0:
                change_in_hspeed = (bd_fric * math.cos(self.vspeed / self.hspeed))
                change_in_vspeed = (bd_fric * math.sin(self.vspeed / self.hspeed))
                if self.hspeed != 0:
                    if change_in_hspeed / abs(change_in_hspeed) == self.hspeed / abs(self.hspeed):
                        self.hspeed -= change_in_hspeed
                    else:
                        self.hspeed += change_in_hspeed
                if self.vspeed != 0:
                    if change_in_vspeed / abs(change_in_vspeed) == self.vspeed / abs(self.vspeed):
                        self.vspeed -= change_in_vspeed
                    else:
                        self.vspeed += change_in_vspeed
            else:
                self.hspeed = 0
                self.vspeed = 0
        
        self.rect.centerx += self.hspeed
        self.rect.centery += self.vspeed
        self.dir += self.rtspd
        self.image = pygame.transform.rotate(self.ship_img, self.dir)
        print("before get_rect", self.rect.x, self.rect.y)
        self.rect = self.image.get_rect()
        print("after get_rect", self.rect.x, self.rect.y)
        



RE: Sprite image.get_rect() moves sprite to 0, 0 - Windspar - Dec-13-2019

Any time you get rect from an image. It will always be Rect(0, 0, width, height).
Just use rect.center before you update it.
self.rect = self.image.get_rect(center=self.rect.center)



RE: Sprite image.get_rect() moves sprite to 0, 0 - michael1789 - Dec-13-2019

Thanks, got it. It seems broken in 10 other ways, but at least my sprite moves now! Moves all wrong, but it moves lol.