如何移动形状python

时间:2014-03-31 22:57:31

标签: python shape

我正在尝试在python上移动一个八角形 我错过了什么? 如何使这个形状移动

bif="space.jpg"

import pygame, sys
from pygame.locals import *

points=[(-60,20),(-60,-20),(-20,60),(20,60),(60,20),(60,-20),(20,-60),(-20,60)]
colour=(0,191,255)

pygame.init()

screen=pygame.display.set_mode((1280,800),0,32)
background=pygame.image.load(bif).convert()

for point in points:
    point[-60] += movex
    point[20] += movex

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type==KEYDOWN:
            if event.key==K_LEFT:
                movex=-1
            elif event.key==K_RIGHT:
                movex=+1
            elif event.key==K_UP:
                movey=-1
            elif event.key==K_DOWN:
                movey=+1
        if event.type==KEYUP:
            if event.key==K_LEFT:
                movex=0
            elif event.key==K_RIGHT:
                movex=0
            elif event.key==K_UP:
                movey=0
            elif event.key==K_DOWN:
                movey=0

    x+=movex
    y+=movey

    screen.blit(background,(0,0))

    pygame.draw.polygon(screen,colour,points)

    pygame.display.update()        

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

1)为了能够更改数组点,您需要使用另一个数据结构而不是元组列表,因为元组是不可变的。所以你可以有一个列表,例如:

points=[[-60,20],[-60,-20],[-20,60],[20,60],[60,20],[60,-20],[20,-60],[-20,60]]

2)在这个循环中:

for point in points:
    point[-60] += movex
    point[20] += movex

您正在尝试访问点列表的第60和第20个元素,这些元素会立即引发错误,因为索引超出范围,因为正如我之前所解释的,元组是不可变的,并且您正在尝试更改它们的值。我从上面的代码中理解的是,你想用movex和movey移动每个点。要做到这一点,上面的for循环应该改为:

for point in points:
    point[0] += movex
    point[1] += movey

您还需要在主循环内的键事件下方移动上面的for循环,以使其正常工作。

3)您需要在尝试访问它们之前初始化movexmovey,因此在主循环之外您可以像这样简单地初始化它们:

movex = 0
movey = 0

while True:
    #code

4)在这种状态下,你根本不需要xy变量来移动八边形,因为你可以通过movex和movey变量直接递增每个点。

通过以上所有更改,您的代码现在应如下所示:

bif="alien.png"

import pygame, sys
from pygame.locals import *

points=[[-60,20],[-60,-20],[-20,60],[20,60],[60,20],[60,-20],[20,-60],[-20,60]]
colour=(0,191,255)

pygame.init()

screen=pygame.display.set_mode((1280,800),0,32)
background=pygame.image.load(bif).convert()

movex = 0
movey = 0

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type==KEYDOWN:
            if event.key==K_LEFT:
                movex=-1
            elif event.key==K_RIGHT:
                movex=+1
            elif event.key==K_UP:
                movey=-1
            elif event.key==K_DOWN:
                movey=+1
        if event.type==KEYUP:
            if event.key==K_LEFT:
                movex=0
            elif event.key==K_RIGHT:
                movex=0
            elif event.key==K_UP:
                movey=0
            elif event.key==K_DOWN:
                movey=0

    for point in points:
        point[0] += movex
        point[1] += movey

    screen.blit(background,(0,0))

    pygame.draw.polygon(screen,colour,points)

    pygame.display.update()  

这应该很顺利:) 希望我的回答能帮到你! 欢呼声,

Alex