pygame简单运用总结
Pygame 就是一个游戏库,可以直接用高级语言编写,在python中导入pygame就可以用来写一些小游戏了。 如何开始快速使用pygame的做出游戏呢? 首先,就是了解游戏的运行主要是基于一个窗体,然后在窗体里面添加图片、音频,设计一些事件(像鼠标点击),最后装进循环运行就哦了。
基本窗体编写
import pygame,sys
pygame.init()#实例化
screen = pygame.display.set_mode((400,300))#前长后宽,且必须是列表或元组
pygame.display.set_caption('小游戏初始窗体')#设置标题
screen.fill((0,0,0))#填充颜色,默认是黑色,采用RGB格式
clock = pygame.time.Clock()#设置时钟,控制帧率
while True:
for event in pygame.event.get():#获得事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(0)#这里不加零会弹出异常
pygame.display.update()
clock.tick(50)#50是毫秒
输出结果:
简单来说流程就是引入——初始化——循环——事件处理——更新
插入图片 先要加载图片,加载代码为 banana = pygame.image.load(filename)图片格式支持JPG、PNG、GIF等 其次要知道一个surface对象,surface对象表示所有载入的图像,刚载入的banana就是一个surface,也可以看做是一个图层。其中用get_rect()方法返回一个覆盖图像的矩形对象,这个Rect对象可以看做是一个选区。 bananarect=banana.get_rect() 生成这个外切的矩形能够利用矩形的属性,比如四点坐标和长宽。 介绍一个矩形的move(x,y)方法。 bananarect=bananarect.move(x,y) 即向横轴方向移动x像素,纵轴方向移动y像素。 移动后系统默认在原图片位置填充白色。 screen.fill((0,0,0)) 需要注意的是,pygame中的坐标是y轴向下的。左上角的坐标是(0,0) 最最重要的是要将载入的图像贴在矩形图像上 screen.blit(banana,bananarect) 也可以将bananarect换成一个坐标,相当于贴在了窗体上 screen.blit(banana,(x,y))
实现插入图片和移动
import pygame,sys
pygame.init()#实例化
screen = pygame.display.set_mode((400,300))#前长后宽,且必须是列表或元组
pygame.display.set_caption('香蕉哥')#设置标题
clock = pygame.time.Clock()#设置时钟,控制帧率
banana = pygame.image.load('香蕉.jpg')
bananarect=banana.get_rect()
bananarect.topleft=(0,10)#设置左顶点坐标
speed =1
while True:
for event in pygame.event.get():#获得事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(0)#这里不加零会弹出异常
bananarect=bananarect.move(speed,0)
if bananarect.left <0 or bananarect.right>400:
speed= -speed
screen.fill((0,0,0))
screen.blit(banana,bananarect)
pygame.display.update()
clock.tick(50)#50是毫秒
输出结果:
插入图片的流程就是 载入图片——生成矩形——矩形设置——贴上矩形 当然图片也可以直接操作用,更多时候是生成类,类中设置坐标和图片对象属性,和移动方法。
import pygame,sys
SCREENWIDTH = 800 # 窗口宽度
SCREENHEIGHT = 200 # 窗口高度
FPS = 30 # 更新画面的时间
FPSCLOCk = pygame.time.Clock()
pygame.init()
screen =pygame.display.set_mode([SCREENWIDTH,SCREENHEIGHT])
pygame.display.set_caption('玛丽冒险')
def main():
p1=Map(0,0)
p2=Map(800,0)
while True:
for event in pygame.event.get():#获得事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(0)
p1.map_update()
p1.map_roll()
p1.map_update()
p1.map_roll()
pygame.display.update()
FPSCLOCk.tick(FPS)
#地图加载
class Map():
def __init__(self,x,y):
self.bg=pygame.image.load('小玛丽\image\\bg.png').convert_alpha()
self.x=x
self.y=y
def map_roll(self):
if self.x<=-800:
self.x=800
else:
self.x-= 5
def map_update(self):
screen.blit(self.bg, (self.x, self.y))
main()
输出结果:
插入音频
音频的插入同样要先载入音频
audio = pygame.mixer.Sound(filename)
音频操作就是开和关
audio.play() audio.stop()
常用事件 像开始的退出游戏的代码就是,点击右上角的×的事件,这也是事件的基本模式。
for event in pygame.event.get():#获得事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
键盘敲击事件 pygame中用pygame.KEYDOWN表示键盘敲击事件,每个键对应的名称为pygame.K_X的形式
for event in pygame.event.get():#获得事件
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:#向上
pass
elif event.key == pygame.K_LEFT:#向左
pass
鼠标点击事件 pygame中用pygame.MOUSEBUTTONDOWN表示鼠标点击事件,event.pos 鼠标当前坐标值 event.buttons 鼠标三个键对应状态,1为左键
for event in pygame.event.get():#获得事件
if event.type == pygame.MOUSEBUTTONDOWN:
pass
鼠标移动事件 pygame中用pygame.MOUSEMOTION表示鼠标点击事件。 event.pos 鼠标当前坐标值 event.rel 鼠标相对运动距离 event.buttons鼠标按钮状态
for event in pygame.event.get():#获得事件
if event.type == pygame.MOUSEBUTTONDOWN:
pass
鼠标释放事件 pygame中用pygame.MOUSEBUTTONDOWN表示鼠标点击事件,event.pos 鼠标当前坐标值
for event in pygame.event.get():#获得事件
if event.type == pygame.MOUSEBUTTONDOWN:
pass
一些补充 屏幕绘制 pygame的窗体只有一个屏幕,通过display的方法来设置 列举一些常用的 pygame.display.set_mode(r=(x,y),flags=0) #设置屏幕大小 r是分辨率,flags是控制显示类型 pygame.display.Info #生成屏幕相关信息
python #获取电脑屏幕的分辨率 pre_info = pygame.display.Info() size = width, height =pre_info.current_w, pre_info.current_h pygame.display.set_caption() #设置标题信息 pygame.display.set_icon() #设置图标信息 pygame.display.get_active() #感知是否最小化,屏幕发生改变时,返回True pygame.display.filp() #刷新窗体 pygame.display.update() #刷新窗体
图形绘制 pygame.draw 图形绘制后,返回一个矩形Rect表示该形状
绘制矩形 pygame.draw.rect(Surface,color,Rect,width) Surface 一般指屏幕 Rect分别是左顶点x坐标,y坐标,宽度,高度 width 边缘宽度,默认为零,即填充图形 rect= pygame.draw.rect(screen,(255,255,255),(200,200,100,100),0)
绘制多边形 pygame.draw.polygon(Surface,color,pointlist,width) pointlist 多边形顶点坐标列表
文字绘制 pygame.freetype 通过像素绘制字体点阵图 直接上代码
import pygame,sys
import pygame.freetype
pygame.init()
screen = pygame.display.set_mode((400,300))
pygame.display.set_caption('绘制字体')
GOLD = 255,251,0
f=pygame.freetype.Font("C:\\Windows\\Fonts\\msyh.ttc",36)
frect=f.render_to(screen,(100,100),'不知所云',fgcolor=GOLD,size=50)
while True:
for event in pygame.event.get():#获得事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(0)#这里不加零会弹出异常
pygame.display.update()
结果:
Sprite/group 类 pygame.sprite.Sprite 是一个特殊的类 含有两个属性,Surface和Rect 和一个方法update 生成类似的对象是可以用这个类继承
import pygame
from pygame.sprite import Sprite,Group
class Gameobj(Sprite):
def __init__(self,image_filename,init_pos,speed=10):
super().__init__()
self.image = pygame.image.load(image_filename)
self.rect = self.image.get_rect()
self.rect.midbottom = init_pos
self.speed=speed
def update(self, *args):
self.rect.y += self.speed
pygame.sprite.Group() 这个类可以存储多个对象 有五个方法: init(self,sprite) 构造精灵组 add(self,sprite) 添加 sprite() 返回所有列表 update() draw() 让组内的对象完成更新和绘制
Gameobj1s = pygame.sprite.Group()#生成组
Gameobj2s = pygame.sprite.Group()
while True:
if True:
obj1 = Gameobj(image_filename,init_pos,speed=10)
Gameobj1s.add(obj1)
if True:
obj2 = Gameobj(image_filename,init_pos,speed=10)
Gameobj2s.add(obj2)
# 两个精灵之间碰撞效果处理
if pygame.sprite.collide_circle(obj1, obj2):
pass
for event in pygame.event.get():#获得事件
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(0)#这里不加零会弹出异常
pygame.display.update()
groupcollide()方法: group=pygame.sprite.groupcollide(Gameobj1s, Gameobj2s, 1, 1) Gameobj1s组中碰撞的对象返回一个组group Sprite/group的好处就是有大量实体时,可以分组管理,处理碰撞时很方便。