pygame.sprite.LayeredUpdates.move_to_front() не работает

avatar
Lyric Crayon
28 сентября 2021 в 16:35
242
1
1

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

pygame.sprite.LayeredUpdates.move_to_front(cursor_img).

Но это выдает мне эту ошибку:

Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/PythonProjects/pythonProjects/game/main.py", line 50, in <module>
    pygame.sprite.LayeredUpdates.move_to_front(cursor_img)
TypeError: move_to_front() missing 1 required positional argument: 'sprite'

Я думаю, что он также хочет, чтобы я передал аргумент 'я', но я не знаю, что ему передать. Любая помощь? Спасибо!

Источник

Ответы (1)

avatar
Rabbid76
28 сентября 2021 в 16:43
0

pygame.sprite.LayeredUpdates is a Group object that manages pygame.sprite.Sprite objects.
pygame.sprite.LayeredUpdates.move_to_front is a Объекты метода. Аргумент pygame.sprite.LayeredUpdates.move_to_front должен быть объектом pygame.sprite.Sprite, содержащимся в группе Group:

.

Переносит спрайт на передний план, изменяя слой спрайта на самый верхний слой

Поэтому необходимо создать Группу

layered_group = pygame.sprite.LayeredUpdates()

Содержит объекты pygame.sprite.Sprite. В следующем my_sprite находится объект pygame.sprite.Sprite:

layered_group.layered_group.add(my_sprite)

Затем вы можете связать спрайт со слоем и вывести слой на передний план:

cursor_layer = 1
layered_sprites.change_layer(my_sprite, cursor_layer)
layered_group.move_to_front(my_sprite)

Минимальный пример:

import pygame

pygame.init()
window = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()

obstacle = pygame.sprite.Sprite()
obstacle.image = pygame.Surface((50, 50))
obstacle.image.fill((128, 128, 128))
obstacle.rect = obstacle.image.get_rect(center = (140, 140))

player = pygame.sprite.Sprite()
player.image = pygame.Surface((50, 50))
player.image.fill((255, 0, 0))
player.rect = obstacle.image.get_rect(center = (160, 160))

layered_sprites = pygame.sprite.LayeredUpdates([player, obstacle])
layered_sprites.change_layer(player, 1)
layered_sprites.change_layer(obstacle, 2)

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                layered_sprites.move_to_front(player)
            if event.button == 3:
                layered_sprites.move_to_front(obstacle)

    window.fill(0)
    layered_sprites.draw(window)
    pygame.display.flip()

pygame.quit()
exit()