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

6

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

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

<code>#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()
</code>

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

Ваш Ответ

4   ответа
0

Таким образом, вы должны создать функцию с именем 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, СИНИЙ, ЦИАН, «Пуск»)

0

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

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 или что-то еще после него, а имя должно быть в кавычках. Параметр координаты в Buttonify - это верхняя правая координата на экране или в окне, которое открывается из pygame. Поверхность это вещь:

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

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

Следующий фрагмент кода создает «изображение»; кортеж обоих «изображений»; и 'imagerect.'

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

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

0

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

12

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

  1. Make a Button class, with the text to go on the button as a constructor argument
    1. Create a PyGame surface, either of an image or filled Rect
    2. Render text on it with the Font.Render stuff in Pygame
  2. Blit to game screen, save that rect.
  3. Check, on mouse click, to see the mouse.get_pos() matches a coord in the rect that it returned by the blit of the button to the main surface.

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

Error: User Rate Limit Exceeded user1334014

Похожие вопросы