首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在pygame中移动三角形

在pygame中移动三角形
EN

Stack Overflow用户
提问于 2020-01-28 06:58:53
回答 3查看 326关注 0票数 2

我正试着在屏幕上做一个三角形的移动。这是我用来定义三角形的类。

代码语言:javascript
代码运行次数:0
运行
复制
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)

我希望能够移动三角形。为了做到这一点,我试着这样做

代码语言:javascript
代码运行次数:0
运行
复制
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。我如何解决这个问题并移动三角形呢?谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-28 07:11:29

在函数move中,您正在迭代列表"self.points“,因此您试图添加到的"point”变量实际上只是其中一个点,而不是完整的"self.points“点列表。

我认为这就是您想要的:)

代码语言:javascript
代码运行次数:0
运行
复制
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

另一种很好的方法是使用enumerate。

代码语言:javascript
代码运行次数:0
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-01-28 07:21:29

正如每个人都已经回答的那样,问题是代码正在迭代一个列表列表,其中外部列表只包含三个三角点。因此,points[0]是列表计数器,points[1][100, 150],依此类推。您的代码失败是因为points[0][counter]对于计数器< 3才是“正确的”。一旦计数器大于点数,代码就会失败。

你的意思可能是:

代码语言:javascript
代码运行次数:0
运行
复制
for point in self.points:
    # point is a co-ordinate: [ x, y ]
    point[0] += self.speed   # update x-coordinate of each point

我认为在Triangle类中添加一个move()函数会更好,将内部更新代码保留在类中:

代码语言:javascript
代码运行次数:0
运行
复制
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 ]

这允许一个简单的移动调用来处理按键和对角移动。

代码语言:javascript
代码运行次数:0
运行
复制
# 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 )
票数 1
EN

Stack Overflow用户

发布于 2020-01-28 07:03:43

看看你的数据结构,你滥用了它。

代码语言:javascript
代码运行次数:0
运行
复制
    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。100counter是一个无效的操作,导致您的错误消息。我不能告诉你如何修复这个问题,因为你想用这段代码做什么并不是很清楚。关于如何在PyGame中移动对象,网上有很多例子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59940100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档