Перемещение треугольника в пигме - PullRequest
2 голосов
/ 28 января 2020

Я пытаюсь заставить треугольник двигаться на экране. Вот класс, который я использовал для определения треугольника.

class Triangle:
    def __init__(self):
        self.points = [[100, 100],  [100, 150], [180, 125]]
        self.color = (180, 255, 100)
        self.speed = 2


    def draw(self):
        pygame.draw.polygon(D, self.color, self.points)

Я хочу быть в состоянии переместить треугольник. Чтобы сделать это, я попытался сделать что-то вроде этого

def move(self):
        keys = pygame.key.get_pressed()

        counter = 0

        if keys[pygame.K_RIGHT]:
            for points in self.points:
                points[0][counter] += self.speed
            counter += 1

Но я продолжаю получать эту ошибку TypeError: 'int' object is not subscriptable. Как бы я решить эту проблему и переместить треугольник? Спасибо

Ответы [ 3 ]

2 голосов
/ 28 января 2020

В функции move вы перебираете список «self.points», поэтому переменная «point», к которой вы пытались добавить, была фактически одной из точек, а не полным списком точек «self.points».

Я думаю, это то, к чему вы стремились:)

def move(self):
    keys = pygame.key.get_pressed()

    counter = 0

    if keys[pygame.K_RIGHT]:
        for points in self.points:
            self.points[counter][0] += self.speed
        counter += 1

Еще один хороший способ сделать это с помощью перечисления.

def move(self):
    keys = pygame.key.get_pressed()

    if keys[pygame.K_RIGHT]:
        for point_index,point in enumerate(self.points): 
            self.points[point_index][0] += self.speed
2 голосов
/ 28 января 2020

Как все уже ответили, проблема в том, что код перебирает список списков, где внешний список просто содержит три точки треугольника. Итак, points[0] - это список [100, 100], points[1] - это [100, 150] и т. Д. c. Ваш код терпит неудачу, потому что points[0][counter] является только «правильным» для счетчика <3. Как только счетчик превышает количество точек, код не выполняется. </p>

Вы, вероятно, имели в виду:

for point in self.points:
    # point is a co-ordinate: [ x, y ]
    point[0] += self.speed   # update x-coordinate of each point

Я думаю, что было бы лучше добавить функцию move() в ваш класс Triangle, сохраняя код внутреннего обновления внутри класса:

class Triangle:
    # ...

    def move( self, x_change, y_change ):
        """ Move each triangle point by x_change and y_change, at self.speed """
        for i, point in enumerate( self.points ):
            x, y = point
            new_x = x + ( x_change * self.speed )
            new_y = y + ( y_change * self.speed )
            self.points[i] = [ new_x, new_y ]

Это позволяет простому движущемуся вызову обрабатывать нажатие клавиши, а также диагональные перемещения.

# Movement keys
keys = pygame.key.get_pressed()
if ( keys[pygame.K_UP] ):
    tri.move( 0, -1 )
if ( keys[pygame.K_DOWN] ):
    tri.move( 0,  1 )
if ( keys[pygame.K_LEFT] ):
    tri.move( -1, 0 )
if ( keys[pygame.K_RIGHT] ):
    tri.move(  1, 0 )
0 голосов
/ 28 января 2020

Посмотрите на свою структуру данных; Вы злоупотребили этим.

    self.points = [[100, 100],  [100, 150], [180, 125]]
    ...
    for points in self.points:
        # For the first iteration, points = [100, 100]
        points[0][counter] += self.speed

points[0] - это целое число 100. 100 [counter] - недопустимая операция, вызывающая сообщение об ошибке. Я не могу сказать вам, как это исправить, потому что не совсем понятно, что вы пытаетесь сделать с этим кодом. Есть много примеров того, как переместить объект в PyGame.

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