У меня проблемы с атрибутами, прикрепленными к классу pygame.sprite при их использовании в функциях - PullRequest
1 голос
/ 26 марта 2020

Итак, я обновил некоторый код, используя pygame.sprite и создав функцию для обработки всего рисунка. Если вы видите код ниже, я пытаюсь создать шутер, игрок стреляет пулями в направлении курсора и пытается поразить цели. Функция 'motion ()' предназначена для того, чтобы делать то, что говорится на жестяной банке, заставляя цели двигаться каждый раз, когда обновляется экран, увеличивая значение self.rect.x на 0,5. Я вызвал функцию внутри другой функции (refresh_window () '. Функция refresh_window ()' просто обрабатывает все рисование. Однако когда я запускаю игру, цели не двигаются. Я не получаю ошибок или чего-то еще, я догадался потому что self.rect.x в 'motion ()' не является глобальным, но когда я попытался сделать его глобальным, я получил сообщение об ошибке:

File "main.py", line 60
    global item.rect.x
               ^
SyntaxError: invalid syntax

В любом случае, я пытаюсь увидеть проблему с код, так что если вы можете увидеть проблему, пожалуйста, укажите на это, это будет высоко ценится. Ура.

class Target(pygame.sprite.Sprite):
    def __init__(self, width, height, offset, threshold):
        pygame.sprite.Sprite.__init__(self, target_sprites)
        self.image = pygame.Surface([width, height])
        self.image = target_img
        self.rect = self.image.get_rect()
        self.rect.center = (self.rect.x + 50, self.rect.y + offset)


target_sprites = pygame.sprite.Group()

target_1 = Target(100, 100, 100, 0)
target_2 = Target(100, 100, 300, 1000)
target_3 = Target(100, 100, 200, 2000)

#Function to make targets move each time screen refreshes.
def movement():
  global item.rect.x
  for item in target_sprites:
    item.rect.x += 0.5
    return


#Creating a function which will deal with redrawing all sprites and updating the screen.
def refresh_window():
  window.blit(bgr, (0,0))

  player_sprites.draw(window)
  target_sprites.draw(window)
  movement()
  pygame.display.update()

1 Ответ

1 голос
/ 26 марта 2020

global item.rect.x не имеет никакого смысла вообще. Удалите эту строку и прочитайте о global операторе .


Объекты Target не перемещаются, потому что вы не добавили их в target_sprites. Вы пропустили добавление pygame.sprite.Sprite объектов в pygame.sprite.Group():

target_sprites = pygame.sprite.Group()

target_1 = Target(100, 100, 100, 0)
target_2 = Target(100, 100, 300, 1000)
target_3 = Target(100, 100, 200, 2000)

target_sprites.add([target_1 , target_2, target_3])

или передачу спрайтов в конструктор группы

target_1 = Target(100, 100, 100, 0)
target_2 = Target(100, 100, 300, 1000)
target_3 = Target(100, 100, 200, 2000)
target_sprites = pygame.sprite.Group([target_1 , target_2, target_3])
...