Из приведенного ниже кода я пытаюсь обнаружить столкновение между классами горизонтальных и вертикальных линий. Однако я не знаю, как добавить эту функцию. У меня обычно проблема в том, что атрибут прямоугольника не найден. Мне просто нужен совет о том, что добавить, чтобы определять места столкновений. Спасибо.
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
Вы имеете в виду не pygame.Rect.colliderect()
? Ссылка: https://www.pygame.org/docs/ref/rect.html#pygame.Rect.colliderect — person NickP schedule 31.03.2020
Вы могли бы создать прямоугольный объект следующим образом:
Затем верните логическое значение, истинно оно или нет
И сделай что-нибудь, если это правда
Комментарий Натана, приведенный выше, содержал ответ … в конце концов, мне вообще не нужно было обнаруживать столкновение. У меня уже были места столкновений внутри классов. Все, что мне нужно было сделать оттуда, — это нарисовать в нужных местах.