【Python】【pygame】更逼真的星星、连绵细雨

发现学了一遍外星人,就有些没记住,那我还是把作业题做一遍。

首先我就发现我之前装的pygame,每次都要重新导入一下,模块里面没有。
【文件】->【设置】->【Project Interpreter】->没有的话就,右边【+】
在这里插入图片描述
搜一下,搜出来了按右下角【Install Package】
在这里插入图片描述

还有一个编辑图片分辨率方法:
图片右键【打开方式】-> 【画图】->【重新调整大小】
在这里插入图片描述
RGB值颜色查询表,可以百度。

更逼真的星星

来源:《Python编程 从入门到实践》13-2
就没用星星,也不太想p背景,于是选了纯白的图片,顺便用一下下最近偶像的图片,这就是我的满天星星。(转侵删)

在这里插入图片描述

blingbling.py

import pygame

from settings import Settings
from pygame.sprite import Group
import functions as f

def bling():
    pygame.init() # 初始化

    sets = Settings() # 获取设置
    screen = pygame.display.set_mode((sets.screen_width, sets.screen_height)) # 获取屏幕
    pygame.display.set_caption("KiKi") # 标题

    stars = Group()
    f.create_group(screen, sets, stars)

    while True:
        f.check_quit() #检测退出
        f.update_screen(screen, sets, stars) #刷新屏幕

bling()

settings.py

import pygame

class Settings():
    def __init__(self):

        self.screen_width = 800
        self.screen_height = 600
        self.screen_color = (255, 255, 255) # 纯白

        self.star_image = pygame.image.load('image/kiki.bmp')

stars.py

from pygame.sprite import Sprite # 精灵类

class Star(Sprite):
    def __init__(self, screen, sets):
        super(Star, self).__init__()
        self.sets = sets
        self.screen = screen
        self.image = sets.star_image
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()

        self.rect.x = self.rect.width
        self.rect.y = self.rect.height
        self.x = float(self.rect.x)

    def print_star(self):
        self.screen.blit(self.image, self.rect)

functions.py

import sys
import pygame
from star import Star
from random import randint

def check_quit():
    for event in pygame.event.get():  # 获取鼠标键盘操作
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                sys.exit()

def update_screen(screen, sets, stars):
    screen.fill(sets.screen_color)  # 填充屏幕颜色
    stars.draw(screen)
    pygame.display.flip()  # 使屏幕可见

def create_group(screen, sets, stars):
    star = Star(screen, sets)
    star_width = star.rect.width
    star_height = star.rect.height
    number_x = int(sets.screen_width / 3 / star_width)
    number_y = int(sets.screen_height / 2 / star_height)
    for y in range(number_y):
        for x in range(number_x):
            star = Star(screen, sets)
            p = randint(-20, 20)
            star.x = (3*x+1) * star_width + p
            star.y = (2*y+1) * star_height + p
            star.rect.x = star.x
            star.rect.y = star.y
            stars.add(star)

结果

在这里插入图片描述

期间报错:‘Star’ object has no attribute ‘_Sprite__g’

就是在Star类里面忘了继承父类的初始化函数。(star.py第五行)

连绵细雨

来源:《Python编程 从入门到实践,13-4

依旧为我的星星打call。
在这里插入图片描述

ranning.py

import functions as f
from setting import set
import pygame
from pygame.sprite import Group
from rain import Rain

def run_rain():
    pygame.init()
    sets = set()
    screen = pygame.display.set_mode((sets.back_width, sets.back_height))
    pygame.display.set_caption("What a raning day")

    rains = Group()
    f.create_rains(sets, screen, rains)

    while True:
        f.check_event()
        f.update_screen(screen, sets, rains)

run_rain()

setting.py

import pygame

class set():
    def __init__(self):
        self.back_image = pygame.image.load('kiki2.bmp')
        self.rect = self.back_image.get_rect()
        self.back_width = self.rect.width
        self.back_height = self.rect.height

        self.rain_image = pygame.image.load('rain2.bmp')
        self.rain_speed = 1
        self.rain_distant = 50

rain.py

import pygame
from pygame.sprite import Sprite

class Rain(Sprite):
    def __init__(self, sets, screen):
        super(Rain, self).__init__()
        self.sets = sets
        self.screen = screen
        self.speed = sets.rain_speed
        self.image = sets.rain_image
        self.rect = self.image.get_rect()

    def print_rain(self):
        self.screen.blit(self.image, self.rect)

functions.py

import sys
import pygame
from rain import Rain

def check_event():
    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()

def update_screen(screen, sets, rains):
    screen.blit(sets.back_image, sets.rect)
    drop_rains(sets, rains)
    update_rains(rains, sets)
    rains.draw(screen)
    pygame.display.flip()

def create_rains(sets, screen, rains):
    num_x = int(sets.back_width / sets.rain_distant)
    num_y = int(sets.back_height / sets.rain_distant)
    for k in range(num_y):
        for p in range(num_x):
            rain = Rain(sets, screen)
            x = (p+1) * sets.rain_distant
            y = k * sets.rain_distant
            rain.rect.x = x
            rain.rect.y = y
            rains.add(rain)

def drop_rains(sets, rains):
    for rain in rains.sprites():
        rain.rect.y += sets.rain_speed

def update_rains(rains, sets):
    for rain in rains.copy():
        if rain.rect.bottom >= sets.back_height:
            rain.rect.y = 0 # 变为0重新开始下落
    #print(len(rains))

结果

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值