ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
本节课程主要讲解乐Pygame的一些常用对象及操作,如果要深入了解,可以参考[Pygame官方文档](http://www.pygame.org/docs/)。 ## pygame简介 Pygame提供使用图形用户界面或GUI创建程序的功能。使用基于图形的GUI的程序可以代替基于文本的CLI显示带有图像和颜色的窗口。 ## 安装pygame库 在终端输入命令,安装Pygame库: ``` sudo apt-get install python-pygame ``` ## Hello world ```python # helloworld.py import pygame, sys # 导入所需的模块 from pygame.locals import * # 导入所有pygame.locals里的变量 pygame.init() # 初始化pygame screen = pygame.display.set_mode((500, 400)) # 设置窗口的大小,单位为像素 pygame.display.set_caption('Hellow World') # 设置窗口标题 while True: # 程序主循环 for event in pygame.event.get(): # 获取事件 if event.type == QUIT: # 判断事件是否为退出事件 pygame.quit() # 退出pygame sys.exit() # 退出系统 pygame.display.update() # 绘制屏幕内容 ``` 运行效果 <div align="center"><img src="4.png"/><p id="color" style="color:red">4.png</p></div> 这里解释上面程序的运行方式一个循环(主循环),做下面这三件事: 处理时间 更新游戏状态 绘制游戏状态到屏幕上 ## 绘制图形 Pygame的坐标原点(0, 0)点位于左上角,X轴自左向右,Y轴自上向下,单位位像素。这里介绍一下常用的方法: |方法|方法描述| |---|---| pygame.draw.line(Surface, color, start_pos, end_pos, width) |此方法用于绘制一条线段 pygame.draw.aaline(Surface, color, start_pos, end_pos, blend) |此方法用于绘制一条抗锯齿的线 pygame.draw.lines(Surface, color, closed, pointlist, width) |此方法用于绘制一条折线 pygame.draw.rect(Surface, color, Rect) |此方法用于绘制一个矩形 pygame.draw.rect(Surface, color, Rect, width) |此方法用于绘制一个矩形框 pygame.draw.ellipse(Surface, color, Rect, width) |此方法用于绘制一个椭圆框 pygame.draw.ellipse(Surface, color, Rect) |此方法用于绘制一个椭圆 pygame.draw.polygon(Surface, color, pointlist, width) |此方法用于绘制一个多边形 pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width) |此方法用于绘制一条弧线 pygame.draw.circle(Surface, color, Rect, radius) |此方法用于绘制一个圆 以下为示例代码: ```python # drawing.py # 导入需要的模块 import pygame, sys from pygame.locals import * from math import pi pygame.init() # 初始化pygame screen = pygame.display.set_mode((400, 300)) # 设置窗口的大小,单位为像素 pygame.display.set_caption('Drawing') # 设置窗口标题 # 定义颜色 BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) screen.fill(WHITE) # 设置背景颜色 pygame.draw.line(screen, GREEN, [0, 0], [50, 30], 5) # 绘制一条线 pygame.draw.aaline(screen, GREEN, [0, 50], [50, 80], True) # 绘制一条抗锯齿的线 pygame.draw.lines(screen, BLACK, False, [[0, 80], [50, 90], [200, 80], [220, 30]], 5) #绘制一条直线 pygame.draw.rect(screen, BLACK, [75, 10, 50, 20], 2) #绘制一个空心矩形 pygame.draw.rect(screen, BLACK, [150, 10, 50, 20]) # 绘制一个矩形 # 绘制多条弧线 pygame.draw.arc(screen, BLACK, [210, 75, 150, 125], 0, pi/2, 2) pygame.draw.arc(screen, GREEN, [210, 75, 150, 125], pi/2, pi, 2) pygame.draw.arc(screen, BLUE, [210,75, 150, 125], pi, 3*pi/2, 2) pygame.draw.arc(screen, RED, [210, 75, 150, 125], 3*pi/2, 2*pi, 2) pygame.draw.circle(screen, BLUE, [60, 250], 40) # 绘制一个圆 while True: # 程序主循环: for event in pygame.event.get(): # 获取事件 if event.type == QUIT: # 判断事件是否为退出事件 pygame.quit() # 退出pygame sys.exit() # 退出系统 pygame.display.update() # 绘制屏幕内容 ``` 运行效果如下: <div align="center"><img src="5.png"/><p id="color" style="color:red">5.png</p></div> ## 实现动画 pygame实现动画主要用到的方法: |方法|方法描述| |---|---| pygame.image.load(filename)|加载一张图片 pygame.Surface.blit(Source, dest, area= None, special_flags = 0)|将图片绘制到屏幕相应坐标上(后面两个参数默认,可以不传) pygame.time.Clock() |获得pygame的时钟 pygame.time.Clock.tick(FPS) |设置pygame时钟的间隔时间 以下为示例代码 ```python # animoation.py # 导入需要的模块 import pygame, sys from pygame.locals import * pygame.init() # 初始化pygame FPS = 30 # 设置帧率(屏幕每秒刷新的次数) fpsClock = pygame.time.Clock() # 获得pygame的时钟 pygame.display.set_mode((500, 400), 0, 32) # 设置窗口大小 pygame.display.set_caption('Animation') # 设置标题 WHITE = (255, 255, 255) # 定义颜色 img = pygame.image.load('resources/test.png') # 加载一张图片(所用到的图片参考1.5代码获取) # 初始化图片的位置 imgx = 10 imgy = 10 direction = 'right' # 初始化图片的移动方向 while True: # 程序主循环 screen.fill(WHITE) # 每次都要重新绘制背景白色 # 判断移动的方向,并对相应的坐标做加减 if direction == 'right': imgx += 5 if imgx == 380: direction = 'down' elif direction == 'down': imgy += 5 if imgy == 300: direction = 'left' elif direction == 'left': imgx -= 5 if imgx == 10: direction = 'up' elif direction == 'up': imgy -= 5 if imgy == 10: direction = 'right' screen.blit(img, (imgx, imgy)) # 该方法将用于图片绘制到相应的坐标中 for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() pygame.display.update() # 刷新屏幕 fpsClock.tick(FPS) # 设置pygame时钟的间隔时间 ``` ## 绘制文字 Pygame提供了很方便的方法使用.ttf字体文件,这样我们就能很轻易的将文字绘制在屏幕上了。 主要用到的方法(以ARBERKLEY.ttf字体为例): |方法|方法描述| |---|---| pygame.font.Font(filename, size) |创建字体对象 pygame.font.Font.render(text, antialias, color, background=None) | .get_rect() |获得一个对象的rect,以便于设置其坐标位置 以下为示例代码: ```python # font.py # 导入需要的模块 import pygame, sys from pygame.locals import * pygame.init() # 初始化pygame screen = pygame.display.set_mode((500,400)) # 设置窗口的大小,单位为像素 pygame.display.set_caption('Font') # 设置窗口的标题 # 定义颜色 WHITE = (255, 255, 255) GREEN = ( 0, 255, 0) BLUE = ( 0, 0, 128) fontObj = pygame.font.Font('resources/ARBERKLEY.ttf', 50) # 通过字体文件获得字体对象 textSurfaceObj = fontObj.render('Pygame', True, BLUE, GREEN) # 配置要显示的文字 textRectObj = textSurfaceObj.get_rect() # 获得要显示的对象的rect textRectObj.center = (250, 200) # 设置显示对象的坐标 screen.fill(WHITE) # 设置背景 screen.blit(textSurfaceObj, textRectObj) # 绘制字体 while True: # 程序主循环 for event in pygame.event.get(): # 获取事件 if event.type == QUIT: # 判断事件是否为退出事件 pygame.quit() # 退出pygame sys.exit() # 退出系统 pygame.display.update() # 绘制屏幕内容 ``` ## 播放音频 在Pygame里播放音频有两个方法,一个用来播放特效声音,一个用来播放背景音乐: |方法|方法描述 |---|---| pygame.mixer.Sound(filename) |该方法返回一个Sound对象,调用它的.play( )方法,即可播放较短的音频文件(比如玩家受到伤害、收集到金币等) pygame.mixer.music.load(filename) |该方法用来加载背景音乐pygame.mixer.music.play( )|调用方法就可以播放背景音乐(在同一个时刻只允许加载一个背景音乐) 以下为示例代码: ```python # audio.py # 导入需要的模块 import pygame, sys from pygame.locals import * pygame.init() # 初始化pygame screen = pygame.display.set_mode((500,400)) # 设置窗口的大小,单位为像素 pygame.display.set_caption('Audio') # 设置窗口的标题 WHITE = (255, 255, 255) # 定义颜色 screen.fill(WHITE) # 设置背景 sound = pygame.mixer.Sound('resources/bounce.ogg') # 加载并播放一个特效音频文件(所用到的音频文件请参考1.5代码获取) sound.play() pygame.mixer.music.load('resources/bgmusic.mp3') # 加载背景音乐文件 # 播放背景音乐,第一个参数为播放的次数(-1表示无限循环),第二个参数是设置播放的起点(单位为秒) pygame.mixer.music.play(-1, 0.0) while True: # 程序主循环 for event in pygame.event.get(): # 获取事件 if event.type == QUIT: # 判断事件是否为退出事件 pygame.mixer.music.stop() # 停止播放背景音乐 pygame.quit() # 退出pygame sys.exit() # 退出系统 pygame.display.update() # 绘制屏幕内容 ``` ## 事件 Pygame里常用的事件如下表: |事件|产生途径|参数 |---|---|---| |QUIT| 用户按下关闭按钮 |none ACTIVEEVENT| Pygame被激活或者隐藏| gain, state |KEYDOWN |键盘被按下 |unicode, key, mod KEYUP| 键盘被放开| key, mod MOUSEMOTION| 鼠标移动| pos, rel, buttons MOUSEBUTTONDOWN| 鼠标按下| pos, button MOUSEBUTTONUP| 鼠标放开| pos, button VIDEORESIZE| Pygame窗口缩放| size, w, h 以下为示例代码: ```python # event.py # 导入需要的模块 import pygame, sys from pygame.locals import * WHITE = (255, 255, 255) # 定义颜色 pygame.init() # 初始化pygame screen = pygame.display.set_mode((500, 400), 0, 32) # 设置窗口的大小,单位为像素 pygame.display.set_caption('Event') # 设置窗口的标题 screen.fill(WHITE) # 设置背景 while True: # 程序主循环 for event in pygame.event.get(): # 获取事件 if event.type == QUIT: # 判断事件是否为退出事件 pygame.quit() # 退出pygame sys.exit() # 退出系统 if event.type ==MOUSEMOTION: # 获得鼠标当前的位置 print(event.pos) if event.type ==MOUSEBUTTONDOWN: # 获得鼠标按下的位置 print("鼠标按下:",event.pos) if event.type ==MOUSEBUTTONUP: # 获得鼠标抬起的位置 print("鼠标抬起:",event.pos) if event.type == KEYDOWN: # 获得键盘按下的事件 if(event.key==K_UP or event.key==K_w): print("上") if(event.key==K_DOWN or event.key==K_s): print("下") if(event.key==K_LEFT or event.key==K_a): print("左") if(event.key==K_RIGHT or event.key==K_d): print("右") if(event.key==K_ESCAPE): # 按下键盘的Esc键退出 pygame.quit() # 退出pygame sys.exit() # 退出系统 pygame.display.update() # 绘制屏幕内容 ``` pygame学习更多:https://www.pygame.org/docs/