Как исправить: AttributeError: объект 'int' не имеет атрибута 'world_shift'

Я делаю платформер, в котором есть движущиеся платформы. У меня это так, где вы можете ввести несколько параметров для настройки платформы. Однако я продолжаю получать эту ошибку, которую я не могу исправить. Полная ошибка внизу. Я также думаю, что проблема может быть где-то в нижней части раздела обновлений, где используется «world_shift». Если кто-то может исправить это, я был бы очень признателен!

class Platform(pygame.sprite.Sprite):

    def __init__(self, sprite_sheet_data):


        super().__init__()


        sprite_sheet = SpriteSheet('tiles_spritesheet.png')


        self.image = sprite_sheet.get_image(sprite_sheet_data[0],
                                            sprite_sheet_data[1],
                                            sprite_sheet_data[2],
                                            sprite_sheet_data[3])

        self.rect = self.image.get_rect()


class MovingPlatform(Platform):

    def __init__(self, sprite_sheet_data):

        super().__init__(sprite_sheet_data)

        self.change_x = 0
        self.change_y = 0

        self.boundary_top = 0
        self.boundary_bottom = 0
        self.boundary_left = 0
        self.boundary_right = 0

        self.player = player

        self.level = level

   def update(self):

        self.rect.x += self.change_x

        self.rect.y += self.change_y

        hit = pygame.sprite.collide_rect(self, self.player)
        if hit:
            if self.change_x < 0:
                self.player.rect.right = self.rect.left
            else:             
                self.player.rect.left = self.rect.right

        hit = pygame.sprite.collide_rect(self, self.player)
        if hit:           
            if self.change_y < 0:
                self.player.rect.bottom = self.rect.top
            else:  
                self.player.rect.top = self.rect.bottom

        if self.rect.bottom > self.boundary_bottom or self.rect.top 
         < self.boundary_top:
            self.change_y *= -1

        cur_pos = self.rect.x - self.level.world_shift  
        if cur_pos < self.boundary_left or cur_pos > 
        self.boundary_right:
            self.change_x *= -1


class Level(object):


    def __init__(self, player):
        self.platform_list = None

        self.platform_list = pygame.sprite.Group()

    def update(self):
        self.platform_list.update()

    def draw(self, screen):

        self.platform_list.draw(screen)


class Level01(Level):

    def __init__(self, player):


        Level.__init__(self, player)

            for block in level_blocks:
            platform = Platform(block[0])
            platform.rect.x = block[1]
            platform.rect.y = block[2]
            platform.player = self.player
            self.platform_list.add(platform)

        block = MovingPlatform(STONE_PLATFORM_MIDDLE)
        block.rect.x = 1350
        block.rect.y = 280
        block.boundary_left = 1350
        block.boundary_right = 1600
        block.change_x = 1
        block.player = self.player
        block.level = self
        self.platform_list.add(block)


def main():
    """ Main Program Loop """

    # Loop until the user clicks the close button.
    done = False

    # Create all the levels
    level_list = [Level01(player)]

    # Sets the current level
    current_level_no = 0
    current_level = level_list[current_level_no]

    # -- Main Loop -- #
    while not done:

        # Updates items in the level
        current_level.update()

        # Goes to the next level if the player completes the current 
          one 
        current_position = player.rect.x + current_level.world_shift
        if current_position < current_level.level_limit:
            player.rect.x = 120
            if current_level_no < len(level_list) - 1:
                current_level_no += 1
                current_level = level_list[current_level_no]
                player.level = current_level

        current_level.draw(screen)

Traceback (most recent call last):
  File "/Users/qingduliu/PycharmProjects/Platformer/Video Game.py", 
line 665, in <module>
main()
  File "/Users/qingduliu/PycharmProjects/Platformer/Video Game.py", 
line 629, in main
current_level.update()
  File "/Users/qingduliu/PycharmProjects/Platformer/Video Game.py", 
line 274, in update
self.platform_list.update()
  File "/Users/qingduliu/Platformer/lib/python3.7/site- 
packages/pygame/sprite.py", line 463, in update
s.update(*args)
  File "/Users/qingduliu/PycharmProjects/Platformer/Video Game.py", 
line 172, in update
cur_pos = self.rect.x - self.level.world_shift
AttributeError: 'int' object has no attribute 'world_shift'

person Blazian444    schedule 08.08.2019    source источник
comment
Добавьте аргументы в метод Platform __init__. На самом деле это не связано с pygame, а с классами в целом.   -  person Valentino    schedule 09.08.2019
comment
Теперь появляется сообщение об ошибке: AttributeError: объект «NoneType» не имеет атрибута «world_shift».   -  person Blazian444    schedule 09.08.2019
comment
Он находится в последних нескольких строках раздела обновления.   -  person Blazian444    schedule 09.08.2019
comment
Не похоже, что вы устанавливаете self.level на что-либо. Для него устанавливается значение None в функции __init__ MovingPlatform, а затем вы используете его в обновлении. Вот почему он называется NoneType; он ни на что не установлен. Возможно, назначьте его, передав объект уровня в качестве параметра функции __init__ MovingPlatform.   -  person SnootierBaBoon    schedule 09.08.2019
comment
Теперь возникает ошибка: AttributeError: объект «NoneType» не имеет атрибута «world_shift»   -  person Blazian444    schedule 09.08.2019
comment
Это связано с последними строками в функции обновления.   -  person Blazian444    schedule 09.08.2019
comment
II вы отредактировали свой код и получили новые ошибки, вы должны обновить свой вопрос как с кодом, так и с полной трассировкой ошибок.   -  person Valentino    schedule 09.08.2019
comment
я отредактировал вопрос   -  person Blazian444    schedule 09.08.2019
comment
Вы устанавливаете self.level на int? Эти ошибки атрибутов возникают, когда вы получаете переменную из класса (например, level.world_shift) из чего-то, что не имеет этой переменной (например, int). Вы не можете ожидать, что целое число будет иметь элемент world_shift. Я не могу сказать, что именно происходит из ограниченного кода. Это поможет, если вы добавите больше кода.   -  person SnootierBaBoon    schedule 09.08.2019
comment
Кроме того, если целое число относится к номеру уровня (например, 1 для уровня 01, 2 для уровня 02), вы можете создать экземпляр этих классов уровней и поместить его в глобальный список, называемый уровнями (выполните levels = [Level01(), Level02()]. Затем вы можете выполните levels[self.level].world_shift, чтобы получить значение world_shift фактического объекта уровня, которое соответствует целому числу уровня в self.level.В качестве альтернативы вы можете установить для self.level значение level[integer] вместо того, чтобы устанавливать его в целое число, где целое число — это то, что вы изначально установите его.   -  person SnootierBaBoon    schedule 09.08.2019
comment
Я установил self.level на уровень, а на реальной платформе я поставил 1, как на первом уровне.   -  person Blazian444    schedule 09.08.2019
comment
Можете ли вы обновить код в вопросе? Я до сих пор не могу сказать, потому что в коде все еще есть self.level = None.   -  person SnootierBaBoon    schedule 09.08.2019
comment
Я сделал 'self.level = level', а также добавил основной цикл на случай, если это поможет   -  person Blazian444    schedule 09.08.2019
comment
Дважды проверьте, что для self.level не задано целое число. Эта ошибка должна появляться только в том случае, если для self.level задано целое число в MovingPlatform, а не экземпляр класса Level() или Level01().   -  person SnootierBaBoon    schedule 09.08.2019
comment
Как установить его в экземпляр класса Level?   -  person Blazian444    schedule 09.08.2019