pygame实现百变魔方

日报 day 1

1.需要用到的python库

今天学习制作了一个简易的魔方变色。

使用的库有:

  1. sys
  2. pygame
  3. numpy
  4. 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个参数:

  1. size:一个元组(窗口宽度,窗口高度),表示分辨率

  2. 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 绘制一系列平滑的线
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值