练习13-4
说明:练习13-3可以由13-4简单修改后得到
题目要求
题目要求生成一行雨滴,下落到底端消失,重复在上面生成。
自己在题目要求上做了扩展
1.雨滴位置加入随机数,使得看起来不整齐
2.可设置一次下落多少行,这里设置为3行
3.存在问题:因为刚刚学习,对程序不太了解,仿造书上想要控制雨滴的速度,但是雨滴速度一旦为小数就停止不动,
希望大家能帮我找出问题出在哪里了?万分感谢!
所用到的图片(名称rain.bmp 分辨率 25*40)
主函数 main.py
import sys
import pygame
from rain import Rain
from random import randint
class Gamemain:
"""
成行成列的显示
"""
def __init__(self):
pygame.init()#初始化
self.screen = pygame.display.set_mode((1200, 800))
self.screen.fill((255, 255, 255))#背景颜色
self.screen_height = self.screen.get_height()
self.screen_width = self.screen.get_width()
pygame.display.set_caption("下雨天")
self.icon = pygame.image.load('image/rain.bmp')
pygame.display.set_icon(self.icon) #个性化设置窗口图标为要显示的照片
self.rains= pygame.sprite.Group()#很重要!相当于一个有很多类的编组,可以统一管理
self.rain_speed = 1.0#雨滴速度 问题就在这里,如果设置为1.5 雨滴就停止不动
def creat_rain(self):
"""
判断行列有多少元素
设置间距
生产雨添加到Group组
"""
new_rain = Rain(self)
available_x = self.screen_width - 2*new_rain.rect_width
number_x = available_x //(2*new_rain.rect_width)#一行里面有的个数
available_y = self.screen_height-3*new_rain.rect_height
number_y = available_y //(2*new_rain.rect_height)#一列有的个数
for y in range(3):#这里只生成3行
for x in range(number_x):
new_rain = Rain(self)#在这里是因为每次循环都创造一个实例
random_number = randint(-10, 10) # 加入一些随机数使得排列不那么整齐
new_rain.rect.x = 20 + random_number + x*(2*new_rain.rect_width)
random_number = randint(-20, 20) # 加入一些随机数使得排列不那么整齐
new_rain.rect.y = 20 + random_number + y*(2*new_rain.rect_height)
self.rains.add(new_rain)#通过循环创造的实例都添加到组中
def rain_drop(self):
#更新雨下落的Y轴位置
for read_rain in self.rains.sprites():#从组中逐个读出雨滴,并修改Y轴参数
read_rain.rect.y += self.rain_speed
def check_rain(self):
#检查是否到达边界,删除到达边界的元素
for read_rain in self.rains.copy():
if read_rain.rect.bottom >= self.screen_height:
self.rains.remove(read_rain)#到达边界删除
if len(self.rains) == 0:#雨滴下落完
self.creat_rain() # 创造出雨的组
def game_run(self):
self.creat_rain()#创造出雨的组
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
self.screen.fill((255, 255, 255)) # 需要再绘制背景颜色,不然会有阴影
self.rains.draw(self.screen)#将雨的组集体绘制
self.rain_drop()#更新下落
self.check_rain()#检查是否到达边界
pygame.display.flip()#绘制屏幕
# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
rain = Gamemain()
rain.game_run()
雨滴rain.py
""""
雨滴的类 设置雨滴
"""
import pygame
from pygame.sprite import Sprite
class Rain(Sprite):
def __init__(self, ai_game):
super().__init__()
self.screen = ai_game.screen
self.screen_rect = self.screen.get_rect()
#导入雨滴
self.image = pygame.image.load('image/rain.bmp')
self.rect = self.image.get_rect()
self.rect_width = self.rect.width
self.rect_height = self.rect.height
效果图: