Bootstrap

pygame入门教程-基础篇

1. 画布surface

我们先启动一个窗口

import pygame
pygame.init() # 初始化
screen = pygame.display.set_mode((800,600)) # 设置窗口的大小
pygame.display.set_caption("这是一个给我们画画用的窗口") # 设置窗口的title
pygame.quit()

我们通过screen = pygame.display.set_mode((800,600)) 设置了一个窗口,并且返回了一个screen的变量,这个变量的类型是pygame.Surface,也就是一个画布。我们基于这个画布来作画,例如加载一个图片到这个画布上,或者绘制一个圆。

2. 绘制一个圆

我们发现这个窗口一闪而过,什么也没看清。因为加载完变量就释放掉了,我们加一个循环,让其等待10s。

import pygame
import time

pygame.init()
screen = pygame.display.set_mode((800,600))

pygame.display.set_caption("这是一个给我们画画用的窗口")
pygame.draw.circle(screen,(255,0,0),(200,300),20)

for _ in range(10):
    time.sleep(1)

pygame.quit()

可以看到过了10s这个黑框才关闭掉,由于sleep和绘制都在同一个线程中,发现页面会处于卡死状态。同时发现调用pygame.draw.circle绘制的圆也没有出现,这是因为我们没有调用绘制函数。

pygame.draw.circle(Surface, color, pos , raduis, width)

通常情况下,我们会绘制各种各样的图形,如果画一个刷新一个就会导致效率很低,所以一般情况下都是把所有的东西绘制完成之后再统一进行刷新。

import pygame
import time

pygame.init()
screen = pygame.display.set_mode((800,600))

pygame.display.set_caption("这是一个给我们画画用的窗口")
pygame.draw.circle(screen,(255,0,0),(200,300),20)
pygame.draw.circle(screen,(255,0,0),(300,200),20)
pygame.display.update()

for _ in range(10):
    time.sleep(1)


pygame.quit()

3. 绘制变化大小的圆

现在我们想要绘制一个圆,这个圆的大小可以变化,这很简单,只要不断改变圆的半径就可以了。圆的半径变大了,也就是说绘制的内容发生了变化,因此我们需要更新画布

import pygame
import time

pygame.init()
screen = pygame.display.set_mode((800,600))
pygame.display.set_caption("这是一个给我们画画用的窗口")

r = 20
for _ in range(10):
    time.sleep(1)
    pygame.draw.circle(screen,(255,0,0),(200,300),r)
    r += 10
	pygame.display.update()

pygame.quit()

等了10s又退出来,反正我们要一直现实,就改成死循环,你会发现圆是变大了,但是程序却退不出来了

r = 20
while True:
    pygame.draw.circle(screen,(255,0,0),(200,300),r)
    r += 1
    pygame.display.update()

pygame.quit() # 由于死循环,所以执行不到这一步

4. 事件

pygame提供了事件来与用户进行交互,例如点击鼠标,打字等等。所有的事件都会放到pygame的事件队列中,我们只要不断读取这个队列就可以了

r = 20
while True:
    for event in pygame.event.get():  # 遍历事件
        if event.type == pygame.QUIT:  # 退出事件
            pygame.quit()
    pygame.draw.circle(screen,(255,0,0),(200,300),r)
    r += 1
    pygame.display.update()

当我们发现有关闭事件的时候就退出pygame。但是通常不会这么写,直接退出pygame会导致我们有些资源可能来不及释放,所以通常会写成

r = 20
going = True
while going:
    for event in pygame.event.get():  # 遍历事件
        if event.type == pygame.QUIT:  # 退出事件
            going=False
    pygame.draw.circle(screen,(255,0,0),(200,300),r)
    r += 1
    pygame.display.update()
pygame.quit()

5. 刷新率

我们发现这个圆变得太快了,加一个延时缓一缓,例如每隔0.1s在进行刷新

r = 20
going = True
while going:
    for event in pygame.event.get():  # 遍历事件
        if event.type == pygame.QUIT:  # 退出事件
            going=False
    pygame.draw.circle(screen,(255,0,0),(200,300),r)
    r += 1
    pygame.display.update()
    time.sleep(0.1)
pygame.quit()

pygame给我们提供了一个clock对象可以用来控制刷新的频率

clock = pygame.time.Clock() # 创建一个clock对象
r = 20
going = True
while going:
    for event in pygame.event.get():  # 遍历事件
        if event.type == pygame.QUIT:  # 退出事件
            going=False
    pygame.draw.circle(screen,(255,0,0),(200,300),r)
    r += 1
    pygame.display.update()
    clock.tick(10) # 刷新频率为10,也就是1s刷新10次,每个100ms刷新一次
pygame.quit()
;