雨滴:尋找一幅雨滴圖像,并創建一系列整齊排列的雨滴。讓這些雨滴往下落,直到到達屏幕后消失。
先說今天的問題:
1.在更改函數形參時,調用的時候也要修改,否則會出現AttributeError
值得注意的是:每當添加進新的代碼,要檢查函數傳遞的參數是否對應一致,函數本身與調用它的時候都要檢查
2.愚蠢的錯誤:把創建整齊雨滴的函數寫到循環體中去了,結果一直出現重疊,達不到預期效果,搞了半天眼睛快瞎了才發現,唉!
主程序 display
import pygame
from settings import Settings
from rain import Rain
import func as f
from pygame.sprite import Group#####
def display():
"""主函數----顯示雨滴效果"""
pygame.init()
settings = Settings()
screen = pygame.display.set_mode((settings.screen_width, settings.screen_height))
pygame.display.set_caption('Raining')
rains = Group()####
f.create_rains(settings, screen, rains)#####
while True:
f.check_events()
screen.fill(settings.bg_color)
f.change_direction(settings, rains)
rains.draw(screen)
pygame.display.flip()
display()
函數模塊func
import pygame
import sys
from rain import Rain
def check_events():
"""按鍵檢查"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def get_col_numbers(settings, rain):#對于每一行來說,變化的是x坐標,列在變化
"""一行可以存放的雨滴數"""
col_numbers = int(settings.screen_width / (2 * rain.rect.width))
return col_numbers
def get_row_numbers(settings, rain):
"""可存放雨滴的行數"""
row_numbers = int(settings.screen_height / (1 * rain.rect.height))
return row_numbers
def create_rain(settings, screen, rains, col_number, row_number):
rain = Rain(settings, screen)
rain_width = rain.rect.width
rain.x = rain_width + 2 * rain_width * col_number
rain.rect.x = rain.x#rect存放整數
rain.rect.y = rain.rect.y + 2 * rain.rect.height * row_number
rains.add(rain)
def create_rains(settings, screen, rains):
rain = Rain(settings, screen)#這句是要寫的,不寫的話get_col_numbers()中的rain將出現NameError
col_numbers = get_col_numbers(settings, rain)
row_numbers = get_row_numbers(settings, rain)
for row_number in range(row_numbers):
for col_number in range(col_numbers):
create_rain(settings, screen, rains, col_number, row_number)
def change_direction(settings, rains):
for rain in rains.sprites():
rain.rect.y += settings.drop_speed
rain類:
import pygame
from pygame.sprite import Sprite
class Rain(Sprite):
"""雨滴"""
def __init__(self, settings, screen):
super().__init__()
self.screen = screen
self.settings = settings
self.image = pygame.image.load('rain.bmp')
self.rect = self.image.get_rect()
self.y = float(self.rect.y)
def blitme(self):
self.screen.blit(self.image, self.rect)
def check_edges(self):
"""如果雨滴位于屏幕邊緣就返回True"""
if self.rect.top >= self.screen.rect.bottom:
return True
settings類:
class Settings():
"""設置所有設置的類"""
def __init__(self):
self.screen_width = 1200
self.screen_height = 600
self.bg_color = (255, 255, 255)
self.drop_speed = 1
效果圖:
初始:
下落: