0

現在、独自の 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行目

4

2 に答える 2

1

したがって、vループの内側は整数であり、整数の最初/2番目の位置にアクセスするのは意味がありません(これは、v[1], -v[0]物事のときに行うことです)。したがって、添字可能なものについてそのエラーが発生します。

の:

for v in range(len(p.vectors)):
        axis = (v[1], -v[0])

別のrange整数をパラメーターとして渡したため ( len(p.vectors))、整数のリストが返されます。何が何であるかはよくわかりませんが、位置とその上にある可能性p.vectorsのあるオブジェクトのリストであると想定しているため、おそらくこれでうまくいくでしょう:v01

for v in p.vectors:
        axis = (v[1], -v[0])
于 2016-11-04T16:41:48.953 に答える
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:あなたにとってよりうまくいくでしょう。

于 2016-11-04T16:45:12.007 に答える