Статья Автор: Омарбек Нұр-Мұхаммед

Примеры 2

5. Следующий метод - это метод .click(), ответ на вопрос "Что будет, если клавиша пианино нажата?".

class Key(pygame.sprite.Sprite):
    def __init__(self, x, y):
        ...

    def update(self, x, y):
        ...

    def click(self, x, y):
        if self.rect.collidepoint(x, y):
            print(KEYS.index(self))

    def draw(self):
        ...

Т.к. ноты ещё не загружены, то программа просто выводит порядковый номер клавиши в списке клавиш (KEYS: list).

 

В цикл основной программы добавляется новое событие pygame.MOUSEBUTTONDOWN:

...

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        elif event.type == pygame.MOUSEMOTION:
            ...

        elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                x = event.pos[0]
                y = event.pos[1]
                ...

    ...

И для каждого элемента списка применяется метод .click().

 

Результат первых 5 шагов:

  • Клавиши рисуются на экране
  • Анимация применяется для каждой клавиши
  • Программа различает на какую клавишу нажимает пользователь

Загрузка и воспроизведение нот

Звуковые файлы из примера можно скачать здесь. В архиве 8 файлов (8 клавиш = 8 нот):

  • 1.ogg (ДО)
  • 2.ogg (РЕ)
  • 3.ogg (МИ)
  • ...

 

Для создания звукового объекта используется метод pygame.mixer.Sound(), в котором нужно указать путь до звукового файла. Все звуковые объекты можно сохранить в список или в словарь.

   0      1      2      3      4       5     6      7
[1.ogg, 2.ogg, 3.ogg, 4.ogg, 5.ogg, 6.ogg, 7.ogg, 8.ogg]

{
    0: 1.ogg,
    1: 2.ogg,
    2: 3.ogg,
    3: 4.ogg,
    4: 5.ogg,
    5: 6.ogg,
    6: 7.ogg,
    7: 8.ogg
}

КЛЮЧ     - номер клавиши
ЗНАЧЕНИЕ - нота

 

Останется изменить метод .click() и проверить результат. Например:

class Key(pygame.sprite.Sprite):
    def __init__(self, x, y):
        ...

    def update(self, x, y):
        ...

    def click(self, x, y):
        if self.rect.collidepoint(x, y):
            index = KEYS.index(self)  # порядковый номер клавиши в списке клавиш
            NOTES[index].play()       # из списка нот берётся звуковой объект и воспроизводится

    def draw(self):
        ...

 

Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать