星星:找一副星星图像,并在屏幕上显示一系列排列整齐的星星。
又一次模仿书上的代码,又出现了新问题,同样粗心。希望明天会更好。
主程序:display
import pygame
import sys
from settings import Settings
from pygame.sprite import Group
import func as f
def display():
"""显示"""
pygame.init()
settings = Settings()
screen = pygame.display.set_mode((settings.screen_width, settings.screen_height))
pygame.display.set_caption("Display Stars")
stars = Group()
f.create_stars(settings, screen, stars)
while True:
f.check_keys()
f.update_screen(settings, screen, stars)
display()
设置类:Settings
import pygame
class Settings():
"""存放所有设置的类"""
def __init__(self):
self.screen_width = 1200
self.screen_height = 700
self.bg_color = (248, 2, 3)
星星类:Star
import pygame
from pygame.sprite import Sprite
class Star(Sprite):
"""星星的类"""
def __init__(self, screen):
super().__init__()
self.screen = screen
self.image = pygame.image.load('star.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
self.rect.x = self.rect.width
self.rect.y = self.rect.height
def blitme(self):
"""绘制星星"""
self.screen.blit(self.image, self.rect)
函数func
import sys
import pygame
from star import Star
def check_keys():
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def update_screen(settings, screen, stars):
"""重绘屏幕"""
screen.fill(settings.bg_color)
stars.draw(screen)
pygame.display.flip()
def get_number_stars_x(settings, star_width):
space_x = settings.screen_width - star_width
number_stars_x = int(space_x / (2 * star_width))
return number_stars_x
def get_number_stars_y(settings, star_height):
space_y = settings.screen_height - star_height
number_stars_y = int(space_y / (2 * star_height))
return number_stars_y
def create_star(screen, stars, star_number, row_number):
star = Star(screen)
star_width = star.rect.width
star.x = star_width + 2 * star_width * star_number
star.rect.x = star.x
star.rect.y = star.rect.height + 2 * star.rect.height * row_number
stars.add(star)
def create_stars(settings, screen, stars):
star = Star(screen)
number_stars_x = get_number_stars_x(settings, star.rect.width)
number_stars_y = get_number_stars_y(settings, star.rect.height)
for row_number in range(number_stars_y):
for star_number in range(number_stars_x):
create_star(screen, stars, star_number, row_number)
实际效果图:
总结:
1.
今天遇到了新问题:UnboundLocalError:local variable
在测试显示一个星星的过程中:
在实例化star = Star(screen)时,把这句话写在了screen = .......前面
2.
值得注意的地方:
在计算行和列能放置星星的数量时,将number_stars_x = int(space_x / (2 * star_width))和number_stars_y = int(space_y / (2 * star_height)),写成number_stars_x = int(space_x / 2 )和number_stars_y = int(space_y / 2 ),结果就是bug不好找,程序运行时慢的不行,显示的效果还有些混乱,和预期相差较大,甚至会出现内存溢出错误。看看这两种情况:
很恐怖!值得注意!
13-2 更逼真的星星:随机放置星星
根据书上的生成随机数的提示:
from random import randint
random_number = randint(-10, 10)
还是用上面的程序,需要更改的地方如下(只需更改func内的函数即可):
def create_star(screen, stars, star_number):
star = Star(screen)
star_width = star.rect.width
star.x = randint(0, 1700) + star_width
star.rect.x = star.x
star.rect.y = randint(0, 700) + star.rect.height
stars.add(star)
def create_stars(settings, screen, stars):
star = Star(screen)
number_stars_x = get_number_stars_x(settings, star.rect.width)
number_stars_y = get_number_stars_y(settings, star.rect.height)
#for row_number in range(number_stars_y):
for star_number in range(number_stars_x):
create_star(screen, stars, star_number)
效果图(根据图案的选择,可能出现重叠的效果):