Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как узнать с какой стороны два спрайта пересекаются PYGAME

Всеволод Носов Ученик (111), на голосовании 19 часов назад
есть два куба, нужно узнать с какой стороны они соприкасаются.

 import pygame as pg 

pg.init()

icon = pg.image.load('textures/icons/pizza_food_icon.png')

HIGHT = 800
WIDTH = 1000
FPS = 60

SCREEN = pg.display.set_mode((WIDTH, HIGHT))
pg.display.set_caption('Cube')
pg.display.set_icon(icon)
clock = pg.time.Clock()

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)

gradient_list = []

file = open("textures/gradient", "r")
lines = file.readlines()
file.close()

for line in lines:
numbers = list(map(int, line.split()))
gradient_list.append((numbers[0], numbers[1], numbers[2]))

def gradient(last_color, color_step):
return gradient_list[gradient_list.index(last_color) + color_step]

class Cube(pg.sprite.Sprite):
def __init__(self, x, y, width, hight, speedx, speedy, color, alpha, color_step = 0, alpha_step = 0, shadow_alpha_step = 5, is_shadow = False):
pg.sprite.Sprite.__init__(self)
self.hight = hight
self.width = width
self.speedx = speedx
self.speedy = speedy

self.color = color
self.color_step = color_step
self.alpha = alpha
self.alpha_step = alpha_step

self.shadow_alpha_step = shadow_alpha_step
self.is_shadow = is_shadow

self.image = pg.surface.Surface((width, hight))
self.image.fill(self.color)

self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y

def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy

if self.rect.x + self.width > WIDTH:
self.rect.x = WIDTH - self.width
self.speedx *= -1
if self.rect.x < 0:
self.rect.x = 0
self.speedx *= -1

if self.rect.y + self.hight > HIGHT:
self.rect.y = HIGHT - self.hight
self.speedy *= -1
if self.rect.y < 0:
self.rect.y = 0
self.speedy *= -1

self.color = gradient(self.color, self.color_step)
self.image.fill(self.color)

self.alpha -= self.alpha_step
self.image.set_alpha(int(self.alpha))

if self.alpha <= 0:
self.kill()

if not self.is_shadow:
shadow = Cube(self.rect.x, self.rect.y, self.width, self.hight, 0, 0, self.color, 25, 0, self.shadow_alpha_step, self.shadow_alpha_step, True)
cubes.add(shadow)

for block in blocks:
if pg.sprite.collide_rect(self, block):
#ЭТО ПРОВЕРКА БУДЕТ ЗДЕСЬ
#ЭТО ПРОВЕРКА БУДЕТ ЗДЕСЬ

class Block(pg.sprite.Sprite):
def __init__(self, x, y, width, hight, color = BLACK):
pg.sprite.Sprite.__init__(self)
self.color = color
self.width = width
self.hight = hight

self.image = pg.surface.Surface((width, hight))
self.image.fill(self.color)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y



cubes = pg.sprite.Group()
cube = Cube(10, 10, 50, 50, 8, 10, YELLOW, 255, 5, 0, 0.1)
cubes.add(cube)

blocks = pg.sprite.Group()
block = Block(450, 350, 200, 200)
blocks.add(block)

run = True
while run:
for event in pg.event.get():
if event.type == pg.QUIT:
run = False

SCREEN.fill((WHITE))

cubes.draw(SCREEN)
cubes.update()

blocks.draw(SCREEN)


pg.display.update()
clock.tick(FPS)
Голосование за лучший ответ
elanc Гуру (2859) 1 месяц назад
Включаем моск и фантазию и просто сравниваем координаты двух объектов! Другого способа, увы, нет!
Всеволод НосовУченик (111) 1 месяц назад
Я это понимаю, но я хз как это проверить.
elanc Гуру (2859) Всеволод Носов, А вам в каком именно виде нужна эта информация? Типа, коллизия по какой-то грани или еще и варианты с несколькими гранями?
elancГуру (2859) 1 месяц назад
А вам в каком именно виде нужна эта информация? Типа, коллизия по какой-то грани или еще и варианты с несколькими гранями?
elancГуру (2859) 1 месяц назад
 if self.rect.x < block.rect.x:
print('коллапсируем по левому краю')
else:
print('коллапсируем по правому краю')
if self.rect.y < block.rect.y:
print('коллапсируем сверху')
else:
print('коллапсируем снизу')
Всеволод НосовУченик (111) 1 месяц назад
я хочу что бы блок отскакивал от каждой из сторон
elanc Гуру (2859) Всеволод Носов, тогда мой предыдущий листинг кода вам подойдет.. правда, это кроме случаев коллапса на вершинах и при обновлении через промежутки времени, когда возможно «проникновение» двух объектов друг в друга..
Всеволод НосовУченик (111) 1 месяц назад
это можно не учитывать
Похожие вопросы