我试图让一行排精灵从底部消失时重新出现在屏幕顶部。 我能够让精灵向下移动并离开屏幕,但不知道让它们在一行移开后立即重新出现。这是我到目前为止的代码:
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()
函数中完成。 检查精灵Rect
的y
坐标是否超过窗口的高度,如果是,则将其移回顶部。
但是,您已在显示初始化函数中对窗口尺寸进行了硬编码。 我们需要知道更新中的窗口长度,因此需要将这些长度移出到常量变量中。
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
会使其位于玩家视图的正上方。