Движение PyGame rect.move не работает должным образом - PullRequest
3 голосов
/ 26 марта 2019

Я занимаюсь разработкой своего первого приложения Pygame в форме клона брекера.Для весла игрока я проверяю удержания клавиш в основном игровом цикле, а затем перерисовываю спрайт объекта игрока в каждом кадре, как показано во фрагменте кода ниже:

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)

Этот код работает нормально, а такжегарантирует, что весло игрока остается в пределах экрана.

Однако для объекта мяча я пытаюсь использовать rect.move(x,y) для его перемещения.Я уже пробовал с rect.right и rect.top, но объект ball все еще не отвечает.Вот код, который у меня есть:

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)

Шарик центрируется при инициализации объекта (как показано в строках 3/4 функции __init__, но я не понимаю, почему этоповлияет на движение шара rect. Также для ясности self.dir используется, чтобы дать мячу случайное начальное направление, и я знаю, что он может двигаться вверх с этой текущей конфигурацией.

Поскольку я новичок в Pygame, это полностью сбивает меня с толку, почему моя логика несовершенна, поэтому любая помощь очень ценится. Спасибо

1 Ответ

3 голосов
/ 26 марта 2019

pygame.Rect.move не изменяет сам объект Rect, но возвращает новый объект Rect (возможно, имя метода вводит в заблуждение).

Это означает, что

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

ничего не меняет. Вы должны назначить прямоугольник, возвращаемый .move, «себе»:

self.rect = self.rect.move(xy)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...