简体   繁体   中英

PyGame rect.move movement not functioning properly

I am developing my first pygame application in the form of a brick breaker clone. For the player paddle, I am checking for key holds in the main game loop and then redrawing the player object's sprite every frame, as show in the code snippet below:

class Player():

def __init__(self):
    self.sprite = pg.transform.scale(pg.image.load('49-Breakout-Tiles.png'), (61,16))
    self.rect = self.sprite.get_rect()
    self.rect.right += displayRect.center[0]-25
    self.rect.top += displayRect.center[1]+450
    self.draw(0)

def draw(self, x):
    pg.draw.rect(display, black, (self.rect.x, self.rect.y, 61, 16))
    self.rect.right += x

    if not displayRect.contains(self.rect):
        self.rect.right -= x

    display.blit(self.sprite, self.rect)


#from gameloop
moveNeg, movePos = False, False

while True:
    for event in pg.event.get():
        if event.type == pg.KEYDOWN:
            if event.key == pg.K_LEFT or event.key == pg.K_a:
                moveNeg = True
            if event.key == pg.K_RIGHT or event.key == pg.K_d:
                movePos = True
        if event.type == pg.KEYUP:
            if event.key == pg.K_LEFT or event.key == pg.K_a:
                moveNeg = False
            if event.key == pg.K_RIGHT or event.key == pg.K_d:
                movePos = False

    if moveNeg:
        player.draw(-1)
    if movePos:
        player.draw(1)

This code works fine, and also ensures that the player paddle stays within the display bounds.

However, for the ball object, I am trying to use rect.move(x,y) to move it. I have already tried with rect.right and rect.top but the ball object is still unresponsive. Here is the code I have so far:

class Ball():

def __init__(self):
    self.sprite = pg.transform.scale(pg.image.load('58-Breakout-Tiles.png'), (16, 16))
    self.rect = self.sprite.get_rect()
    self.rect.x += displayRect.center[0]
    self.rect.y += displayRect.center[1]
    self.dir = [random.uniform(-1.0,1.0), random.uniform(-1.0,1.0)]
    print(self.dir)

def draw(self, xy):
    pg.draw.rect(display, black, (self.rect.x, self.rect.y, 16, 16))
    self.rect = self.rect.move(xy[0], xy[1])
    display.blit(self.sprite, self.rect)

The ball is centered when the object is initialised (as shown on lines 3/4 of the __init__ function, but I don't see why this would affect the movement of the ball's rect . Also for clarity, self.dir is used to give the ball a random starting direction, and I am aware that it is able to move upward with this current configuration.

Since I am new to pygame it completely baffles me as to why my logic is flawed so any help is much appreciated. Thanks

pygame.Rect.move doesn't change the Rect object itself, but it returns an new Rect object (Probably the name of the method is misleading).

This means, that

self.rect.move(xy[0], xy[1])

doesn't change anything. You've to assign the rectangle which is returned by .move to "itself":

self.rect = self.rect.move(xy)

Alternatively you can use pygame.Rect.move_ip() , moves the rectangle "in place" and changes the Rect object:

self.rect.move_ip(xy[0], xy[1])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM