pygame功能
- 绘制图形
- 显示图片
- 实现动画效果
- 与键盘、鼠标、游戏手柄这些外设交互
- 播放声音
- 碰撞检测
前提
首先为了方便理解首先要搞清楚几点问题。
-
什么是Surface对象?
Surface对象就是pygame里面用来表示图像的对象。 -
将一个图像绘制到另一个图像上是怎么一回事?
pygame里并不是将一个图像复制到另一个图像上,这里我们分为目标图像A和画布B,实际上是将画布B上一个矩形范围的颜色变成图像A的颜色,这样就像是A覆盖到了B上。 -
移动图像是怎么一回事?
图像的移动涉及到一个概念:帧。通常一副图像指一帧,帧率就是一秒钟切换多少图像。
移动图像分三步理解:
第一步,将要移动的目标图像A的矩形移动到目的位置。
第二步,刷新画布,再将目的位置的矩形填充为A的颜色。(此步在内存中进行)
第三步,将内存中做好的图片展示。
以上三步完成一帧变换,帧率高了以后就是图像的移动。 -
如何控制游戏的速度?
可以通过time模块设置帧率。 -
pygame的效率高不高?
python简洁却效率不高,但是pygame里面许多模块是C语言编写优化的,可达到40~200帧,一般30帧是可接受的流畅度。
代码
import pygame
import sys #退出程序需要
#初始化pygame
pygame.init()
clock = pygame.time.Clock()
size = (width,height) = (600,400)
#一帧移动速度
speed = [2,1]
#三原色值都为255时为白色
bg = (255,255,255)
#设置窗口为size大小,返回的是Surface对象
screen = pygame.display.set_mode(size)
#设置窗口标题
pygame.display.set_caption("小乌龟")
#加载图片,返回的是Surface对象
turtle = pygame.image.load("turtle.jpg")
#获得图像位置矩形
position = turtle.get_rect()
while True:
#事件循环
for event in pygame.event.get():
#如果事件为点了窗口的关闭
if event.type ==pygame.QUIT:
sys.exit()
#以speed速度移动图像
position = position.move(speed)
#如果位置矩形左右碰到边界
if position.left < 0 or position.right > width:
#图像水平方向翻转,垂直方向不变
turtle = pygame.transform.flip(turtle,True,False)
#反方向移动,碰到左边界往右移动,碰到右边界往左移动
speed[0] = -speed[0]
#如果位置矩形上下碰到边界
if position.top < 0 or position.bottom > height:
#反方向移动就行了
speed[1] = -speed[1]
#填充背景
screen.fill(bg)
#绘制图像,此步和上一步在内存中完成,图做出来后再贴出来
screen.blit(turtle,position)
#更新界面
pygame.display.flip()
#帧切换延迟10毫秒
#pygame.time.delay(10)
#帧率不高于100帧
clock.tick(100)
注意:这里有的小伙伴可能会有问题,要把准备好的素材turtle.jpg和py文件放在一个文件夹里。
效果图
改进
添加事件功能,实现键盘控制小乌龟。
在开头添加语句from pygame.locals import *,引用pygame所有变量
并在事件循环中添加以下代码
#如果事件为按键盘
if event.type == pygame.KEYDOWN:
if event.key == K_LEFT:
speed = [-1,0]
turtle = l_head
if event.key == K_RIGHT:
speed = [1,0]
turtle = r_head
if event.key == K_UP:
speed = [0,-1]
if event.key == K_DOWN:
speed = [0,1]