日报 day 1
1.需要用到的python库
今天学习制作了一个简易的魔方变色。
使用的库有:
- sys
- pygame
- numpy
- time
2.代码示例与运行结果
代码示例1
# -*- coding=utf-8 -*-
import sys
import pygame
import numpy as np
import time
class EasyCube:
def __init__(self, width=320, height=240, size=3, rect_size=60, window_name='百变魔方'):
"""
:param width: 窗口宽度
:param height: 窗口高度
:param size: 魔方尺寸(3*3、4*4...)
:param rect_size: 小方块的尺寸
:param window_name: 窗口名
"""
self.width = width
self.height = height
self.size = size
self.window_name = window_name
self.rect_size = rect_size
self.start_x, self.start_y = self.get_start_position()
pygame.init()
self.screen = pygame.display.set_mode((self.width, self.height), 0, 32)
pygame.display.set_caption(self.window_name)
self.background = pygame.image.load('./background.jpg').convert()
def get_start_position(self):
"""
:return:能让魔方显示在屏幕中央的起始坐标。
"""
return(
self.width / 2 - (self.rect_size * self.size) / 2,
self.height / 2 - (self.rect_size * self.size) / 2
)
def event_loop(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def run(self):
while True:
pygame.display.update()
self.screen.blit(self.background, (0, 0)) # 画背景图
self.event_loop()
time.sleep(0.5) # 延时0.5秒
for row in range(self.size):
for col in range(self.size):
color = tuple(np.random.randint(0, 256, (1, 3))) # 获取随机颜色
pygame.draw.rect(self.screen, color,
(self.start_x + 60 * col, self.start_y + 60 * row, self.rect_size, self.rect_size))
if __name__ == "__main__":
cube = EasyCube(640, 480, size=5, window_name='小方块')
cube.run()
运行截图:
图1.会变色的方块
因为是截图,所以看不到方块颜色变化的过程。
3.代码剖析
pygame.init()
初始化所有导入的pygame模块,为硬件初始化做准备。
self.screen = pygame.display.set_mode((self.width, self.height), 0, 32)
==pygame.display.set_mode()==有4个参数:
-
size:一个元组(窗口宽度,窗口高度),表示分辨率
-
flags:具体意思看下表
标志位 功能 FULLSCREEN 创建一个全屏窗口 DOUBLEBUF 创建一个“双缓冲”窗口,建议在HWSURFACE或OPENGL时使用 HWSURFACE 创建一个硬件加速的窗口,必须和FULLSCREEN同时使用 OPENGL 创建一个OPENGL渲染的窗口 RESIZABLE 创建一个可以改变大小的窗口 NOFRAME 创建一个没有边框的窗口
3.depth:色深,最好不用传递该参数,因为pygame会根据当前操作系统选择最好和最快的颜色深度,不过我还是传了一个参数32。
==pygame.display.set_mode()==方法会根据传入的参数,指定显示类型,创建并返回一个surface对象。
pygame.display.set_caption(self.window_name)
==pygame.display.set_caption()==方法用于设置当前窗口的标题。
while True:
pygame.display.update()
self.screen.blit(self.background, (0, 0)) # 画背景图
self.event_loop()
time.sleep(0.5) # 延时0.5秒
for row in range(self.size):
for col in range(self.size):
color = tuple(np.random.randint(0, 256, (1, 3))) # 获取随机颜色
pygame.draw.rect(self.screen,
color,
(self.start_x + self.rect_size * col, self.start_y + self.rect_size * row,\
self.rect_size, self.rect_size)
)
要想让窗口不会一闪而过,需要设置一个死循环(while True)。
self.background = pygame.image.load('./background.jpg').convert()
self.screen.blit(self.background, (0, 0)) # 画背景图
这两句代码用于设置窗口的背景图片。
==pygame.image.load()==方法用于加载图片,传入参数是图片所在路径(可以是相对路径,也可以是绝对路径,推荐使用相对路径,因为我们的程序可能会在不同的主机上运行,到时候绝对路径就会发生变化)。
==convert()==函数用于将图像数据转换为Surface对象,不过这个函数即使我们不写,pygame也会帮我们处理。
==blit()==函数:第一个参数是一个surface对象,第二个参数是左上角的位置(窗口内部左上角顶点位置),也可以是其它值。
pygame.display.update()
该方法用于刷新屏幕,否则屏幕上不会有什么变化的。
time.sleep(0.5) # 延时0.5秒
用于延时,不过延时期间,该窗口的事件循环队列也会暂停掉,也就是说,在这0.5秒期间,关闭窗口,移动鼠标,击打键盘都不会被响应。
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
事件:鼠标移动事件、鼠标点击事件、键盘击打事件、按下关闭按钮事件等。
在pygame中,所有的事件都放到一个队列里。我们这里做的是对事件队列进行轮询,判断事件类型是否为退出程序,是的话调用==sys.exit()==结束程序。否则,继续事件循环。
这里使用get()来处理所有事件。其它事件处理方法还有wait()和poll()。
color = tuple(np.random.randint(0, 256, (1, 3))) # 获取随机颜色
获取颜色元组(比如(0,255,255))。
由==np.random.randint()==方法生成,这里生成1行3列,取值范围位于0-256之间的随机数。返回类型是ndarray。
[0, 256)取值范围是左闭右开。
该函数返回的是ndarray,无法直接使用,需要转换成元组类型。
tuple(ndarray)进行转换。
pygame.draw.rect(self.screen,
color,
(self.start_x + self.rect_size * col, self.start_y + self.rect_size * row,self.rect_size, self.rect_size)
)
pygame.draw.rect(Surface, color, Rect, width=0)
该方法在Surface上画一个矩形,color是一个元组,用来表示rgb。Rect是矩形坐标,也是一个元组,包括(左上角顶点X坐标,左上角顶点Y坐标,矩形宽度,矩形高度)。width是线宽,这里不管它。
还有其它各种图形的绘制函数:
- rect 绘制矩形
- polygon 绘制多边形
- circle 绘制图
- ellipse 绘制椭圆
- arc 绘制圆弧
- line 绘制线
- lines 绘制一系列的线
- aaline 绘制一根平滑的线
- aalines 绘制一系列平滑的线
点X坐标,左上角顶点Y坐标,矩形宽度,矩形高度)。width是线宽,这里不管它。
还有其它各种图形的绘制函数:
- rect 绘制矩形
- polygon 绘制多边形
- circle 绘制图
- ellipse 绘制椭圆
- arc 绘制圆弧
- line 绘制线
- lines 绘制一系列的线
- aaline 绘制一根平滑的线
- aalines 绘制一系列平滑的线