Как изменить часть дисплея, когда я нажимаю кнопку, сделанную в Pygame? - PullRequest
0 голосов
/ 01 мая 2020

Я делаю игру, используя Pygame. Это игра в защиту башни, где на фиксированном экране будет 2 штаба на противоположных концах. Игрок может развернуть башни и обучить войска. У меня есть 2 кнопки - войска и башни в нижней части экрана, размещенные на панели (в основном прямоугольник, нарисованный в нижней части экрана, который содержит обе кнопки). Я хочу отобразить доступные войска, когда пользователь нажимает на кнопку войска. Я не могу удалить кнопку войск и башен и заменить их желаемыми результатами на той же панели.

Это мой класс кнопок

class Button:
    def __init__(self, color, x, y, width, height, text=''):
        self.color = color
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.text = text

    def draw(self, win, outline=None):

        # Call this method to draw the button on the screen
        if outline:
            pygame.draw.rect(win, outline, (self.x - 2, self.y - 2, self.width + 4, self.height + 4), 0)

        pygame.draw.rect(win, self.color, (self.x, self.y, self.width, self.height), 0)

        if self.text != '':
            font = pygame.font.SysFont('comicsans', 40)
            text = font.render(self.text, 1, (0, 0, 0))
            win.blit(text, (
                self.x + (self.width / 2 - text.get_width() / 2), self.y + (self.height / 2 - text.get_height() / 2)))

    def isOver(self, pos):
        # Pos is the mouse position or a tuple of (x,y) coordinates
        # pos[0] = x position of mouse
        # pos[1] = y position of mouse
        # self.x = left part of the button
        # self.x + self.width = right side of the button
        # same principle with the y axis of the button which generates the position and size of the button

        if self.x < pos[0] < self.x + self.width:
            if self.y < pos[1] < self.y + self.height:
                return True

Это моя основная игровая функция

def main():
    run = True
    fps = 90
    troops = Button((59, 255, 140), 340, 610, 150, 80, text = "Troops")
    towers = Button((59, 255, 140), 510, 610, 150, 80, text = "Towers")
    mx, my = pygame.mouse.get_pos()
    pos = (mx, my)
    while run:

        screen.fill((50, 168, 66))

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

            pygame.draw.rect(screen, (201, 142, 47), (0, 600, 1000, 100))
            pygame.draw.line(screen, (0, 0, 0), (500,0), (500, 600))
            troops.draw(screen)
            towers.draw(screen)
            over_troops()
            over_towers()

Это моя функция для изменения цвета кнопки, когда мышь нажимает над кнопкой "башни". У меня есть аналогичная функция для войск

def over_towers():

    towers = Button((59, 255, 140), 510, 610, 150, 80, text = "Towers")
    mx, my = pygame.mouse.get_pos()
    mouse_pos = (mx, my)
    if towers.isOver(mouse_pos):
        towers = Button((0, 255, 0), 510, 610, 150, 80, text="Towers")
        towers.draw(screen)

    else:
        towers = Button((59, 255, 140), 510, 610, 150, 80, text="Towers")
        towers.draw(screen)

Мне нужна помощь для отображения доступных предметов, когда пользователь нажимает на кнопку войска или башни (на той же панели)

1 Ответ

1 голос
/ 03 мая 2020

Прежде всего, вам не нужно создавать новый экземпляр класса кнопки каждый кадр, достаточно одного раза. если вы сделаете класс кнопки способным делать все, тогда станет легко делать что угодно.

У вас есть over_towers(), чтобы посмотреть, нажата ли мышь, и нарисуйте кнопку. Переместим это к классу кнопок.

Классу кнопок понадобится новый параметр для цвета, когда мышь наведена, давайте вызовем colour_over

class Button:
    def __init__(self, color, colour_over, x, y, width, height, text=''):
        self.color = color
        self.colour_over

Сейчас в draw() метод, вы можете проверить, если мышь находится над и сделать соответственно

def draw(self, win, click, outline=None): #click is true if click happened

        # Call this method to draw the button on the screen
        if outline:
            pygame.draw.rect(win, outline, (self.x - 2, self.y - 2, self.width + 4, self.height + 4), 0)


        if self.isOver(pygame.mouse.get()): #if mouse is over the button
            color = self.colour_over
            if click:  #if user click on button
                self.action()     #call button action  will get to this later
        else:
            color = self.color
        pygame.draw.rect(win, color, (self.x, self.y, self.width, self.height), 0)



        if self.text != '':
            font = pygame.font.SysFont('comicsans', 40)
            text = font.render(self.text, 1, (0, 0, 0))
            win.blit(text, (
                self.x + (self.width / 2 - text.get_width() / 2), self.y + (self.height / 2 - text.get_height() / 2)))

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

def Troops_button_pressed():
    #do whatever

теперь вам нужно создать кнопку с этим действием

class Button:
    def __init__(self, color, colour_over, x, y, width, height, action, text=''):
        self.action = action

в main(), проверьте на клики

while run:
    click = False
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
       if event.type == pygame.MOUSEBUTTONDOWN: #if click
           click = True

   troops.draw(screen, click)
   towers.draw(screen, click)

Теперь, если пользователь щелкает, кнопка будет вызывать функцию щелчка, с помощью которой вы сможете делать то, что вы хотите, поэтому поместите войска на экран


Чтобы изменить кнопки на войска, Вы можете составить список кнопок и нарисовать их, когда нажата кнопка tr oop

main_button_list = [troops, towers] #the two main buttons
troops_list = [Button((59, 255, 140), 340, 610, 150, 80, action, text = "Troop 1")...]
#do the same for towers_list
button_state = "main" #this decides what buttons appear on the screen

Теперь, когда рисуете

if button_state == "main":
    for button in main_button_list:
        button.draw(screen, click)
elif buton_state == "troops":
    for button in troops_list:
        button.draw(screen,click)
...

для действия кнопок, сделайте основные кнопки изменяют button_state, поэтому

def Troops_button_clicked():
    global button_state     #i hate using global, bad practice but have to use here
    button_state = "troops"

и для каждой кнопки tr oop вы можете сделать функцию для каждого отряда / башни или сделать одну функцию и отправить в качестве параметра кнопку имя, чтобы он знал, что tr oop это

class Button:
    def __init__(self, color, colour_over, x, y, width, height, text='', send_name = False):
        self.send_name = send_name
if click:  #if user click on button
    if self.send_name:
         self.action(self.text)
    else:
        self.action()
def troop_clicked(name):
    #add a troop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...