Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由高级语言提供。

Pygame的编程其实可以理解为循环加事件实现。

安装:

pip3 install pygame

测试:(可忽略)

python -m pygame.examples.aliens

画一个厉害的画玩玩:

生成一个最简窗口:

 import pygame  # 导入pygame库
from sys import exit # 导入sys库中的exit函数 # 初始化pygame
pygame.init() #创建一个窗口,参数((宽度,高度))
screen = pygame.display.set_mode((700,450))
# 设置窗口标题
pygame.display.set_caption("东小东游戏窗口") # 载入背景图
background = pygame.image.load('imgx/wa.jpg') # 事件循环
while True:
# 绘制背景
screen.blit(background, (0, 0)) # 更新屏幕
pygame.display.update() # 所有事件的监听,处理
for event in pygame.event.get():
# 游戏退出事件
if event.type == pygame.QUIT:
# 退出程序
exit()

画画实现:

实现文字显示、事件监听、画大部分图形,其中显示文字时需要中文字体库支持,可直接将对应的字体拷贝到目录下,方便程序的移植,而不要固定写Windows字体库的路径,所以相对路径是最好的解决方法。

Windows文字库所在位置:C:\Windows\Fonts

 import pygame  # 导入pygame库
from sys import exit # 导入sys库中的exit函数
from math import pi
import pygame.freetype # 初始化pygame
pygame.init()
#创建一个窗口,参数((宽度,高度))
screen = pygame.display.set_mode((700,450))
#设置窗口标题
pygame.display.set_caption("东小东游戏窗口") #颜色对象,参数(R,G,B,Alphal)
co1=pygame.Color(255,255,20,10)
co2=pygame.Color(255,0,0,255)
co3=pygame.Color(0,255,0,255)
cotextbg=pygame.Color(0,255,0,200)
cotext=pygame.Color(255,255,255,255) # 填充背景色
screen.fill(co1) #显示文字方法1,需要一直刷新
#绘制文字,参数(字体,默认大小)
#ftext111=pygame.font.SysFont("arial", 16)
#参数:(文字,是否取消锯齿,前景色,背景色)
#textviewx111=ftext111.render("wwww",True,(100,100,50),(0,255,255,50)) #绘制文字222,不能使用中文路径,参数(字体,默认大小),返回矩形对象
ftext222=pygame.freetype.Font("fontx/fontext.ttf",20)
#方法2
#参数(窗口,左上角位置,文字,前景,背景,旋转角度[0,359],大小),返回矩形对象
textrect222=ftext222.render_to(screen,(620,420),"东小东",fgcolor=cotext,bgcolor=cotextbg,rotation=0,size=20)
#方法3,需要一直刷新,返回viwe和矩形对象
texview333,texrect333=ftext222.render("东小东2",fgcolor=cotext,bgcolor=cotextbg,rotation=20,size=50) #------ 以下形状都会返回矩形对象 --------
# 绘制矩形,参数(窗口,颜色,(左上角x,左上角y,w,h),宽度),宽度为0 则填充
rectx = pygame.draw.rect(screen, (255,255,255), (330, 289, 30, 20), 0)
rectx = pygame.draw.rect(screen, (255,255,255), (380, 289, 30, 20), 0)
rectx = pygame.draw.rect(screen, co2, (270, 270, 200, 50), 5)
# 绘制圆形,参数(窗口,颜色,圆形坐标(x,y),半径,宽度)
circlex = pygame.draw.circle(screen, co2, (250, 200), 50, 0)
circlex = pygame.draw.circle(screen, co2, (450, 180), 50, 1) # 绘制直线,参数(窗口,颜色,起点坐标(x,y),结束点坐标,宽度)
#linex = pygame.draw.line(screen, co2, (20, 20), (100, 30), 1)
# 无锯齿线,斜线去掉锯齿
#aalinex = pygame.draw.aaline(screen, co2, (30, 30), (100, 50), 1) # 椭圆,使用外切矩形画,参数(窗口,颜色,矩形的(左上角x,左上角y,w,h),宽度
ell = pygame.draw.ellipse(screen, co2, (100, 40, 500, 350), 1) # 绘制多线,第一的结束点必然会连接第二的起始点...
# 列表参数为:第一条直线起始点,第一条直线结束点,第二条.....
#listline = [(10, 100), (10, 200), (20, 100), (20, 300)]
# 参数false表示结束点是否要连接最开始的起始点
#linexss = pygame.draw.lines(screen, co2, False, listline, 2) # 绘制弧线
alrectx = pygame.draw.arc(screen, co3, (344, 244, 60, 20), 0 * pi, 1 * pi, 3) # 事件循环
while True:
#显示文字方法1
#screen.blit(textviewx111,(20,20))
#显示文字方法3
#screen.blit(texview333,(200,200)) # 更新屏幕
pygame.display.update()
# 所有事件的监听,处理
for event in pygame.event.get():
# 游戏退出事件
if event.type == pygame.QUIT:
# 退出程序
exit()

