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: будет работать лучше для вас.

Другие вопросы по тегам