連綿細雨:
我的想法是圖檔頂部碰到視窗底部後,它頂部的位置馬上變成0
(我覺得用圖檔頂部碰會更加絲滑哈哈哈,其實頂部底部都差不多)
我沒找雨滴的圖檔就直接用了書中的ship.bmp效果都差不多哈
raining.pyimport pygame import sys from rain import Rain class Raining: def __init__(self): pygame.init() self.screen=pygame.display.set_mode((1000,600)) self.bg_color=(200,200,200) pygame.display.set_caption("雨滴") self.rains=pygame.sprite.Group() self._create_row() def run(self): while True: self._quit() self._update() self._update_rain() self._check_edge() def _quit(self): for event in pygame.event.get(): if event.type==pygame.QUIT: sys.exit() def _create_row(self): rain=Rain(self) rain_width,rain_height=rain.rect.size available_space_x=1000-rain_width*2 rain_numbers=available_space_x//(rain_width*2) available_space_y=600-rain_height*2 row_numbers=available_space_y//(rain_height*2) for row in range(row_numbers): for number in range(rain_numbers): self._create_rain(number,row) def _create_rain(self,number,row): rain=Rain(self) rain_width,rain_height=rain.rect.size rain.rect.x=rain_width+rain_width*2*number rain.y=rain_height+rain_height*2*row rain.rect.y=rain.y self.rains.add(rain) def _update_rain(self): self.rains.update() def _check_edge(self): for rain in self.rains.sprites(): if rain.edge(): rain.rect.top=0 rain.rect.y=rain.y def _update(self): self.screen.fill(self.bg_color) self.rains.draw(self.screen) pygame.display.flip() if __name__ == "__main__": r=Raining() r.run()
rain.pyimport pygame from pygame.sprite import Sprite class Rain(Sprite): def __init__(self,r): super().__init__() self.screen=r.screen self.image=pygame.image.load("images\\ship.bmp") self.speed=0.5 self.rect=self.image.get_rect() self.rect.x=self.rect.width self.rect.y=self.rect.height self.y=float(self.rect.y) def edge(self): screen_rect=self.screen.get_rect() if self.rect.top>=screen_rect.bottom: self.y=0 self.rect.y=self.y def update(self): self.y+=self.speed self.rect.y=self.y def blitme(self): pygame.screen.blit(self.image,self.rect)
運作效果如下:

歡迎大家指正