图像不会在Pygame中移动

时间:2015-05-24 22:28:55

标签: python pygame

请,我的Pygame图像不会移动但是当我更改要打印的代码并按下箭头键时,它确实有效。任何帮助将不胜感激。我在原始代码中导入了OS,随机和pygame,并将宽度和高度设置为800,600

class Alien(pygame.sprite.Sprite):
    def __init__(self,speed, size):
        self.x = random.randrange(0,width)
        self.y = random.randrange(-200, -20)
        self.size = random.randint(3, 20)
        self.speed = speed

    def move_down(self):
        self.y += self.speed

    def draw(self, screen, colour):
        pygame.draw.circle(screen, colour, (self.x, self.y), self.size)

    def check_landed(self):
        if self.y > height:
            self.x = random.randrange(0,width)
            self.y = random.randrange(-400, -20)
            self.speed = random.randrange(1,4)


class Actor(Alien):
    def __init__(self, filename):
        self.score = 0
        self.image = pygame.image.load(os.path.join("../images", filename)).convert_alpha()
        self.rect = self.image.get_rect()

    def move(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            self.rect.centerx -= 10
            print("let")

        elif keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            self.rect.centerx += 10

    def draw(self, screen):
        screen.blit(self.image, (width/2, height - 40))

在主要游戏实施中,我有

enemies = []
actor = Actor("ship.jpg")

for i in range (20):
    aliens = Alien(2, 4)
    enemies.append(aliens)

done = False
while done == False:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    screen.fill(white)
    actor.x = 500
    actor.y = 500
    actor.draw(screen)
    actor.move()

    for i in range(len(enemies)):
        enemies[i].draw(screen, red)
        enemies[i].move_down()
        enemies[i].check_landed()

    pygame.display.flip()
    clock.tick(30)

1 个答案:

答案 0 :(得分:1)

您已覆盖Sprite.draw方法。

正常方法,正如文档所说,"使用Sprite.image属性作为源表面,使用Sprite.rect作为位置"。

在您的Alien子类中,您没有使用它,但您改为使用xy属性,这些属性也可能有效,因为#39; s你在任何地方修改的内容:

def draw(self, screen, colour):
    pygame.draw.circle(screen, colour, (self.x, self.y), self.size)

但是您的Actor子类没有使用 ,只是在(width/2, height - 40)的固定位置点击屏幕:

def draw(self, screen):
    screen.blit(self.image, (width/2, height - 40))

所以,无论你改变什么属性,你总是会在同一个位置画画。

我不确定为什么你会为这两个类中的任何一个重写draw。我还不确定为什么Alien继承自Sprite但后来使用xy属性而忽略rect,而Actor继承自Alien,但在再次使用x时忽略yrect。这几乎肯定会让你感到困惑。但是如果你想要尽可能小的变化:

    screen.blit(self.image, self.rect)

当然,您还需要在启动时将self.rect设置为初始起始位置,并防止用户一直离开屏幕边缘,依此类推。而且,再一次,清理它最好不要混淆。但这应该让你开始。