python速成课程13-1只显示一行精灵

python速成课程13-1只显示一行精灵,python,pygame,Python,Pygame,我目前正在python速成课程中做一个练习,在那里我有多行星星,我让它们都向下移动到屏幕底部。当我改变设置让星星移到一边时,一切都正常了。然而,当我试图让它们向下移动时,只有一排星星出现在屏幕的最顶端,然后它们向下移动(而整个屏幕上都是向下移动的外星人)。不确定是什么原因导致了这个问题,非常感谢您的帮助和帮助。谢谢大家! 明星队 from star import Star from random import randint class StarGame: def __init__(

我目前正在python速成课程中做一个练习,在那里我有多行星星,我让它们都向下移动到屏幕底部。当我改变设置让星星移到一边时,一切都正常了。然而,当我试图让它们向下移动时,只有一排星星出现在屏幕的最顶端,然后它们向下移动(而整个屏幕上都是向下移动的外星人)。不确定是什么原因导致了这个问题,非常感谢您的帮助和帮助。谢谢大家!

明星队

from star import Star
from random import randint

class StarGame:

    def __init__(self):
        pygame.init()
        self.settings = Settings()
        self.screen = pygame.display.set_mode(
            (0,0), pygame.FULLSCREEN)
        self.settings.screen_width = self.screen.get_rect().width 
        self.settings.screen_height = self.screen.get_rect().height
        pygame.display.set_caption("Star Game")

        self.stars = pygame.sprite.Group()

        self._create_fleet()



    def run_game(self):
        while True:
            self._check_events()
            self._update_stars()
            self._update_screen()

            
    def _create_fleet(self):
        star = Star(self)
        star_width, star_height = star.rect.size
        #star_width += 20
        #star_height += 20
        available_space_x = self.settings.screen_width - (2 * star_width) 
        number_stars_x = available_space_x // (2 * star_width)

        available_space_y = (self.settings.screen_height - 2 * star_height)
        number_rows = available_space_y // (2 * star_height)
        for row_number in range(number_rows):
            for star_number in range(number_stars_x):
                    self._create_star(star_number, row_number)
            
    def _create_star(self, star_number, row_number):
        star = Star(self)
        star_width, star_height = star.rect.size
        star.x = star_width + 2 * star_width * star_number
        star.rect.x = star.x
        star.rect.y = star.rect.height + 2 * star.rect.height * row_number
        self.stars.add(star)

    def _update_stars(self):
        """Update the positions of all stars in the fleet."""
        self.stars.update()

    def _check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q:
                    sys.exit()

    def _update_screen(self):
        self.screen.fill(self.settings.bg_color)
        self.stars.draw(self.screen)
        pygame.display.flip()

if __name__ == '__main__':
    sg = StarGame()
    sg.run_game()
设置.py

class Settings:
    """A class to store all settings for Alien Invasion."""

    def __init__(self):
        """Initialise the game's settings."""
        #Screen settings
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230, 230, 230)

        self.star_speed = 1.0
星型

import pygame
from pygame.sprite import Sprite 

class Star(Sprite):

    def __init__(self, sg_game):
        super().__init__()
        self.screen = sg_game.screen
        self.settings = sg_game.settings

        self.image = pygame.image.load('images/alien.bmp')
        self.rect = self.image.get_rect()
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height
        self.x = float(self.rect.x)
        self.y = float(self.rect.y)

    def update(self):
        self.y += self.settings.star_speed
        self.rect.y = self.y

您必须在
\u create\u star
方法中初始化
star.y
属性,而不是
star.rect.y

class星际游戏:
# [...]
定义创建星号(自身、星号、行号):
星=星(自身)
星形宽度,星形高度=star.rect.size
星形x=星形宽度+2*星形宽度*星形编号
star.y=star.rect.height+2*star.rect.height*行数
self.stars.add(star)
但是,通过
x
y
属性同步
update
rect
属性中存储的位置:

类星(精灵):
# [...]
def更新(自我):
self.y+=self.settings.star\u速度
self.rect.topleft=圆形(self.x),圆形(self.y)