Я пытаюсь сделать этот спрайт Button
интерактивным. Он появляется после того, как игрок достиг цели, и после щелчка по нему спрайт должен исчезнуть для новой карты. Я также сделаю так, чтобы после щелчка по спрайту загружался новый уровень, но пока давайте оставим его при выполнении щелчка по спрайту и возникновению чего-либо из-за этого.
Вот интересующий код:
class Button(pg.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites, game.buttons
pg.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.image = pg.Surface((450, 335))
self.image = game.alert_img
self.rect = self.image.get_rect()
self.x = x
self.y = y
self._layer = 2
self.rect.x = x * TILESIZE
self.rect.y = y * TILESIZE
def events(self):
# catch all events here
for event in pg.event.get():
if event.type == pg.QUIT:
self.quit()
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
self.quit()
if event.key == pg.K_LEFT:
self.player.move(dx=-1)
if event.key == pg.K_RIGHT:
self.player.move(dx=1)
if event.key == pg.K_UP:
self.player.move(dy=-1)
if event.key == pg.K_DOWN:
self.player.move(dy=1)
if event.type == pg.USEREVENT + 1:
self.text_object.kill()
self.text_object = Text((1760, 570), self.player.actions, self.font)
self.all_sprites.add(self.text_object)
Button(self, self.player.x -1.5, self.player.y - 2.4)
Имейте в виду, что события находятся в основном классе, а кнопка класса, ну, явно нет. Я хочу сказать, что события def не относятся к классу кнопок.
РЕДАКТИРОВАТЬ Оба варианта ниже работают, однако его ответ больше подходит для моего личного проекта, где мое решение может быть более подходящим для вас, в зависимости от того, что вы пытаетесь выполнить. Советую просмотреть оба.
Game
атрибутself.button = None
и назначил бы экземпляр кнопки этому атрибуту, когда цель будет достигнута. Сложная часть - проверить наличие столкновений с положением мыши из-за смещения камеры. Попробую придумать решение и выложу позже. - person skrx   schedule 20.09.2017pygame.event.clear()
, чтобы очистить кеш событий.event = pygame.event.wait()
для ожидания события в кэше событий. А потом что-то в этом родеelif event.type == KEYDOWN: if event.key = K_f: do something...
- person K. Groot   schedule 20.09.2017