练习 13-1:星星 ——找一副星星图像,并在屏幕上显示一系列整齐排列的星星。
1.starsky.py
import pygame
import sys
from random import randint
from star import Star
class StarSky:
def __init__(self):
""" 初始化 """
pygame.init()
# 创建一个显示窗口,并设置窗口尺寸
self.screen = pygame.display.set_mode((1500, 800))
# # 设置背景色
self.bg_color = (20, 20, 20)
self.stars = pygame.sprite.Group()
self._create_starry()
pygame.display.set_caption("Star Sky")
def _create_starry(self):
""" 创建星群 """
# 创建一个星星并计算一行可容纳多少个星星
star = Star(self)
star_width, star_height = star.rect.size
# 屏幕x方向左右各预留一个星星宽度
availiable_space_x = self.screen.get_rect().width - (2 * star_width)
# 星星的间距为星星宽度的3倍
number_stars_x = availiable_space_x // (4 * star_width) + 1
# 计算屏幕可容纳多少行星星
# 屏幕y方向上下各预留一个星星宽度
availiable_space_y = self.screen.get_rect().height - (2 * star_height)
# 星星的间距为星星高度的3倍
number_rows = availiable_space_y // (4 * star_height) + 1
# 创建星群
for row_number in range(number_rows):
for star_number in range(number_stars_x):
self._create_star(star_number, row_number)
def _create_star(self, star_number, row_number):
# 创建一个星星并将其加入到当前行
star = Star(self)
star_width, star_height = star.rect.size
star.rect.x = star_width + 4 * star_width * star_number
star.rect.y = star_height + 4 * star_height * row_number
self.stars.add(star)
def starry(self):
""" 开始星空展示 """
while True:
# 屏幕展示
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 每次循环时都重绘屏幕
self.screen.fill(self.bg_color)
self.stars.draw(self.screen)
# 让最近绘制的屏幕可见
pygame.display.flip()
if __name__ == '__main__':
# 创建实例并运行
sky = StarSky()
sky.starry()
2.star.py
import pygame
from pygame.sprite import Sprite
class Star(Sprite):
""" 表示单个星星的类 """
def __init__(self, ai_game):
""" 初始化星星并设置其起始位置 """
super().__init__()
self.screen = ai_game.screen
# 加载星星图像并设置其rect属性
self.image = pygame.image.load('images/stars.bmp')
self.rect = self.image.get_rect()
# 每个星星最初都在屏幕左上角附近
self.rect.x = self.rect.width
self.rect.y = self.rect.height
# 存储星星精确水平位置
self.x = float(self.rect.x)
运行效果如下:
练习 13-2:更逼真的星星 ——为让星星的分布更逼真,可随机地放置星星。在为完成练习 13-1而编写的程序中,随机地调整每颗星星的位置。
随机位置要用到随机函数:
from random import randint
random_number = randint(-10, 10)
在这里随机数可以应用于尺寸x、y坐标的生成
1.starsky.py 将函数_create_starry()与_create_star()进行一些修改
import pygame
import sys
from random import randint
from star import Star
class StarSky:
def __init__(self):
""" 初始化 """
pygame.init()
# 创建一个显示窗口,并设置窗口尺寸
self.screen = pygame.display.set_mode((1500, 800))
# # 设置背景色
self.bg_color = (20, 20, 20)
self.stars = pygame.sprite.Group()
self._create_starry()
pygame.display.set_caption("Star Sky")
def _create_starry(self):
""" 创建星群 """
# 创建一个星星并计算一行可容纳多少个星星
star = Star(self)
star_width, star_height = star.rect.size
# 屏幕x方向左右各预留一个星星宽度
self.availiable_space_x = self.screen.get_rect().width - (2 * star_width)
# 星星的间距为星星宽度的3倍
number_stars_x = self.availiable_space_x // (4 * star_width) + 1
# 计算屏幕可容纳多少行星星
# 屏幕y方向上下各预留一个星星宽度
self.availiable_space_y = self.screen.get_rect().height - (2 * star_height)
# 星星的间距为星星高度的3倍
number_rows = self.availiable_space_y // (4 * star_height) + 1
# 创建星群
for row_number in range(number_rows):
for star_number in range(number_stars_x):
self._create_star(star_number, row_number)
def _create_star(self, star_number, row_number):
# 创建一个星星并将其加入到当前行
star = Star(self)
star.rect.x = randint(0, self.availiable_space_x)
star.rect.y = randint(0, self.availiable_space_y)
self.stars.add(star)
def starry(self):
""" 开始星空展示 """
while True:
# 屏幕展示
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 每次循环时都重绘屏幕
self.screen.fill(self.bg_color)
self.stars.draw(self.screen)
# 让最近绘制的屏幕可见
pygame.display.flip()
if __name__ == '__main__':
# 创建实例并运行
sky = StarSky()
sky.starry()
2.star.py不需要改动
运行效果如下: