如何检测这些基于矩形的对象的碰撞?

问题描述 投票:0回答:2

根据下面的代码,我试图检测水平线和垂直线类之间的冲突。但是我不知道如何添加此功能。我通常会遇到找不到矩形属性的问题。我只需要一些有关添加哪些内容以检测碰撞位置的建议。谢谢。

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()
python pygame collision-detection
2个回答
1
投票

您基本上可以像这样创建一个rect对象:

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)

然后返回布尔值,是否为True

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

如果是真的,就做点什么

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



0
投票

Nathan的上述评论提供了答案。最后,我根本不需要检测到碰撞。我已经在课程中找到了碰撞的位置。我要做的就是在适当的位置绘制。

© www.soinside.com 2019 - 2024. All rights reserved.