Я делаю платформер, в котором есть движущиеся платформы. У меня это так, где вы можете ввести несколько параметров для настройки платформы. Однако я продолжаю получать эту ошибку, которую я не могу исправить. Полная ошибка внизу. Я также думаю, что проблема может быть где-то в нижней части раздела обновлений, где используется «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'
__init__
. На самом деле это не связано с pygame, а с классами в целом. - person Valentino   schedule 09.08.2019__init__
MovingPlatform, а затем вы используете его в обновлении. Вот почему он называется NoneType; он ни на что не установлен. Возможно, назначьте его, передав объект уровня в качестве параметра функции__init__
MovingPlatform. - person SnootierBaBoon   schedule 09.08.2019level.world_shift
) из чего-то, что не имеет этой переменной (например, int). Вы не можете ожидать, что целое число будет иметь элементworld_shift
. Я не могу сказать, что именно происходит из ограниченного кода. Это поможет, если вы добавите больше кода. - person SnootierBaBoon   schedule 09.08.2019levels = [Level01(), Level02()]
. Затем вы можете выполнитеlevels[self.level].world_shift
, чтобы получить значениеworld_shift
фактического объекта уровня, которое соответствует целому числу уровня в self.level.В качестве альтернативы вы можете установить для self.level значение level[integer] вместо того, чтобы устанавливать его в целое число, где целое число — это то, что вы изначально установите его. - person SnootierBaBoon   schedule 09.08.2019self.level = None
. - person SnootierBaBoon   schedule 09.08.2019