Почему параметры объектов одного класса становятся одинаковыми?
Разрабатываю меню игры на Pygame. Создал отдельный класс для кнопки, однако когда я задаю разные параметры 2-м кнопкам через init, а именно позицию кнопок, self-параметры становятся одинаковыми, хотя так не должно быть. В чём может быть проблема? Заранее благодарен.
Код файла с классами:
from copy import deepcopy
import pygame
class Button(object):
def __init__(self, font_size, button_size, string, color=(255, 255, 255), font_name='Pixelify', center=False, button_pos=[0, 0], center_x=0, center_y=0):
self.pos = button_pos
self.size = button_size
self.text = pygame.font.Font(f'fonts/{font_name}.ttf', font_size).render(string, False, color)
self.little_text = pygame.font.Font(f'fonts/{font_name}.ttf', font_size - 3).render(string, False, color)
self.little_text_rect = self.little_text.get_rect(center=[center_x, center_y])
self.main_rect = pygame.Rect(self.pos[0], self.pos[1], self.size[0], self.size[1])
self.little_main_rect = pygame.Rect(self.pos[0] - 2, self.pos[1] - 2, self.size[0] - 4, self.size[1] - 4)
if center:
self.main_rect.center = [center_x, center_y]
self.little_main_rect.center = [center_x, center_y]
self.pos[0] = center_x - button_size[0] // 2
self.pos[1] = center_y - button_size[1] // 2
self.text_rect = self.text.get_rect(center=self.main_rect.center)
self.color = color
self.click = False
def check_click(self, have_click, mouse_pos):
if have_click:
if (self.pos[0] <= mouse_pos[0] <= self.pos[0] + self.size[0]) and (self.pos[1] <= mouse_pos[1] <= self.pos[1] + self.size[1]):
self.click = True
return True
self.click = False
return False
def draw(self, screen):
if self.click:
screen.blit(self.little_text, self.little_text_rect)
pygame.draw.rect(screen, self.color, self.little_main_rect, 5)
else:
screen.blit(self.text, self.text_rect)
pygame.draw.rect(screen, self.color, self.main_rect, 5)
class Text(object):
def __init__(self, string, font_size, color=(255, 255, 255), font_name='Pixelify', center=False, pos=(0, 0), center_x=0, center_y=0):
self.text = pygame.font.Font(f'fonts/{font_name}.ttf', font_size).render(string, False, color)
self.text_rect = None
if center:
self.text_rect = self.text.get_rect(center=[center_x, center_y])
else:
self.text_rect = pos
def draw(self, screen):
screen.blit(self.text, self.text_rect)
Код main.py:
import configparser
from copy import deepcopy
import classes
import pygame
import sys
pygame.init()
frame_size_x = 1000
frame_size_y = 800
main_screen = pygame.display.set_mode((frame_size_x, frame_size_y))
now_screen_type = 'menu'
main_road_img = pygame.image.load('images/main_road.png')
T_road_img = pygame.image.load('images/T road.png')
X_road_img = pygame.image.load('images/X road.png')
road_images = [main_road_img, T_road_img, X_road_img]
main_fps = 60
main_mass = [['-'] * 20 for i in range(14)]
start_button = classes.Button(80, [400, 100], 'Start', center=True, center_x=frame_size_x // 2, center_y=400)
settings_button = classes.Button(80, [400, 100], 'Settings', center=True, center_x=frame_size_x // 2, center_y=550)
menu_interface = {
'texts': [classes.Text('Road game', 84, pos=[100, 40])]
}
def draw_game_background(screen):
screen.fill((0, 0, 0))
for y_ind in range(14):
for x_ind in range(20):
mass_symb = ['-', '+', 'T']
for elem in range(len(mass_symb)):
if main_mass[y_ind][x_ind] == mass_symb[elem]:
screen.blit(road_images[elem], [x_ind * 50, 100 + y_ind * 50])
def menu_checking(have_click, pos=(0, 0)):
start_ans = start_button.check_click(have_click, pos)
settings_ans = settings_button.check_click(have_click, pos)
if start_ans: return 'start'
elif settings_ans: return 'settings'
else: return 'none'
def draw_menu_background(screen):
screen.fill((0, 0, 0))
for text in menu_interface['texts']:
text.draw(screen)
start_button.draw(screen)
settings_button.draw(screen)
def menu_window(screen):
global now_screen_type
menu_screen_type = 'main'
fps_controller = pygame.time.Clock()
while now_screen_type == 'menu':
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
mouse_clicks = pygame.mouse.get_pressed()
mouse_pos = pygame.mouse.get_pos()
menu_checking(mouse_clicks[0], mouse_pos)
draw_menu_background(screen)
pygame.display.update()
fps_controller.tick(main_fps)
def game_window(screen):
global now_screen_type
menu_screen_type = 'main'
fps_controller = pygame.time.Clock()
while now_screen_type == 'game':
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
draw_game_background(screen)
pygame.display.update()
fps_controller.tick(main_fps)
if __name__ == '__main__':
while True:
if now_screen_type == 'menu':
menu_window(main_screen)
elif now_screen_type == 'game':
game_window(main_screen)