壁球小游戏基本实现及Pygame的其他内容补充:

 import pygame  # 导入pygame库
from sys import exit # 导入sys库中的exit函数
# 初始化pygame
pygame.init() #定义窗体的宽高
winWidth=700
winHeight=450 #定义图片每次移动的x,y轴像素
ballX=1
ballY=1 #刷新最大帧速率,while循环的速度
fpsx=19 #初始化帧速率对象
timefpsx=pygame.time.Clock() #全屏显示需调用函数
#获取到电脑屏幕的大小并赋值给窗口大小
def setfull():
global winHeight,winWidth
winRoot=pygame.display.Info()
winWidth=winRoot.current_w
winHeight=winRoot.current_h #创建一个窗口,参数((宽度,高度),显示模式)
#显示模式 mod=pygame.RESIZABLE #屏幕大小可调,需监听pygame.VIDEORESIZE事件 #mod=pygame.NOFRAME #无边框 #mod=pygame.FULLSCREEN #全屏,需打开下面setfull函数
#setfull() screen = pygame.display.set_mode((winWidth,winHeight),mod) # 设置窗口标题及标题内容
pygame.display.set_caption("东小东游戏窗口--壁球")
#设置标题图片
titleiconx=pygame.image.load("imgx/yzm.jpg")
pygame.display.set_icon(titleiconx) # 载入背景图
backgroundx = pygame.image.load('imgx/wa.jpg') #载入需要移动的图片
ballimgx=pygame.image.load("imgx/ball.png")
#生成与对象外切的矩形,生成的矩形对象可以获取到x,y,宽高的信息
ballrectx=ballimgx.get_rect() # 事件循环
while True:
#设置帧速率
timefpsx.tick(fpsx)
# 绘制背景
screen.blit(backgroundx, (0, 0)) #判断窗口是否被显示,如果最小化则为false
if pygame.display.get_active():
#移动图片,参数(x轴每次移动像素,y轴每次移动像素)
ballrectx=ballrectx.move(ballX,ballY) #判断图片是否移动到边缘,达到边缘时将移动的X或Y方向取反
if ballrectx.left<0 or ballrectx.right>winWidth:
ballX=-ballX
if ballrectx.top<0 or ballrectx.bottom>winHeight:
ballY=-ballY #绘制移动的图片
screen.blit(ballimgx,ballrectx) # 更新屏幕
pygame.display.update() # 所有事件的监听(事件队列只能缓存128个事件),处理
for event in pygame.event.get():
# 游戏退出事件
if event.type == pygame.QUIT:
# 退出程序
exit() #鼠标事件
#鼠标按下事件
if event.type == pygame.MOUSEBUTTONDOWN:
print("鼠标按下,坐标为:",event.pos,",鼠标按下键为:",event.button)
#鼠标抬起事件
if event.type == pygame.MOUSEBUTTONUP:
print("鼠标抬起")
#鼠标移动
if event.type ==pygame.MOUSEMOTION:
print("鼠标移动中......当前坐标:",event.pos,"相对位置:",event.rel,"鼠标三键状态:",event.buttons) #键盘按键事件,字母只会输出小写的编码
#键盘按下按键事件
if event.type ==pygame.KEYDOWN:
print("键盘按下键为:",event.key,"按键按下的模式标志为:",event.mod)
#如果按下ESC键则退出程序
if event.key==27:
exit()
#游戏处理:上(273)、下(274)、左(276)、右(275)
#实现按下哪个方向按键即向哪个方向移动
if event.key == 273:
ballY =-1*abs(ballY)
elif event.key == 274:
ballY=abs(ballY)
elif event.key ==276:
ballX=-1*abs(ballY)
elif event.key ==275:
ballX=abs(ballX)
if event.key == 32:#空格键,使无边框
screen = pygame.display.set_mode((winWidth, winHeight),pygame.NOFRAME) if event.type == pygame.KEYUP:
print("键盘按键抬起:",event.key) if event.type ==pygame.VIDEORESIZE:
print("屏幕大小有改变:",event.size)
winWidth=event.size[0]
winHeight=event.size[1]
screen = pygame.display.set_mode((winWidth, winHeight), mod)

自定义事件处理:

可绑定标准事件,但传递参数不一定需要标准,可在标准事件捕获到自定义事件:

 eventx=pygame.event.Event(pygame.KEYDOWN,{"ww":33})
pygame.event.post(eventx) # 所有事件的监听,处理
for event in pygame.event.get():
if event.type ==pygame.KEYDOWN:#键盘按键事件
print(event.ww) #输出33

Pygame官网:https://www.pygame.org/docs/

参考:嵩天教授的Python游戏开发教程(pygame)

