图片在 Pygame 中没有移动

Image doesn't move in 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)

您已覆盖 Sprite.draw 方法。

正常方法,如文档所述,"uses the Sprite.image attribute for the source surface, and Sprite.rect for the position"。

在您的 Alien 子类中,您没有使用它,而是使用 xy 属性,它们也可能有效,因为这就是您到处都在修改:

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

但是你的 Actor 子类也不使用 ,它只是在 (width/2, height - 40):

的固定位置 blits 到屏幕
def draw(self, screen):
    screen.blit(self.image, (width/2, height - 40))

因此,无论您更改什么属性,您总是会在同一位置绘制。

我不确定你为什么要覆盖 draw 这两个 类。我也不确定为什么 Alien 继承自 Sprite 但随后使用 xy 属性而忽略 rect,而 Actor 继承自Alien 但在再次使用 rect 时忽略 xy。这几乎肯定会让您感到困惑。但是如果你想要尽可能小的改变:

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

当然你还需要在启动时设置self.rect到初始起始位置,防止用户一直跑到屏幕边缘等等。而且,再一次,最好将其清理干净,以免一开始就造成混淆。但这应该可以帮助您入门。