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