Python 游戏之旅(Pygame)的更多相关文章

  1. Python游戏开发:pygame游戏开发常用数据结构

    一.数组与列表 数组可以理解为简化的列表.像我们之前使用的pygame.sprite.Group这样的精灵组,也是一个列表.列表的元素是可变的,它具有添加.删除.搜索.排序等多种方法. 1.一维列表 ...

  2. python游戏开发:pygame事件与设备轮询

    一.pygame事件 1.简介 pygame事件可以处理游戏中的各种事情.其实在前两节的博客中,我们已经使用过他们了.如下是pygame的完整事件列表: QUIT,ACTIVEEVENT,KEYDOW ...

  3. python游戏开发:pygame中的IO、数据

    一.python输入输出 1.输出 python一次可以打印多个变量,只要用一个逗号将每个变量隔开就可以了.比如: A = 123B = "ABC"C = 456D = " ...

  4. python编程学习--Pygame - Python游戏编程入门(0)---转载

    原文地址:https://www.cnblogs.com/wuzhanpeng/p/4261015.html 引言 博客刚开,想把最近学习的东西记录下来,算是一种笔记.最近打算开始学习Python,因 ...

  5. Pygame - Python游戏编程入门(0) 转

    博客刚开,想把最近学习的东西记录下来,算是一种笔记.最近打算开始学习Python,因为我感觉Python是一门很有意思的语言,很早以前就想学了(碍于懒),它的功能很强大,你可以用它来做科学运算,或者数 ...

  6. 180分钟的python学习之旅

    最近在很多地方都可以看到Python的身影,尤其在人工智能等科学领域,其丰富的科学计算等方面类库无比强大.很多身边的哥们也提到Python非常的简洁方便,比如用Django搭建一个见得网站只需要半天时 ...

  7. Python游戏编程入门

    <Python游戏编程入门>这些文章负责整理在这本书中的知识点.注意事项和课后习题的尝试实现.并且对每一个章节给出的最终实例进行分析和注释. 初识pygame:pie游戏pygame游戏库 ...

  8. Python游戏开发入门

    Pygame简介与安装 1.Pygame安装 pip install pygame2.检测pygame是否安装成功 python -m pygame.examples.aliens Pygame最小开 ...

  9. 《Python游戏编程快速上手》|百度网盘免费下载|Python基础编程

    <Python游戏编程快速上手>|百度网盘免费下载| 提取码:luy6 Python是一种高级程序设计语言,因其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言. 本书通过编写一个个 ...

随机推荐

  1. Java 中12个原子操作类

    从JDK1.5 开始提供了 java.util.concurrent.atomic 包,该包提供了一种用法简单.性能高效.线程安全的更新一个变量的方法 原子更新基本类型类 AtomicBoolean: ...

  2. 通过该源码修改vim颜色和pudb调试器的代码颜色的方法

    2019-02-19,18点20vim调整颜色vim ~/.vimrc 这个pudb的配色用上的方法改不了.调试状态时候按o和回车能切换console和调试界面. 成功了.通过修改pudb源代码来实现 ...

  3. vscode+MinGW+cmake设置轻量ide

    本地随手写一些题目的时候,发现visual studio非常庞大emmm vscodevscode是一个轻量编辑器 (1)vscode插件与设置自动同步 在两个电脑上,用vscode可以同步插件 ,利 ...

  4. mysql创建新的用户及flush privileges解析

    1.首先以root用户登录到mysql mysql -u root -p 2.接着要知道mysql的用户信息是存储在mysql.user(mysql数据库下的user数据表)下的,所以我们只需添加一个 ...

  5. 使用 mybatis plus 动态数据源

    1.pom.xml 增加 <dependency> <groupId>com.baomidou</groupId> <artifactId>dynami ...

  6. s6-4 TCP 数据段

    传输控制协议  TCP (Transmission Control Protocol) 是专门为了在不可靠的互联网络上提供可靠的端到端字节流而设计的  TCP必须动态地适应不同的拓扑.带宽.延迟. ...

  7. Python的list循环遍历中,删除数据的正确方法

    在遍历list,删除符合条件的数据时,总是报异常,代码如下: num_list = [1, 2, 3, 4, 5] print(num_list) for i in range(len(num_lis ...

  8. anemometer安装

    1.背景介绍:nginx:1.9.3 安装路径/data/nginxphp:5.5.27 安装路径 /data/phpmysql:5.7.18 安装路径/usr/local/mysql软件下载目录 / ...

  9. python项目1:自动解压并删除压缩包

    目的:实现压缩包的自动解压及删除. 思路:获取压缩包 > 解压 > 删除压缩包 代码实现:此处代码实现前提为.py文件和压缩包在同一文件夹 # 导入需要的包 import os impor ...

  10. SqlServer 连接 相关。

    sqlserver数据库连接池是一个客户端的东西.和sql server服务器无关. 各种provider默认的连接池大小不同. 比如:Ado.NET 中sqlserver 连接池默认的值是100. ...