Как я могу обнаружить столкновение этих прямоугольных объектов?

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

import pygame as pg
import pygame.gfxdraw
import math

pg.init()
windowWidth = 800
windowHeight = 800
surface = pg.display.set_mode((windowWidth, windowHeight))
pg.display.set_caption("Circle")
clock = pg.time.Clock()
black = (0, 0, 0)
white = (255, 255, 255)
gray = (50, 50, 50, 150)
red = (255, 0, 0)


class VerticalCircle(object):
    def __init__(self, posX, posY):
        self.circle_position_x = posX
        self.circle_position_y = posY
        self.radius = 38
        self.v_theta = 0
        self.x = int((self.circle_position_x + (self.radius * math.cos(-self.v_theta))))
        self.y = int((self.circle_position_y + (self.radius * math.sin(-self.v_theta))))

    def draw(self, surface):
        self.x = int((self.circle_position_x + (self.radius * math.cos(-self.v_theta))))
        self.y = int((self.circle_position_y + (self.radius * math.sin(-self.v_theta))))
        pygame.gfxdraw.aacircle(surface, self.circle_position_x, self.circle_position_y, self.radius, white)
        pygame.gfxdraw.filled_circle(surface, self.x, self.y, 2, white)

    def method_circle(self):
        return self.x, self.y


class HorizontalCircle(object):
    def __init__(self, posX, posY):
        self.circle_position_x = posX
        self.circle_position_y = posY
        self.radius = 38
        self.h_theta = 0
        self.x = int((self.circle_position_x + (self.radius * math.cos(self.h_theta))))
        self.y = int((self.circle_position_y + (self.radius * math.sin(self.h_theta))))

    def draw(self, surface):
        self.x = int((self.circle_position_x + (self.radius * math.cos(self.h_theta))))
        self.y = int((self.circle_position_y + (self.radius * math.sin(self.h_theta))))
        pygame.gfxdraw.aacircle(surface, self.circle_position_x, self.circle_position_y, self.radius, white)
        pygame.gfxdraw.filled_circle(surface, self.x, self.y, 2, white)

    def method_circle(self):
        return self.x, self.y


class VerticalLine(HorizontalCircle):
    def __init__(self, Target_Circle):
        self.rect = pg.draw.rect(surface, gray, (Target_Circle.x, 0, 1, 800))
        self.mask = pg.mask.from_surface(surface)

    def draw(self, surface, Target_Circle):
        self.rect = pg.draw.rect(surface, gray, (Target_Circle.x, 0, 1, 800))
        self.mask = pg.mask.from_surface(surface)


class HorizontalLine(VerticalCircle):
    def __init__(self, Target_Circle):
        self.rect = pg.draw.rect(surface, gray, (0, Target_Circle.y, 800, 1))
        self.mask = pg.mask.from_surface(surface)


    def draw(self, surface, Target_Circle):
        self.rect = pg.draw.rect(surface, gray, (0, Target_Circle.y, 800, 1))
        self.mask = pg.mask.from_surface(surface)


h_circle_list = []
v_circle_list = []

h_rect_list = []
v_rect_list = []
x = 120
for i in range(1, 10):
    v_circle = VerticalCircle(40, x)
    v_circle_list.append(v_circle)
    v_circle.draw(surface)

    h_line = HorizontalLine(v_circle)
    h_rect_list.append(h_line)
    h_line.draw(surface, v_circle)

    h_circle = HorizontalCircle(x, 40)
    h_circle_list.append(h_circle)
    h_circle.draw(surface)

    v_line = VerticalLine(h_circle)
    v_rect_list.append(v_line)
    v_line.draw(surface, h_circle)

    x += 80  # offset to place circles

pg.display.update()
loop = 0

run = True
while run:

    clock.tick(160)
    for event in pg.event.get():
        if event.type == pg.QUIT:
            run = False

    if loop == len(h_circle_list):
        loop = 0

    surface.fill(0)
    for i in range(int(len(h_circle_list))):
        h_rect_list[i].draw(surface, v_circle_list[i])
        v_rect_list[i].draw(surface, h_circle_list[i])
        print(pg.sprite.collide_mask(h_rect_list[i], v_rect_list[i]))

        h_circle_list[i].h_theta += .004 + i / 1000
        h_circle_list[i].draw(surface)
        v_circle_list[i].v_theta += .008 + i / 1000
        v_circle_list[i].draw(surface)

    pg.display.update()
    loop += 1

pg.quit()

Я бы посоветовал сначала прочитать немного, может быть, попробуйте поискать в Google обнаружение столкновений прямоугольников. Вы можете сначала подумать о проблеме и попробовать то, что вы придумали. Возьмите бумагу и нарисуйте прямоугольники в разных конфигурациях. Как вы думаете, когда они пересекаются? Что вы знаете о них и что вам нужно знать? Вот ссылка, которая может помочь.   —  person NickP    schedule 31.03.2020

См. также:  Группировка результатов нескольких GROUP_CONCAT() только с различными значениями

Вы имеете в виду не pygame.Rect.colliderect()? Ссылка: https://www.pygame.org/docs/ref/rect.html#pygame.Rect.colliderect   —  person NickP    schedule 31.03.2020

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. NickP

    Вы могли бы создать прямоугольный объект следующим образом:

    surface1 = pygame.image.load('smth.png')
    surface2 = pygame.image.load('smth2.png')
    surface1Rect = surface.get_rect(topleft = x, y)
    surface2Rect = surface.get_rect(topleft = x2, y2)
    

    Затем верните логическое значение, истинно оно или нет

    def Collision():
        return surface1Rect.colliderect(surface2Rect)
    

    И сделай что-нибудь, если это правда

    if Collision():
        print('Do something.')
    
    
    
  2. NickP

    Комментарий Натана, приведенный выше, содержал ответ … в конце концов, мне вообще не нужно было обнаруживать столкновение. У меня уже были места столкновений внутри классов. Все, что мне нужно было сделать оттуда, — это нарисовать в нужных местах.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: