@Span4ev

Как передать в обработку событий экземпляр класса из группы?

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

Прошу прощения. В редакторе всё ровно, а здесь некоторые отступы "поплыли" и текст съехал.
import pygame as pg
import time, random, sys
from pygame.sprite import Group
from pygame.sprite import Sprite

class Settings:
	def __init__(self):

		# Список цветов
		self.WHITE			= (255, 255, 255)
		self.YELLOW			= (255, 255, 102)
		self.BLACK		 	= (0, 0, 0)
		self.RED 			= (213, 50, 80)
		self.GREEN 		 	= (0, 255, 0)
		self.BLUE 			= (50, 153, 213)
		self.COLOR_LIST 		= [self.WHITE, self.YELLOW, self.BLACK, self.RED, self.GREEN, self.BLUE] 

		# Параметры шрифта
		self.FONT			= 'Tahoma'
		self.FONT_SIZE			= 40
		self.FONT_COLOR			= 'black'
		
		# Параметры экрана
		self.SCREEN_WIDTH 		= 500
		self.SCREEN_HEIGHT 		= 500
		self.DISPLAY 		= self.SCREEN_WIDTH, self.SCREEN_HEIGHT
		self.BG_COLOR 		= (230, 230, 230)
		self.FPS 			= 10

		# Параметры блока
		self.SIZE 		     = 100
		self.BLOCK_COLOR 	= 'red'
		self.BLOCK_BORDER_WIDTH 	= 6

class Block(Sprite):

	def __init__(self, screen, settings, new_number, new_color):
		super().__init__()

		self.screen 		= screen
		self.settings 		= settings
		self.screen_rect 		= self.screen.get_rect()
		self.rect 		        = pg.Rect(0, 0, settings.SIZE, settings.SIZE)
		self.border_width 		= settings.BLOCK_BORDER_WIDTH

		self.new_number 		= str(new_number)
		self.new_color 		= new_color
		self.font_style 		= pg.font.SysFont(self.settings.FONT, self.settings.FONT_SIZE)
		self.number 		= self.font_style.render(self.new_number, True, self.settings.FONT_COLOR)
		self.number_rect  		= self.number.get_rect()
		
		self.block_moving 		= False

	def print_numbers(self):

		self.number_rect.center = self.rect.center
		self.screen.blit(self.number, self.number_rect)

		if self.block_moving:
			print(1223423)

	def draw_block(self):
		""" Отрисовка каждого блока """
		pg.draw.rect(self.screen, self.new_color, self.rect, width=self.border_width)


def check_events(screen, blocks):
	for e in pg.event.get():
		if e.type == pg.QUIT or e.type == pg.KEYDOWN and e.key == pg.K_ESCAPE:
			sys.exit()
			pg.quit()

		if e.type == pg.MOUSEBUTTONDOWN and e.button == 1:
			# print(e.pos)
			block_moving = True

		if e.type == pg.MOUSEBUTTONUP and e.button == 1:
			# print(e.pos)
			block_moving = False
			# block.click = block.rect.collidepoint(e.pos)

def create_blocks(screen, settings, blocks):

	# Кол-во строк и столбцов для блоков
	rows = settings.SCREEN_WIDTH // settings.SIZE
	cols = settings.SCREEN_HEIGHT // settings.SIZE
	x = 0 # Временные переменные для координат блоков
	y = 0

	get_new_numbers = [] 		 # Список с текущими цифрами для распечатки
	positions  = [] 			         # Список с координатами для расположения блоков
	current_numbers_amount = 5  # Сколько сейчас доступно цифр. Вначале от 2 до 32
	start_numbers = 2 			 # Первая цифра это 2

	# Возвести цифры в квадрат и добавить в список
	for num in range(current_numbers_amount):
		get_new_numbers.append(start_numbers)
		start_numbers *= 2

	# Напечатать блоки
	for i in range(rows):
		for k in range(cols):
			x = i
			y = k
			x *= settings.SIZE
			y *= settings.SIZE

			# Добавление новых координат в список с координатами
			new_list = []
			new_list.append(x)
			new_list.append(y)
			positions.append(new_list)

			# Получение рандомного числа из списка
			new_number = random.choice(get_new_numbers)
			new_color  = random.choice(settings.COLOR_LIST)

			# Создать экземпляр класса, присвоить ему координаты и добавить его в группу
			block = Block(screen, settings, new_number, new_color)
			block.rect.x = x
			block.rect.y = y
			blocks.add(block)

def update_screen(screen, settings, blocks):

	screen.fill(settings.BG_COLOR)
	check_events(screen, blocks)

	# Каждый спрайт нарисовать и распечатать число
	for block in blocks.sprites():
		block.draw_block()
		block.print_numbers()

	pg.display.update()

def start():

	pg.init()

	settings = Settings()
	clock = pg.time.Clock()

	screen = pg.display.set_mode((settings.DISPLAY))
	screen_rect = screen.get_rect()

	blocks = Group()

	# Создаю один раз вне цикла
	create_blocks(screen, settings, blocks)

	while True:
		
		update_screen(screen, settings, blocks)
		clock.tick(settings.FPS)
start()


Не понимаю, как в функцию def check_events передать не группу Blocks, Block - экземпляр класса. Я его создаю в цикле, в функции create_blocks, и в ней же получаю 2 параметра, которые передаю конструктору класса Block:

# Получение рандомного числа из списка
new_number = random.choice(get_new_numbers)
new_color  = random.choice(settings.COLOR_LIST)


То есть я не могу создать таким образом экземпляр класса вне функции (условно, не меняя структуру функций), а именно с имеющейся структурой, потому что тогда из другого места придётся передавать в неё 2 параметра (рандомное число и цвет). Из цикла не получилось вызывать функцию проверки событий. Целый день сижу, не понимаю, как это реализовать.
На всякий случай повторю проблему: хочу сделать контроль столкновений, чтобы можно было перетягивать блоки друг на друга. Блоки - спрайты в группе. Группу в функцию с проверкой событий я могу передать, но не могу передать экземпляр класса, чтобы работать с конкретными экземпляром (блоком), когда случится событие мыши.
  • Вопрос задан
  • 70 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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