Как вы перебираете список объектов класса в Python - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь перебрать список объектов класса / объектов модуля, чтобы проверить коллизию, и выдается эта ошибка:

  File "C:/Users/travi/PycharmProjects/game/main.py", line 81, in <module>
if collision.collision1.is_collision(player.player1.vel, player.player1.x1, player.player1.x2, player.player1.y1, player.player1.y2, environmentVector[i].x1, environmentVector[i].x2, environmentVector[i].y1, environmentVector[i].y2):
TypeError: list indices must be integers or slices, not environment

здесь код (из main.py)

    for i in environmentVector:
        if collision.collision1.is_collision(player.player1.vel, player.player1.x1, player.player1.x2, player.player1.y1, player.player1.y2, environmentVector[i].x1, environmentVector[i].x2, environmentVector[i].y1, environmentVector[i].y2):
            print("collision")

environment.py:

import pygame

class environment():
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.x1 = x - 16
        self.x2 = x + 16
        self.y1 = y - 16
        self.y2 = y + 16

collision.py:

import pygame
import player
import enemy
import environment

class collision():
    def __init__(self):
        self.collision = False

    def is_collision(self, moveSpeed, x1, x2, y1, y2, X1, X2, Y1, Y2):
        if (((x2 + moveSpeed >= X1) and (x2 <= X2)) and (((y2 >= Y1) and (y2 <= Y2)) or ((y1 <= Y2) and (y1 >= Y1)))) or (((x1 - moveSpeed <= X2) and (x1 >= X1)) and (((y2 >= Y1) and (y2 <= Y2)) or ((y1 <= Y2) and (y1 >= Y1)))):
            return True
        else:
            return False

1 Ответ

0 голосов
/ 26 ноября 2018
Циклы

Python for являются циклами типа «для каждого», в отличие от традиционных циклов for в C и некоторых других языках.В каждой итерации переменная цикла (i в вашем случае) является следующим элементом в контейнере.Предполагая, что vec является типом std::vector<int>, это в C ++:

for (size_t i = 0; i != vec.size(); ++i){
    std::cout << vec[i] << std::endl;
}

Примерно эквивалентно этому в Python (lst предполагается как list объект):

for i in lst:
    print(i)

Как видите, i - это сам элемент, а не его индекс.

Сказав это, вот как можно исправить цикл for:

for i in environmentVector:
    if collision.collision1.is_collision(player.player1.vel, player.player1.x1, player.player1.x2, player.player1.y1, player.player1.y2, i.x1, i.x2, i.y1, i.y2):
        print("collision")

Обратите внимание, что я заменил environmentVector[i] с просто i с.

Если вам абсолютно необходимы индексы, вы можете использовать перечисление :
(lst снова считается list объектом):

for indx, obj in enumerate(lst):
    print(indx, obj)

Здесь на каждой итерации вы получите индекс, присвоенный indx, а сам объект - obj

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...