Python——用Pygame画简单图形

前边已经了解到编程的很多基本要素:输入和输出、变量、判断、循环、列表、函数、对象和模块。下边开始就要用Python完成一些更有意思的事情啦!

比如如何在屏幕上画画,比如直线、形状、颜色,还会了解一下动画。想想就心动哈~~

1. 准备工作

要让图形和声音在计算机上起作用,这涉及到操作系统和图形卡,还需要大量的底层代码。所以我们可以使用一个名为Pygame的Python模块来提供帮助,具体戳这里:Pygame安装与相关事宜

2. Pygame窗口

开始绘制图形前首先建立一个窗口:

import pygame
pygame.init()
sceen = pygame.display.set_mode([640,480])

运行会弹出一个黑色的窗口
在这里插入图片描述
但是它很快就停止了,在Python中只有程序运行时才会处于打开状态。所以必须保证程序一直运行。

要想保证Pygame事件循环一直运行,一种方法是使用while循环:

import pygame
pygame.init()
sceen = pygame.display.set_mode([640,480])

while True:
    pass

让Pygame窗口可以使用“X”图标关闭:

import pygame,sys
pygame.init()
sceen = pygame.display.set_mode([640,480])

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

3. 在窗口画圆

代码中[640,480]是窗口的大小,表示640像素宽,480像素宽:

import pygame,sys

pygame.init()
sceen = pygame.display.set_mode([640,480])
sceen.fill([255,255,255])
pygame.draw.circle(sceen,[255,0,0],[100,100],30,0)
pygame.display.flip()
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

在我们使用“X”图标将它关闭之前它会一直打开:
在这里插入图片描述

(1) 翻转

对于Pygame窗口中显示的所有内容,Python中的显示对象(如上例中的screen),都会有这些内容的两个副本。这样做的原因是,开始动画时,我们希望动画尽可能流畅,速度尽可能快。所以不必在每次对图形做一个小小的修改是都更新显示。可以做很多修改后再“翻转”到图形的新版本。

可以把两个副本当作一个“当前屏”和一个“下一屏”。当前屏就是我们现在看到的,下一屏是完成“翻转”之后看到的。做完“下一屏”上的修改后,再翻转到下一屏,就能看到这些改变。

(2)如何建立一个圆

如上边的运行结果显示,靠近窗口左上角有一个红色的圆。这是因为pygame.draw,circle( )函数会画一个圆,必须在画之前告诉它以下五件事:

  • 在哪个表面画这个圆(很明显我们定义的是screen)。
  • 用什么颜色来画(在这里用的红色,对应值为[255,0,0])。
  • 在什么位置画(在这里位于[100,100],这里表示从左上角向下100像素再向右100像素的位置)。
  • 圆的大小(这里是30,这是圆的半径,单位是像素)。
  • 线宽(如果width = 0,圆完全是填充的,这里就采用了完全填充)。

像素是“图像元素”的简写。这表示屏幕上或图像中的一点。比如有时我们说的这个屏幕 “分辨率是1024X768” 指的就是计算机屏幕有768行像素,每行有1024个像素。

下边具体说说这五件事:

① Pygame表面

在实际生活中,如果让你画一幅画,你可能会先问“我在哪画?”在Pygame中,我们要在一个表面上画图。显示表面就是我们在屏幕上看到的表面(也就是screen)。不过pygame程序可以有多个表面,可以把图像从一个表面复制到另一个表面。还可以对表面做一些处理,比如旋转或者调整它们的大小。

前面提到,显示表面有两个副本。其实就是显示表面是双缓冲的。正是这个原因,我们不会在屏幕上看到只画了一半的形状和图像。

② Pygame中的颜色

Pygame中使用的颜色系统是很多计算机语言和程序中通用的系统,称为RGB。这里的R、G和B分别代表红、绿和蓝。

美术课上可能讲过,通过结合或混合光的三原色(红、绿和蓝)可以得到任何颜色。计算机也采用了同样的做法。每个颜色对应一个从0到255的数。

