文章目录
第一节:关于pygame
pygame库
Pygame 是python game的缩写,Pygame是一个包含图像、声音,建立在SDL基础上的、专门用于制作和开发图形化的计算机游戏库,SDL(全名Simple DirectMedia Layer),传言是Sam Lantinga写的,为了让Loki(致力于向Linux上移植Windows的游戏的一家大好人公司,已经倒闭)更有效的工作,创造了pygame.,但百度说作者是Pete Shinners,具体读者可再深究确定。
Pygame就是Python中使用它的一个库(或者称模块)。Pygame已经存很长的时间,一直都在更新和完善中。使得游戏制作变得非常容易和简单
pygame的安装
pygame不是python所附带的,需要第三方库的支持和下载。但它可以完全免费地使用。
【方式一】正常下载
点击在线下载网址: https://pygame.org.
注:需根据不同的操作系统及所安装的python版本,选择正确的安装程序
windows系统:下载相对应的python版本的msi文件。例:pygame-1.9.1.win32-py3.2.msi
Mac系统:下载.zip文件或.dmg文件并运行它们。
Linux系统:打开终端并运行“sudo apt-get install python-pygame”
【方式二】推荐下载
在pycham或其他编缉器、或直接电脑终端输入下面代码,等下载进度条完成后就OK
pip3 install pygame
pygame的使用
使用pygam库和其他模块一样,直接使用import 就可以了,但是值得注意的是pygame模块除了封装了固定的函数之外,还对部份的变量和常量进行了设置,因此在调用pygame模块的同时,一般也会把pygame.locals也一起调用,方便后续常量的操作。
import pygame
from pygame.locals import *
# 电脑检查工具包是否完整
pygame.init()
第二节:搭建游戏界面
游戏的窗口
在pygame中,所有的游戏都需要一个窗口进行演示,称为“游戏的舞台”
pygame.display.set_mode( (x, y) ) ———— 窗口设置,参数x、y指的是窗和高,需元组类型
pygame.display.set_caption("标题") ———— 设置窗口标题,标题名为字符串
游戏循环与游戏状态
在pygame游戏制作中,常常会使用到循环——
while True
,该循环会处理以下三个事情:
1、循环地监听用户的按键或控制操作,并做出反应
2、循环地更新游戏的状态。
3、根据用户操作或代码运行,循环地绘制游戏状态或内容。
直到主动或被动地终此循环,以此保证实时画面的进行。
import pygame
form pygame.locals import *
pygame.init( )
# 设置游戏的窗口
screen = pygame.display.set_mode((400,400))
# 设置窗口的标题
pygame.display.set_caption("我的游戏窗口")
# 开启游戏循环
while True:
#下面是保证窗口安全退出条件(必写)
all_event = pygame.event.get()
for e in all_event:
if e.type == QUIT:
exit()
运行结果:
窗口的背景色
前期的内容中,也讲过颜色的表示方法,除了颜色的单词外,还可以使用光的三颜色:红®、绿(G)、蓝(B).通过3种颜色不同的量组合成任何颜色。颜色的量值最低为0,最高为255.pygame的有关颜色的内容,也多用此方法表示颜色。
要对窗口进行背景色的设置,便要了解Surface的概念。Surface是“表面”的意思,也是pygame的Surface对象,可以理解为如果你想对窗口进行颜色的设置,必须创建一个可以除上颜色的对象,然后把它粘贴在窗口上。
.
【常用API】
Surface.fill(( r, g, b )) ———— 填充颜色,背景的Surface,一般都是窗口下创建的对象
pygame.display.update() ———— 刷新窗口
例:蓝色背景的窗口
import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((700, 500))
# 屏幕对象填充背景色
screen.fill( ( 0, 0, 255) )
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
pygame.display.update() #刷新
运行结果:
刷新窗口
pygame创建Surface对象后,需要对窗口进行刷新,否则对象将不可见。pygame有几个可以刷新窗口的方法。但常见的只有两种。
.
pygame.display.update() ———— 刷新窗口
Surface.display.flap( ) ———— 效替弹出。flap就是弹出的意思,除了正常的刷新功能,在双缓冲模式下,flip()可用来切换活动屏幕和缓冲区(这里不再做介绍)。
例:蓝色背景的窗口(新的刷新方式)
import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((700, 500))
# 屏幕对象填充背景色
screen.fill( ( 0, 0, 255) )
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
# 交替显示
pygame.display.flip( )
运行结果:
第三节:事件的发生与铵钮状态
监听事件
游戏循环可以不断地监听用户的按键或控制操作,并做出反应。用户的每一个动作都可以称为一个事件,当这些动作发生时,Pygame库就会创建一个
pygame.enent.Event对象
来记录事件的发生。这便是程序的监听。
pygame.event.get() ———— 获取事件,返回是列表,监控并记录着用用户的操作过的事情
import pygame
from pygame.locals import *
pygame.init( )
screen = pygame.display.set_mode((400,400))
while True:
# 获取所有事件,返回事件列表
all_event = pygame.event.get()
print(all_event)
for e in all_event:
if e.type == QUIT:
exit()
运行结果:(手动按了一推按钮。。。)
常见的事件
**事件的触发属于哪种事件,可以使用
e.type
进行查看,实即上pygame早就定义了一些变量对这些事件进行了命名,还对它们进行了赋值。值与常量是等效的 **
例:退出也是一个操作事件,就是常量是Quit,对应值是12
import pygame
from pygame.locals import *
pygame.init( )
screen = pygame.display.set_mode((400,400))
while True:
all_event = pygame.event.get()
for e in all_event:
print(e.type)
if e.type == QUIT: #或者写 if e.type == 12: 也可
exit()
运行结果:
安全退出条件
基实我们已经接触了安全退出条件了,QUIT是pygame.locals的常量。有了它点击关闭按钮时就可以正常退出程序。pygame.event.get()可以返回一个列表,用于检测按钮的状态。而每一种可能发生的按钮状态类型,其实在pygame.locals中都有一个常量变量。e.type == QUIT就是判断是否发生了 QUIT这个退出按钮。除了exit(),还有
quit()
也可以安全退出程序.
【区别】
quit()调用的是pygame库的退出方法,终止pygame的使用。而exit()则是调用系统库的方法直接退出程序。
例:使用quit()
import pygame
from pygame.locals import *
pygame.init( )
screen = pygame.display.set_mode((400,400))
while True:
all_event = pygame.event.get()
for e in all_event:
if e.type == QUIT:
quit( )
按钮状态
**事件,可以描述用户到底执行了何种操作,监听可以记录所有用户的的操作和顺序,但具体的操作是无法再进行描述的。比如按钮的按下和弹起事件,具体按下了键盘上的哪一个按钮。pygame对此常常会进一步使用按钮状态来进行描述。
pygame.mouse.get_pressed( ) ———— 鼠标按钮检测,返回一个三元组对象
pygame.mouse.get_pos( ) ———— 鼠标坐标检测,返回一个元组对象,指的是窗口内的像素座标
pygame.key.get_pressed( ) ———— 键盘按钮检测,返回一个布尔值长元组。这个元组的元素就是键值,对应的就是按键是否按下。
**
例1:获取鼠标的按钮状态
import pygame
from pygame.locals import *
pygame.init( )
screen = pygame.display.set_mode((400,400))
while True:
all_event = pygame.event.get()
for e in all_event:
if e.type == QUIT:
exit()
# 如果发生了鼠标按下事件
elif e.type == MOUSEBUTTONDOWN:
#获取鼠标的按钮状态
pre = pygame.mouse.get_pressed()
print( pre )
运行结果:(鼠标一堆操作后。。。)
例2:获取鼠标坐标位置
import pygame
from pygame.locals import *
pygame.init( )
screen = pygame.display.set_mode((400,400))
while True:
all_event = pygame.event.get()
for e in all_event:
if e.type == QUIT:
exit()
# 如果发生了鼠标移动事件
elif e.type == MOUSEMOTION:
#获取鼠标的坐标位置
pos = pygame.mouse.get_pos()
print(pos)
运行结果:
例3:获取键盘按钮状态(这里按下了Esc键为例)
import pygame
from pygame.locals import *
pygame.init( )
screen = pygame.display.set_mode((400,400))
while True:
all_event = pygame.event.get()
for e in all_event:
if e.type == QUIT:
exit()
# 获取所有键盘按钮状态
keys = pygame.key.get_pressed()
print(keys)
print(len(keys))
常见的键盘常量
当我们按下并释放键盘按钮时,会触发pygame .KEYDOWN和 pygame .KEYUP事件,并形成一个列表。这两个事件都有一个 key属性,该属性系统都对它们设定了一个常量作为名字,代表键盘上的每个键,这叫键盘常数,键盘常数很多,以下是所有键盘常量的列表。
例:对keys的K_ESCAPE所代表的按键状态进行监听,如果发生了变化,立即打印出一句话“Esc键被按下了”
import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((500, 500))
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
keys = pygame.key.get_pressed()
if keys[K_ESCAPE]:
print("Esc键被按下了")
print(keys)
运行结果:
小游戏01:变色的鼠标
import os, pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((255, 250))
pygame.display.set_caption("Alien Invasion")
# 创建字体对象,设置字体样式和大小
font = pygame.font.Font(None, 30)
# 设置文字内容和颜色
text = font.render('Cliked Me please!!!', True, (34, 252, 43))
# 初始化空坐标
x = 0
y = 0
while True:
for e in pygame.event.get():
if e.type == QUIT:
exit()
# 鼠标按下事件
elif e.type == MOUSEBUTTONDOWN:
# 检测鼠标按键,返回元组对象
pressed_array = pygame.mouse.get_pressed()
if pressed_array == (1, 0, 0):
print("你按下了鼠标左键!")
elif pressed_array == (0, 0, 1):
print("你按下了鼠标右键!")
elif pressed_array == (0, 1, 0):
print("你按下了鼠标滚轮!")
else:
print("你滑动了鼠标的滚轮")
elif e.type == MOUSEMOTION:
# 获取鼠标在窗口处的坐标
pos = pygame.mouse.get_pos()
x = pos[0]
y = pos[1]
print(x, y)
# 根据坐标改变红色和绿色
screen.fill((x, y, 0))
# 绘制文字
screen.blit(text, (40, 100))
# 把绘制的效果显示在屏幕上
pygame.display.update()
运行结果:
第四节:绘制精灵
精灵的绘制
1、加载精灵
所谓“精灵”,这里其实指是就是图片的意思。其实我们所玩的游戏里面的角色都是一张张的图片。Pygame它能够从png、jpg、gif、bmp等图像文件中,通过pygame.image.load()的方法,将图像加载到Surface(表面)上。Image是图像,而load是加载的意思。加载图片需要在括号里传递图片字符串路径,它会返回一个图片Surface对象。
另外,在Pygame中,仅仅加载图片是无法在游戏窗口显示的,还需要把加载好的图片绘制出来并更新.这就要用到screen.blit()的方法
pygame.image.load(path)————加载图片,需要传递图片字符串路径,返回一个图片Surface对象。
screen.blit(imgName,(x,y)) ———— 传输(绘制)图片
pygame.display.update() ———— 画面更新
例:绘制当前目录下的images文件夹的三张图片
import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((960, 720))
# 分别加载三张图片
db = pygame.image.load( 'images/地堡.png' )
zom = pygame.image.load( 'images/Zombie.png' )
me = pygame.image.load( 'images/me.png' )
while True:
for event in pygame.event.get( ):
if event.type == QUIT:
exit()
#分别绘制三张图片
screen.blit(db, (0, 0))
screen.blit(zom, (100, 300))
screen.blit(me, (500, 100))
# 刷新游戏
pygame.display.update()
运行结果:
2、初始化位置
在Pygame中,角色往往都是会移动的、可操控的,对非固定的角色,位置坐标需要初始化,这样移动时可根据变量改变坐标的位置。
例:初始化人物坐标位置(修正上例)
import pygame
from pygame.lo