Int объект Python не подписывается
В настоящее время я пытаюсь реализовать свою собственную систему обнаружения столкновений SAT (теорема о разделяющей оси), но столкнулась с проблемой. В строке 34 я получаю это сообщение об ошибке:
строка 34, по оси столкновений = (v[1], -v[0]) TypeError: объект 'int' не может быть подписан
Странно то, что v - это не int, а кортеж.
Вот код
import math
import pygame
WIDTH = 900
HEIGHT = 700
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
def dot(v1, v2):
return v1[0]*v2[0] + v1[1]*v2[1]
polygons = []
class Polygon():
def __init__(self, points):
self.points = points
self.vectors = []
for p1 in range(len(self.points)):
p2 = p1 + 1
if p2 > len(self.points) - 1:
p2 = 0
v = (self.points[p2][0] - self.points[p1][0], self.points[p2][1] - self.points[p1][1])#int object not subscriptable
self.vectors.append(v)
polygons.append(self)
def collision(self):
for p in polygons:
collision = True
if p.points != self.points:
for v in range(len(p.vectors)):
axis = (v[1], -v[0])
selfFirst = True
pFirst = True
for point in self.points:
if selfFirst == True:
selfFirst = False
projection = dot(point, axis)
selfMin = projection
selfMax = projection
else:
projection = dot(point, axis)
if projection < selfMin:
selfMin = projection
elif projection > selfMax:
selfMax = projection
for point in p.points:
if pFirst == True:
pFirst = False
projection = dot(point, axis)
pMin = projection
pMax = projection
else:
projection = dot(point, axis)
if projection < pMin:
pMin = projection
elif projection > pMax:
pMax = projection
if (selfMin > pMin and selfMin < pMax) or (selfMax > pMin and selfMax < pMax):
collision = True
else:
collision = False
return collision
polygon1 = Polygon([(0, 0), (100, 100), (0, 100)])
polygon2 = Polygon([(300, 300), (150, 0), (0, 150)])
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((0,0,0))
for polygon in polygons:
polygon.collision()
pygame.draw.polygon(screen, (0, 255, 0), polygon.points, 1)
pygame.display.flip()
clock.tick(60)
pygame.display.quit()
Проблема на линии 34
2 ответа
Итак v
внутри вашего цикла есть целое число, и нет смысла обращаться к первой / второй позиции целого числа (это то, что вы делаете, когда v[1], -v[0]
вещь) следовательно, вы получаете эту ошибку о подписных вещей.
В:
for v in range(len(p.vectors)):
axis = (v[1], -v[0])
range
возвращает список целых чисел, потому что вы передали ему другое целое число в качестве параметра (len(p.vectors)
). Не знаю что p.vectors
это, я полагаю, это список объектов v
которые могут иметь позиции 0
а также 1
на них, так что, возможно, это будет работать:
for v in p.vectors:
axis = (v[1], -v[0])
Это наглядный урок по именованию переменных.
В строке 27 вы назначаете v
в __init__()
чтобы:v = (self.points[p2][0] - self.points[p1][0], self.points[p2][1] - self.points[p1][1])
Затем в цикле вы переназначаете его и перебиваете предыдущее назначение:for v in range(len(p.vectors)):
len()
возвращает целое число и range()
возвращает список целых чисел. Так с каждой петлей v
назначается целое число из этого диапазона. следовательно v
теперь является целым числом и не подлежит подписке.
Может быть что-то вроде:for v in p.vectors:
будет работать лучше для вас.