Как сделать кнопки в python / pygame?

Я делаю игру в pygame, и на первом экране я хочу, чтобы там были кнопки, которые вы можете нажать, чтобы (i) запустить игру, (ii) загрузить новый экран с инструкциями и (iii) выйти из программы.

Я нашел этот код онлайн для создания кнопок, но я не очень понимаю его (я не так хорошо разбираюсь в объектно-ориентированном программировании). Если бы я мог получить какое-то объяснение относительно того, что он делает, это было бы здорово. Кроме того, когда я использую его и пытаюсь открыть файл на своем компьютере, используя путь к файлу, я получаю ошибку sh: filepath: Permission denied, который я не знаю, как решить.

#load_image is used in most pygame programs for loading images def load_image(name, colorkey=None): fullname = os.path.join('data', name) try: image = pygame.image.load(fullname) except pygame.error, message: print 'Cannot load image:', fullname raise SystemExit, message image = image.convert() if colorkey is not None: if colorkey is -1: colorkey = image.get_at((0,0)) image.set_colorkey(colorkey, RLEACCEL) return image, image.get_rect() class Button(pygame.sprite.Sprite): """Class used to create a button, use setCords to set position of topleft corner. Method pressed() returns a boolean and should be called inside the input loop.""" def __init__(self): pygame.sprite.Sprite.__init__(self) self.image, self.rect = load_image('button.png', -1) def setCords(self,x,y): self.rect.topleft = x,y def pressed(self,mouse): if mouse[0] > self.rect.topleft[0]: if mouse[1] > self.rect.topleft[1]: if mouse[0] < self.rect.bottomright[0]: if mouse[1] < self.rect.bottomright[1]: return True else: return False else: return False else: return False else: return False def main(): button = Button() #Button class is created button.setCords(200,200) #Button is displayed at 200,200 while 1: for event in pygame.event.get(): if event.type == MOUSEBUTTONDOWN: mouse = pygame.mouse.get_pos() if button.pressed(mouse): #Button's pressed method is called print ('button hit') if __name__ == '__main__': main() 

Спасибо всем, кто может мне помочь.

  • Анимация вращающегося 3D-графика в matplotlib
  • Pandas - Заменить значения в DataFrame на основе Boollean DataFrame
  • Извлечение слов из строки, удаление знаков препинания и возврат списка с выделенными словами в Python
  • Как найти все позиции максимального значения в списке?
  • Разделить целое число на цифры для вычисления контрольной суммы ISBN
  • Сортировка счетчика частоты слов с использованием python
  • Захват и интерпретация события XI2 RawKeyPress с помощью python
  • Selenium (с python), как изменить стиль css элемента
  • 4 Solutions collect form web for “Как сделать кнопки в python / pygame?”

    У меня нет кода для вас, но я бы это сделал:

    1. Создайте класс Button с текстом, чтобы он включался в качестве аргумента конструктора
      1. Создайте поверхность PyGame, будь то изображение или заполненный Rect
      2. Измените текст на нем с помощью материала Font.Render в Pygame
    2. Blit to game screen, за исключением этого прямоугольника.
    3. Проверьте, щелкнув мышью, чтобы увидеть mouse.get_pos (), соответствует координате в прямоугольнике, которую он возвращает при нажатии кнопки на основную поверхность.

    Это похоже на то, что делает ваш пример, хотя и по-прежнему.

    «Код», который вы нашли в Интернете, не так хорош. Все, что вам нужно сделать, это кнопка. Поместите это рядом с началом вашего кода:

     def Buttonify(Picture, coords, surface): image = pygame.image.load(Picture) imagerect = image.get_rect() imagerect.topright = coords surface.blit(image,imagerect) return (image,imagerect) 

    Поместите следующее в свой игровой цикл. Также где-то в вашем игровом цикле:

     Image = Buttonify('YOUR_PICTURE.png',THE_COORDS_OF_THE_BUTTON'S_TOP_RIGHT_CORNER, THE_NAME_OF_THE_SURFACE) 

    Также поместите это в свой игровой цикл, где бы вы ни делали это for event in pygame.event.get

     if event.type == MOUSEBUTTONDOWN and event.button == 1: mouse = pygame.mouse.getpos if Image[1].collidrect(mouse): #code if button is pressed goes here 

    Таким образом, buttonify загружает изображение, которое будет на кнопке. Это изображение должно быть файлом .jpg или любым другим файлом PICTURE в том же каталоге, что и код. Картинка – это его имя. Имя должно иметь .jpg или что-нибудь еще после него, и имя должно быть в кавычках. Параметр coords в Buttonify – это верхняя правая координата на вашем экране или окне, которое открывается из pygame. Поверхность – это вещь:

     blahblahblah = pygame.surface.set_mode((WindowSize)) /|\ | Surface's Name 

    Таким образом, функция создает нечто, называемое «образ», которое является поверхностью пигмейка, оно помещает вокруг него прямоугольник под названием «imagerect» (чтобы установить его в месте и для второго параметра, когда он блиит), а затем он устанавливает его местоположение и бьет его на второй и последней последней строке.

    Следующий бит кода делает «Image» кортежем как «изображения», так и «imagerect».

    Последний код имеет, if event.type == MOUSEBUTTONDOWN and event.button == 1: основном это означает, что нажата левая кнопка мыши. Этот код ДОЛЖЕН находиться в for event in pygame.event.get . Следующая строка делает мышь кортежем положения мыши. Последняя строка проверяет, столкнулась ли мышь с Image [1], которая, как мы знаем, «imagerect». Код следует за этим.

    Скажи мне, если мне нужно объяснить дальше.

    Таким образом, вы должны создать функцию с именем button, которая получает 8 параметров. 1) Сообщение кнопки 2) Положение X левого верхнего угла кнопки 3) Y положение левого верхнего угла кнопки 4) Ширина кнопки 5) Высота кнопки 6) Неактивный цвет (цвет фона) 7) Активный цвет (цвет при наведении) 8) Название действия, которое вы хотите выполнить

     def button (msg, x, y, w, h, ic, ac, action=None ): mouse = pygame.mouse.get_pos() click = pygame.mouse.get_pressed() if (x+w > mouse[0] > x) and (y+h > mouse[1] > y): pygame.draw.rect(watercycle, CYAN, (x, y, w, h)) if (click[0] == 1 and action != None): if (action == "Start"): game_loop() elif (action == "Load"): ##Function that makes the loading of the saved file## elif (action == "Exit"): pygame.quit() else: pygame.draw.rect(watercycle, BLUE, (x, y, w, h)) smallText = pygame.font.Font("freesansbold.ttf", 20) textSurf, textRect = text_objects(msg, smallText) textRect.center = ( (x+(w/2)), (y+(h/2)) ) watercycle.blit(textSurf, textRect) 

    Поэтому, когда вы создаете игровой цикл, и вы вызываете функцию кнопки:

    («Пуск», 600, 120, 120, 25, ГОЛУБОЙ, CYAN, «Пуск»)

    Вот класс для кнопки, которую я создал много лет назад: https://www.dropbox.com/s/iq5djllnz0tncc1/button.py?dl=0 Эта кнопка является стилем окна 7, насколько я помню, и я не был в состоянии проверить его недавно, потому что у меня нет pygame на компьютере, который я использую. Надеюсь это поможет!

    Python - лучший язык программирования в мире.