首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python速成班13-4添加一排新的精灵滞后于pygame,而新行不移动。

python速成班13-4添加一排新的精灵滞后于pygame,而新行不移动。
EN

Stack Overflow用户
提问于 2021-01-14 12:20:03
回答 1查看 114关注 0票数 0

我目前正在pyton速成班上做一个练习,修改练习13-3中的代码,这样当一排雨滴从屏幕底部消失时,屏幕顶部就会出现新的一行,并开始下降。当底部一行接触到屏幕底部时,我设法使一排新的雨滴出现。然后,游戏开始明显滞后,在屏幕顶部创建了一排新的雨滴之后,新的行保持不变,而原来的雨滴继续向下移动(明显滞后)。我已经做了一些调试,当第一行触及底部时,似乎会创建大量的新行,但我不知道为什么。感谢您的帮助,谢谢yoU!

stars_game.py

代码语言:javascript
复制
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()

settings.py

代码语言:javascript
复制
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

star.py

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-14 12:28:45

当星星在屏幕底部时,它们需要从stars Group中移除。您必须将从其中移除恒星的组传递给remove方法。或者,您可以使用kill从所有组中移除一颗恒星。

代码语言:javascript
复制
class StarGame:
    # [...]

    def _check_fleet_edges(self):
        flag = False
        for star in self.stars.sprites():
            if star.check_edges():
                
                star.remove(self.stars)          # <---
                # alternatively you can do
                # star.kill()     
           
                flag = True
        if flag:
            self._create_row()
            print("NEW")

pygame.image.load是一个非常耗时的操作。必须读取和解码图像文件。在初始化期间加载一次映像,并将加载的Surface对象传递给Star的构造函数

代码语言:javascript
复制
class Star(Sprite):

    def __init__(self, sg_game, image):
        # [...]

        self.image = image
        
        # [...]
代码语言:javascript
复制
class StarGame:
    def __init__(self):
        # [...]

        self.star_surf = pygame.image.load('images/alien.bmp')

    # [...]

    def _create_fleet(self):
        star = Star(self, self.star_surf) 
        # [...]

    def _create_row(self):
        star = Star(self, self.star_surf)
        # [...]

    def _create_star(self, star_number, row_number):
        star = Star(self, self.star_surf)
        # [...]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65718844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档