2016-11-04 280 views
0

我目前正试图实现自己的SAT(分离轴定理)碰撞检测系统,但遇到了问题。上线34我收到此错误信息:Python的int对象是不可下标的

line 34, in collision axis = (v[1], -v[0]) TypeError: 'int' object is not subscriptable

奇怪的是v不是一个整数,这是一个元组。

下面的代码

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

for v in range(len(p.vectors)):这是一个int列表,你正在查看的是一个int – Ajurna

+1

哪一行是34?在'v'中有 – furas

+0

你有号码 - 即。 '123' - 所以你试着做'axis =(123 [1],-123 [0])'。也许你需要'axis =(p.vectors [v] [1],-p.vectors [v] [0])' – furas

回答

1

所以你的循环内的v是一个整数,它没有任何意义,以获得一个整数的第一/第二位置(多数民众赞成你什么时候做v[1], -v[0]事情),因此你得到有关可下载的事情的错误。

在:

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

range返回一个整数列表,因为你通过另一个整数作为参数传递给它(len(p.vectors))。真的不知道什么是p.vectors,我认为是obects v可能有位置01对他们的名单,所以那么也许这将工作:

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

这是变量的命名对象的教训。

在第27行,你在__init__()分配v到: 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:会更适合你。