使一行行精灵重新出现在pygame中的屏幕顶部



我试图让一行排精灵从底部消失时重新出现在屏幕顶部。 我能够让精灵向下移动并离开屏幕,但不知道让它们在一行移开后立即重新出现。这是我到目前为止的代码:

import pygame
import sys
from pygame.sprite import Sprite
class Rain:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((1200, 800))
pygame.display.set_caption("Rain Drops")
self.bg_color = (100,100,100)

self.rain_drops = pygame.sprite.Group()
self._create_drop()

drop = Drop()

def run_rain(self):

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
sys.exit()

self.screen.fill(self.bg_color)

self._update_drops()

self.rain_drops.draw(self.screen)

pygame.display.flip()

def _create_drop(self):
drop = Drop()
drop.rect.x = -10 
drop.rect.y = 4
drop_start_x = drop.rect.x
drop_start_y = drop.rect.y

for row_number in range(5):
for drop_number in range(20):
drop = Drop()
drop.rect.x = drop_start_x + 70 * drop_number
drop.rect.y = drop_start_y + 100 * row_number

self.rain_drops.add(drop)

def _update_drops(self):
self.rain_drops.update()

class Drop(Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load('smaller_drop.bmp')
self.rect = self.image.get_rect()

def update(self):
self.rect.y += 1


rain = Rain()
rain.run_rain()

这种事情最好在精灵的.update()函数中完成。 检查精灵Recty坐标是否超过窗口的高度,如果是,则将其移回顶部。

但是,您已在显示初始化函数中对窗口尺寸进行了硬编码。 我们需要知道更新中的窗口长度,因此需要将这些长度移出到常量变量中。

class Rain:
WINDOW_WIDTH = 1200
WINDOW_HEIGHT= 800
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((self.WINDOW_WIDTH, self.WINDOW_HEIGHT))
pygame.display.set_caption("Rain Drops")

现在在DropSprite中,很容易将位置与窗口高度进行比较。 如果位置大于窗口高度,

class Drop(Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load('smaller_drop.bmp')
self.rect = self.image.get_rect()
def update(self):
self.rect.y += 1
# if we go off the bottom of the window, move back to top
if ( self.rect.y > Rain.WINDOW_HEIGHT ):   
self.rect.y = 0 

您可能还希望下降从屏幕正上方开始,以便它"落入"视野中。 在这种情况下,它以(0 - self.rect.height)x开始,因为矩形的x,y是左上角的坐标。 将其移动到0会使其突然出现在顶部。 将其移动到-height会使其位于玩家视图的正上方。

最新更新