发现学了一遍外星人,就有些没记住,那我还是把作业题做一遍。
首先我就发现我之前装的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))