Python 在pygame中,如何停止在曲面上渲染运动图像的每一帧?

Python 在pygame中,如何停止在曲面上渲染运动图像的每一帧?,python,pygame,Python,Pygame,我正在尝试使用pygame制作一个简单的降雨动画。我向下移动图像,但更新它的垂直位置;但是,雨滴运动的每一帧都会渲染到屏幕上。很多资料都指出,我必须在每一帧刷新屏幕,但是位置更新还应该去哪里呢 以下是完整的代码: import sys import pygame from raindrops import Raindrop from pygame.sprite import Group def let_it_rain(): '''initialize pygame, setting

我正在尝试使用pygame制作一个简单的降雨动画。我向下移动图像,但更新它的垂直位置;但是,雨滴运动的每一帧都会渲染到屏幕上。很多资料都指出,我必须在每一帧刷新屏幕,但是位置更新还应该去哪里呢

以下是完整的代码:

import sys
import pygame
from raindrops import Raindrop
from pygame.sprite import Group 


def let_it_rain():
    '''initialize pygame, settings, and screen object'''
    pygame.init()
    screen_width = 1200
    screen_height = 800
    bg_color = (144, 177, 226)
    screen = pygame.display.set_mode((screen_width, screen_height))
    pygame.display.set_caption("Let It Rain")

    raindrop = Raindrop(screen)
    raindrops = Group()

    #number of drops in a row
    spacex = screen_width - (2 * raindrop.rect.width)
    raindrop_number_x = int(spacex / (2 * raindrop.rect.width))

    #start window for raindrops
    while True:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

        #create row of raindrops
        for raindrop_number in range(raindrop_number_x):
            raindrop = Raindrop(screen)
            raindrop.x = raindrop.rect.x + 2 * raindrop.rect.x * raindrop_number  
            raindrop.rect.x = raindrop.x
            raindrops.add(raindrop)

        screen.fill(bg_color)
        raindrops.update()
        raindrops.draw(screen)
        pygame.display.flip()

let_it_rain()
以及相关的雨滴模块:

import pygame
from pygame.sprite import Sprite


class Raindrop(Sprite):

    def __init__(self, screen):

        #load image
        super(Raindrop, self).__init__()
        self.screen = screen
        self.pic = pygame.image.load('rain.png')
        self.image = pygame.transform.smoothscale(self.pic,(50,60))
        self.rect = self.image.get_rect()

        #starting position
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height

        #store exact decimal position of rainddrop
        self.x = float(self.rect.x)
        self.y = float(self.rect.y)

    def update(self):
        speed = 5
        self.y += speed 
        screen_rect = self.screen.get_rect()
        self.rect.y = self.y
        #once raindrops reach the bottom of the screen, reposition to the top corrdinates
        if self.rect.y == screen_rect.bottom:
            self.y = 0
            self.rect.y = 0

您需要做的是将创建雨滴的for循环移动到while循环之前,如下所示:

导入系统 导入pygame 从雨滴导入雨滴 从pygame.sprite导入组 让它下雨吧 ''初始化pygame、设置和屏幕对象'' pygame.init() 屏幕宽度=1200 屏幕高度=800 背景颜色=(144177226) screen=pygame.display.set_模式((屏幕宽度、屏幕高度)) pygame.display.set_标题(“让它下雨吧”) 雨滴=雨滴(屏幕) 雨滴=组() #连续下降的次数 spacex=屏幕宽度-(2*雨滴矩形宽度) 雨滴数=int(空格x/(2*raindrop.rect.width)) #创建一排雨滴 对于范围内的雨滴数(雨滴数): 雨滴=雨滴(屏幕) raindrop.x=raindrop.rect.x+2*raindrop.rect.x*raindrop\u编号 雨滴.rect.x=雨滴.x 雨滴。添加(雨滴) #启动雨点窗口 尽管如此: 对于pygame.event.get()中的事件: 如果event.type==pygame.QUIT: sys.exit() 屏幕填充(背景颜色) raindrops.update() 雨点。绘制(屏幕) pygame.display.flip() 让它下雨吧
当它在循环中时,它不断在每个新的y位置重新创建雨滴

您需要做的是在while循环之前移动创建雨滴的for循环,如下所示:

导入系统 导入pygame 从雨滴导入雨滴 从pygame.sprite导入组 让它下雨吧 ''初始化pygame、设置和屏幕对象'' pygame.init() 屏幕宽度=1200 屏幕高度=800 背景颜色=(144177226) screen=pygame.display.set_模式((屏幕宽度、屏幕高度)) pygame.display.set_标题(“让它下雨吧”) 雨滴=雨滴(屏幕) 雨滴=组() #连续下降的次数 spacex=屏幕宽度-(2*雨滴矩形宽度) 雨滴数=int(空格x/(2*raindrop.rect.width)) #创建一排雨滴 对于范围内的雨滴数(雨滴数): 雨滴=雨滴(屏幕) raindrop.x=raindrop.rect.x+2*raindrop.rect.x*raindrop\u编号 雨滴.rect.x=雨滴.x 雨滴。添加(雨滴) #启动雨点窗口 尽管如此: 对于pygame.event.get()中的事件: 如果event.type==pygame.QUIT: sys.exit() 屏幕填充(背景颜色) raindrops.update() 雨点。绘制(屏幕) pygame.display.flip() 让它下雨吧 当它在圈内时,它不断地在每个新的y形位置重现雨滴