python速成课程13-4添加一行新精灵会使pygame落后,并且新行不会移动
我目前正在派顿速成班做练习 修改练习13-3中的代码,以便在遇到一排雨点时 从屏幕底部消失,屏幕顶部会出现一个新行 屏风开始落下。 当最下面一行碰到屏幕底部时,我成功地使新的一行雨滴出现。然而,这样做之后,pygame开始显著滞后,在屏幕顶部创建一行新雨滴后,新行保持静止,而原始雨滴组继续向下移动(具有显著滞后)。我已经做了一些调试,当第一行触底时,似乎会创建大量新行,但我不知道为什么。非常感谢您的帮助,谢谢 明星队python速成课程13-4添加一行新精灵会使pygame落后,并且新行不会移动,python,pygame,Python,Pygame,我目前正在派顿速成班做练习 修改练习13-3中的代码,以便在遇到一排雨点时 从屏幕底部消失,屏幕顶部会出现一个新行 屏风开始落下。 当最下面一行碰到屏幕底部时,我成功地使新的一行雨滴出现。然而,这样做之后,pygame开始显著滞后,在屏幕顶部创建一行新雨滴后,新行保持静止,而原始雨滴组继续向下移动(具有显著滞后)。我已经做了一些调试,当第一行触底时,似乎会创建大量新行,但我不知道为什么。非常感谢您的帮助,谢谢 明星队 import sys import pygame from settings
import sys
import pygame
from settings import Settings
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
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_row(self):
star = Star(self)
star_width, star_height = star.rect.size
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 star_number in range(number_stars_x):
self._create_star(star_number, 0)
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.y = star.rect.height + 2 * star.rect.height * row_number
star.rect.y = star.y
self.stars.add(star)
def _update_stars(self):
"""Update the positions of all stars in the fleet."""
self._check_fleet_edges()
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()
def _check_fleet_edges(self):
flag = False
for star in self.stars.sprites():
if star.check_edges():
star.remove()
flag = True
if flag:
self._create_row()
print("NEW")
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.topleft = round(self.x), round(self.y)
def check_edges(self):
screen_rect = self.screen.get_rect()
if self.rect.y >= screen_rect.bottom:
return True
当星星位于屏幕底部时,需要将其从
星星中删除。您必须将要从中移除星星的组传递给该方法。或者,您可以通过以下方式从所有组中删除星号:
class星际游戏:
# [...]
def_检查_车队_边缘(自身):
flag=False
对于自我中的星星。星星。精灵()
如果为星形。请检查_边()
star.remove(self.stars)#当星星位于屏幕底部时,需要从星星
中删除它们。您必须将要从中移除星星的组传递给该方法。或者,您可以通过以下方式从所有组中删除星号:
class星际游戏:
# [...]
def_检查_车队_边缘(自身):
flag=False
对于自我中的星星。星星。精灵()
如果为星形。请检查_边()
star.remove(self.stars)#您好,先生,谢谢您的帮助和信息。不删除。以列表/组等方式删除工作。删除(特定项目要删除)?在本例中,在star.remove(self.stars)中,star不是一个特定的精灵,而“self.stars”是一组精灵吗?干杯@BobTanself.stars
是将开始添加到self.stars.add(star)
的组。请按照答案中的链接进行操作。阅读文档,哦,我明白了。非常感谢。您好,先生,谢谢您的帮助和信息。不删除。以列表/组等方式删除工作。删除(特定项目要删除)?在本例中,在star.remove(self.stars)中,star不是一个特定的精灵,而“self.stars”是一组精灵吗?干杯@BobTanself.stars
是将开始添加到self.stars.add(star)
的组。请按照答案中的链接进行操作。阅读文档,哦,我明白了。非常感谢。