如果所有数都是0,就没有任何颜色,这就是全黑。
如果三个数都是255,会将3种颜色的最大亮度混合在一起,这就是白色。
如果颜色是[255,0,0],这就是纯红色,没有绿色和蓝色。
纯绿就是[0,255,0]。
纯蓝是[0,0,255]。
如果所有三个数都一样,比如[150,150,150],会得到某种灰度。数字越小,灰度越深;数字越大,灰度就越浅。

③ 屏幕位置——坐标

这有两个数:一个对应x轴(水平方向),还有一个对应y轴(垂直方向)。在Pygame中、这两个数从窗口左上角的[0,0]坐标开始。

类似[320,240]的一对数,第一个数表示水平方向,即相对左边界的距离,第二个数表示垂直方向,即相对于顶边的距离。

将上例中的[100,100]改为[320,240]再次键入:

import pygame,sys

pygame.init()
sceen = pygame.display.set_mode([640,480])
sceen.fill([255,255,255])
pygame.draw.circle(sceen,[255,0,0],[320,240],30,0)
pygame.display.flip()
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

在这里插入图片描述

④ 形状大小

使用Pygamede的draw函数画形状时,必须指定形状和尺寸,对于圆来说,只有一个尺寸——半径。而像矩形之类的形状,则必须指定长和宽。

Pygame有一种特殊的对象,名为rect(这是“rectangle”的简写),用来定义矩形区域。rect要使用左上角坐标、宽和高来定义:

Rect(left, top, width, height)

这里同时定义了位置和大小:

my_rect = Rect(250, 150, 300, 200)

这会创建一个矩形。它的左上角距离左边界250像素,距离窗口上边界150像素,宽为300像素,高为200像素。即:

pygame.draw.rect(sceen,[255,0,0],[250, 150, 300, 200],0)

把上边程序修改为:

import pygame,sys

pygame.init()
sceen = pygame.display.set_mode([640,480])
sceen.fill([255,255,255])
pygame.draw.rect(sceen,[255,0,0],[250, 150, 300, 200],0)
pygame.display.flip()
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

在这里插入图片描述

我们用Rect(left, top, width, height)创建一个矩形,还可以使用其他一些属性来移动和对齐这个Rect:

  • 4个边:top、left、bottom、right
  • 4个角:topleft、bottomleft、topright、bottomright
  • 每条边的中点:midtop、midleft、midbottom、midright
  • 中心:center、centerx、centery
  • 尺寸:size、width、height

⑤ 线宽

画形状时最后需要指定的一点是线的粗细。在之前的例子中,我们使用的线宽都是0,这会填充整个形状。如果使用不同的线宽,会看到形状的轮廓。

试着把线宽改为2:

pygame.draw.rect(sceen,[255,0,0],[250, 150, 300, 200],2)

运行试试。

⑥ 现代艺术

键入:

import pygame,sys,random

pygame.init()
sceen = pygame.display.set_mode([640,480])
sceen.fill([255,255,255])
for i in range(100):
    width = random.randint(0,255)
    height = random.randint(0,100)
    top = random.randint(0,400)
    left = random.randint(0,500)
    pygame.draw.rect(sceen, [0,0,0], [left,top,width,height], 1)
pygame.display.flip()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

在这里插入图片描述

上边这个程序就是可以随机画100个大小不等、位置不同的矩形,为了更有趣一点,我们再增加上颜色,另外线宽也设为随机:

import pygame,sys,random
from pygame.color import THECOLORS

pygame.init()
sceen = pygame.display.set_mode([640,480])
sceen.fill([255,255,255])
for i in range(100):
    width = random.randint(0,255)
    height = random.randint(0,100)
    top = random.randint(0,400)
    left = random.randint(0,500)
    color_name = random.choice(THECOLORS.keys())
    color = THECOLORS[color_name]
    line_width = random.randint(1,3)
    pygame.draw.rect(sceen, [0,0,255], [left,top,width,height], line_width)
pygame.display.flip()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37369201/article/details/83547107