python - 如何检测这些基于矩形的对象的碰撞?
问题描述
从下面的代码中,我试图检测水平线类和垂直线类之间的碰撞。但是我不知道如何去添加这个功能。我通常会遇到找不到矩形属性的问题。我只需要一些关于添加什么来检测碰撞位置的建议。谢谢。
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()
解决方案
你基本上可以像这样制作一个矩形对象:
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.')
推荐阅读
- python - 使用Python按位移位时标识符中的无效字符
- node.js - 如何清除 Watson Assistant 中的所有上下文,例如在“试用”上单击“清除”
- reactjs - 如何使用 react 和 Papaparse 读取和解析 CSV
- javascript - 如何使用 vuejs 删除表中的当前 tr 行
- node.js - 可以使用 execFile 在 nodejs 中运行 curl
- python - 是否有用于在 IIS 上使用进度条在 Django 中上传大文件的配置?
- vim - 从 :Lexplore 在新标签页中打开
- python - 显示响应位置标头,包括是否有问号
- function - 当我的函数提交时,我试图通过 react-router-dom 重定向,但我不断收到此错误
- django - 用于从数据库中检索数据并对该数据进行操作的 Django 视图