2016-11-04 16 views
0

В настоящее время я пытаюсь реализовать свою собственную систему обнаружения столкновений (разделительную ось), но столкнулся с проблемой. В строке 34 я получаю сообщение об ошибке:Объект Python int не подлежит подписке

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

Странная вещь, что 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 в диапазоне (len (p.vectors)): это список int, на который вы смотрите, есть int – Ajurna

+1

, какая строка 34? – furas

+0

в 'v' у вас есть номер - т.е. '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, которые могут иметь позиции 0 и 1 на них, таким образом, то, возможно, это будет работать:

for v in p.vectors: 
     axis = (v[1], -v[0]) 
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: будет работать лучше для вас.

 Смежные вопросы

  • Нет связанных вопросов^_^