Как запрограммировать цикл прогулок в Pygame - PullRequest
3 голосов
/ 03 апреля 2019

Я работаю над игрой в Pygame и хотел бы запрограммировать цикл ходьбы.Как мне это сделать?

Я делаю эту игру для игрового джема и повторно использую некоторый код из учебника, через который я прошел.Код должен быть откорректирован настолько, насколько это необходимо, но мой код не будет работать.

def draw(self, win):
    pygame.draw.rect(win, (255, 0, 0), [self.x, self.y, self.width, self.height])
    if self.walkCount + 1 >= 20:
        self.walkCount = 0

    walkDown = [pygame.image.load("sprites/MaleMCWalkF0.png"), 
    pygame.image.load("sprites/MaleMCWalkF1.png"), 
    pygame.image.load("sprites/MaleMCWalkF2.png"), 
    pygame.image.load("sprites/MaleMCWalkF3.png")]
    walkRight = []
    walkLeft = []
    walkUp = []
    if not(self.standing):
        if self.left:
            win.blit(walkLeft[self.walkCount//4], (self.x, self.y))
            self.walkCount += 1
        elif self.right:
            win.blit(walkRight[self.walkCount//4], (self.x, self.y))
            self.walkCount += 1
        elif self.down:
            win.blit(walkDown[self.walkCount//4])
    else:
        if self.right:
            win.blit(walkRight[0], (self.x, self.y))
        else:
            win.blit(walkDown[0], (self.x, self.y))

В результате должна получиться анимация ходьбы, где каждый кадр длится 4 кадра.Однако код возвращает ошибку индекса:

File "/home/runner/classes.py", line 35, in draw
win.blit(walkRight[self.walkCount//4], (self.x, self.y))
IndexError: list index out of range

Как это исправить?

1 Ответ

1 голос
/ 03 апреля 2019

В списке 4 элемента, а self.walkCount постоянно увеличивается.
Вам не нужно вычислять частное self.walkCount, деленное на 4. Вы должны рассчитать остаток от деления на 4. Используйте оператор по модулю (%) вместо интегрального оператора деления (//). См. Двоичные арифметические операции .

Должно быть

walkLeft[self.walkCount % 4]

вместо

walkLeft[self.walkCount // 4]


Не загружайте изображения непрерывно в draw(). Загрузите изображения в конструктор класса и используйте их в методе draw():

, например

__init__(self):

    # [...]

    self.walkDown = [pygame.image.load("sprites/MaleMCWalkF0.png"), 
        pygame.image.load("sprites/MaleMCWalkF1.png"), 
        pygame.image.load("sprites/MaleMCWalkF2.png"), 
        pygame.image.load("sprites/MaleMCWalkF3.png")]

def draw(self, win):

    # [...]


    if not(self.standing):
        if self.left:

            win.blit(self.walkLeft[self.walkCount % 4], (self.x, self.y))

    # [...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...