当前位置:   article > 正文

python Pygame的具体使用讲解

pygame

源码及资料下载:http://labfile.oss.aliyuncs.com/courses/940/foundation.zip

1.HelloWorld

  1. # -*- coding: UTF-8 -*-
  2. # helloworld.py
  3. # 导入所需的模块
  4. import pygame, sys
  5. # 导入所有pygame.locals里的变量(比如下面大写的QUIT变量)
  6. from pygame.locals import *
  7. # 初始化pygame
  8. pygame.init()
  9. # 设置窗口的大小,单位为像素
  10. screen = pygame.display.set_mode((500, 400))
  11. # 设置窗口标题
  12. pygame.display.set_caption('Hello World')
  13. # 程序主循环
  14. while True:
  15. # 获取事件
  16. for event in pygame.event.get():
  17. # 判断事件是否为退出事件
  18. if event.type == QUIT:
  19. # 退出pygame
  20. pygame.quit()
  21. # 退出系统
  22. sys.exit()
  23. # 绘制屏幕内容
  24. pygame.display.update()

效果图如下:

 

这里解释一下上面程序的运行方式

一个游戏循环(也可以称为主循环)就做下面这三件事:

  1. 处理事件
  2. 更新游戏状态
  3. 绘制游戏状态到屏幕上

 

2 绘制图形

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)此方法用于绘制一个椭圆

pygame.draw.ellipse(Surface, color, Rect, width)此方法用于绘制一个椭圆框

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)此方法用于绘制一个圆

以下为示例代码:

  1. # -*- coding: UTF-8 -*-
  2. # drawing.py
  3. # 导入需要的模块
  4. import pygame, sys
  5. from pygame.locals import *
  6. from math import pi
  7. # 初始化pygame
  8. pygame.init()
  9. # 设置窗口的大小,单位为像素
  10. screen = pygame.display.set_mode((400,300))
  11. # 设置窗口标题
  12. pygame.display.set_caption('Drawing')
  13. # 定义颜色
  14. BLACK = ( 0, 0, 0)
  15. WHITE = (255, 255, 255)
  16. RED = (255, 0, 0)
  17. GREEN = ( 0, 255, 0)
  18. BLUE = ( 0, 0, 255)
  19. # 设置背景颜色
  20. screen.fill(WHITE)
  21. # 绘制一条线
  22. pygame.draw.line(screen, GREEN, [0, 0], [50,30], 5)
  23. # 绘制一条抗锯齿的线
  24. pygame.draw.aaline(screen, GREEN, [0, 50],[50, 80],True)
  25. # 绘制一条折线
  26. pygame.draw.lines(screen, BLACK, False,
  27. [[0, 80], [50, 90], [200, 80], [220, 30]], 5)
  28. # 绘制一个空心矩形
  29. pygame.draw.rect(screen, BLACK, [75, 10, 50, 20], 2)
  30. # 绘制一个矩形
  31. pygame.draw.rect(screen, BLACK, [150, 10, 50, 20])
  32. # 绘制一个空心椭圆
  33. pygame.draw.ellipse(screen, RED, [225, 10, 50, 20], 2)
  34. # 绘制一个椭圆
  35. pygame.draw.ellipse(screen, RED, [300, 10, 50, 20])
  36. # 绘制多边形
  37. pygame.draw.polygon(screen, BLACK, [[100, 100], [0, 200], [200, 200]], 5)
  38. # 绘制多条弧线
  39. pygame.draw.arc(screen, BLACK,[210, 75, 150, 125], 0, pi/2, 2)
  40. pygame.draw.arc(screen, GREEN,[210, 75, 150, 125], pi/2, pi, 2)
  41. pygame.draw.arc(screen, BLUE, [210, 75, 150, 125], pi,3*pi/2, 2)
  42. pygame.draw.arc(screen, RED, [210, 75, 150, 125], 3*pi/2, 2*pi, 2)
  43. # 绘制一个圆
  44. pygame.draw.circle(screen, BLUE, [60, 250], 40)
  45. # 程序主循环
  46. while True:
  47. # 获取事件
  48. for event in pygame.event.get():
  49. # 判断事件是否为退出事件
  50. if event.type == QUIT:
  51. # 退出pygame
  52. pygame.quit()
  53. # 退出系统
  54. sys.exit()
  55. # 绘制屏幕内容
  56. pygame.display.update()

效果图如下:

3 实现动画

由于人类眼睛的特殊生理结构,当所看画面的帧率高于24的时候,就会认为是连贯的,此现象称之为 视觉暂留 。

帧率(Frame rate)是用于测量显示帧数的量度,所谓的测量单位为每秒显示帧数(Frames per Second,简称:FPS)

一般来说30fps是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。

在我们原有坐标系的基础上添加偏移量,再重新绘制,依次一张一张的循环绘制下去,就会得到我们想要的物体移动的效果。

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时钟的间隔时间

以下为示例代码:

  1. # -*- coding: UTF-8 -*-
  2. # animation.py
  3. # 导入需要的模块
  4. import pygame, sys
  5. from pygame.locals import *
  6. # 初始化pygame
  7. pygame.init()
  8. # 设置帧率(屏幕每秒刷新的次数)
  9. FPS = 30
  10. # 获得pygame的时钟
  11. fpsClock = pygame.time.Clock()
  12. # 设置窗口大小
  13. screen = pygame.display.set_mode((500, 400), 0, 32)
  14. # 设置标题
  15. pygame.display.set_caption('Animation')
  16. # 定义颜色
  17. WHITE = (255, 255, 255)
  18. # 加载一张图片(所用到的的图片请参考1.5代码获取)
  19. img = pygame.image.load('resources/shiyanlou.PNG')
  20. # 初始化图片的位置
  21. imgx = 10
  22. imgy = 10
  23. # 初始化图片的移动方向
  24. direction = 'right'
  25. # 程序主循环
  26. while True:
  27. # 每次都要重新绘制背景白色
  28. screen.fill(WHITE)
  29. # 判断移动的方向,并对相应的坐标做加减
  30. if direction == 'right':
  31. imgx += 5
  32. if imgx == 380:
  33. direction = 'down'
  34. elif direction == 'down':
  35. imgy += 5
  36. if imgy == 300:
  37. direction = 'left'
  38. elif direction == 'left':
  39. imgx -= 5
  40. if imgx == 10:
  41. direction = 'up'
  42. elif direction == 'up':
  43. imgy -= 5
  44. if imgy == 10:
  45. direction = 'right'
  46. # 该方法将用于图片绘制到相应的坐标中
  47. screen.blit(img, (imgx, imgy))
  48. for event in pygame.event.get():
  49. if event.type == QUIT:
  50. pygame.quit()
  51. sys.exit()
  52. # 刷新屏幕
  53. pygame.display.update()
  54. # 设置pygame时钟的间隔时间
  55. fpsClock.tick(FPS)

 

效果图如下:

4 绘制文字 

如果你想绘制文字到屏幕上,Pygame提供了很方便的方法使用.ttf字体文件,这样我们就能很轻易的将文字绘制在屏幕上了。

这里我使用了ARBERKLEY.ttf作为字体,字体文件的获取请参考1.5代码获取。

主要用到的方法:

pygame.font.Font(filename, size)

filename:字体文件的文件名;

size:字体的高height,单位为像素;

pygame.font.Font.render(text, antialias, color, background=None)

text:要显示的文字;

antialias: 是否抗锯齿;

color:字体颜色;

background:背景颜色(可选参数);

.get_rect()

获得一个对象的rect,以便于设置其坐标位置

以下为示例代码:

  1. # -*- coding: UTF-8 -*-
  2. # font.py
  3. # 导入需要的模块
  4. import pygame, sys
  5. from pygame.locals import *
  6. # 初始化pygame
  7. pygame.init()
  8. # 设置窗口的大小,单位为像素
  9. screen = pygame.display.set_mode((500,400))
  10. # 设置窗口的标题
  11. pygame.display.set_caption('Font')
  12. # 定义颜色
  13. WHITE = (255, 255, 255)
  14. GREEN = ( 0, 255, 0)
  15. BLUE = ( 0, 0, 128)
  16. # 通过字体文件获得字体对象
  17. fontObj = pygame.font.Font('resources/ARBERKLEY.ttf', 50)
  18. # 配置要显示的文字
  19. textSurfaceObj = fontObj.render('Pygame', True, BLUE, GREEN)
  20. # 获得要显示的对象的rect
  21. textRectObj = textSurfaceObj.get_rect()
  22. # 设置显示对象的坐标
  23. textRectObj.center = (250, 200)
  24. # 设置背景
  25. screen.fill(WHITE)
  26. # 绘制字体
  27. screen.blit(textSurfaceObj, textRectObj)
  28. # 程序主循环
  29. while True:
  30. # 获取事件
  31. for event in pygame.event.get():
  32. # 判断事件是否为退出事件
  33. if event.type == QUIT:
  34. # 退出pygame
  35. pygame.quit()
  36. # 退出系统
  37. sys.exit()
  38. # 绘制屏幕内容
  39. pygame.display.update()

效果图如下:

 

 

5.播放音频

在Pygame里播放音频有两个方法,一个用来播放特效声音,一个用来播放背景音乐:

pygame.mixer.Sound(filename)

该方法返回一个Sound对象,调用它的.play( )方法,即可播放较短的音频文件(比如玩家受到伤害、收集到金币等);

pygame.mixer.music.load(filename)

该方法用来加载背景音乐,之后调用pygame.mixer.music.play( )方法就可以播放背景音乐(Pygame只允许加载一个背景音乐在同一个时刻)

以下为示例代码:

  1. # -*- coding: UTF-8 -*-
  2. # audio.py
  3. # 导入需要的模块
  4. import pygame, sys
  5. from pygame.locals import *
  6. # 初始化pygame
  7. pygame.init()
  8. # 设置窗口的大小,单位为像素
  9. screen = pygame.display.set_mode((500,400))
  10. # 设置窗口的标题
  11. pygame.display.set_caption('Audio')
  12. # 定义颜色
  13. WHITE = (255, 255, 255)
  14. # 设置背景
  15. screen.fill(WHITE)
  16. # 加载并播放一个特效音频文件(所用到的音频文件请参考1.5代码获取)
  17. sound = pygame.mixer.Sound('resources/bounce.ogg')
  18. sound.play()
  19. # 加载背景音乐文件
  20. pygame.mixer.music.load('resources/bgmusic.mp3')
  21. # 播放背景音乐,第一个参数为播放的次数(-1表示无限循环),第二个参数是设置播放的起点(单位为秒)
  22. pygame.mixer.music.play(-1, 0.0)
  23. # 程序主循环
  24. while True:
  25. # 获取事件
  26. for event in pygame.event.get():
  27. # 判断事件是否为退出事件
  28. if event.type == QUIT:
  29. # 停止播放背景音乐
  30. pygame.mixer.music.stop()
  31. # 退出pygame
  32. pygame.quit()
  33. # 退出系统
  34. sys.exit()
  35. # 绘制屏幕内容
  36. pygame.display.update()

6.事件

Pygame里常用的事件如下表:

事件产生途径参数
QUIT用户按下关闭按钮none
ACTIVEEVENTPygame被激活或者隐藏gain, state
KEYDOWN键盘被按下unicode, key, mod
KEYUP键盘被放开key, mod
MOUSEMOTION鼠标移动pos, rel, buttons
MOUSEBUTTONDOWN鼠标按下pos, button
MOUSEBUTTONUP鼠标放开pos, button
VIDEORESIZEPygame窗口缩放size, w, h

以下为示例代码:

  1. # -*- coding: UTF-8 -*-
  2. # event.py
  3. # 导入需要的模块
  4. import pygame, sys
  5. from pygame.locals import *
  6. # 定义颜色
  7. WHITE = (255, 255, 255)
  8. # 初始化pygame
  9. pygame.init()
  10. # 设置窗口的大小,单位为像素
  11. screen = pygame.display.set_mode((500,400), 0, 32)
  12. # 设置窗口的标题
  13. pygame.display.set_caption('Event')
  14. # 设置背景
  15. screen.fill(WHITE)
  16. # 程序主循环
  17. while True:
  18. # 获取事件
  19. for event in pygame.event.get():
  20. # 判断事件是否为退出事件
  21. if event.type == QUIT:
  22. # 退出pygame
  23. pygame.quit()
  24. # 退出系统
  25. sys.exit()
  26. # 获得鼠标当前的位置
  27. if event.type ==MOUSEMOTION:
  28. print(event.pos)
  29. # 获得鼠标按下的位置
  30. if event.type ==MOUSEBUTTONDOWN:
  31. print("鼠标按下:",event.pos)
  32. # 获得鼠标抬起的位置
  33. if event.type ==MOUSEBUTTONUP:
  34. print("鼠标抬起:",event.pos)
  35. # 获得键盘按下的事件
  36. if event.type == KEYDOWN:
  37. if(event.key==K_UP or event.key==K_w):
  38. print("上")
  39. if(event.key==K_DOWN or event.key==K_s):
  40. print("下")
  41. if(event.key==K_LEFT or event.key==K_a):
  42. print("左")
  43. if(event.key==K_RIGHT or event.key==K_d):
  44. print("右")
  45. # 按下键盘的Esc键退出
  46. if(event.key==K_ESCAPE):
  47. # 退出pygame
  48. pygame.quit()
  49. # 退出系统
  50. sys.exit()
  51. # 绘制屏幕内容
  52. pygame.display.update()

 效果图如下:

若想要深入了解,可参考下方Pygame官方文档的链接。

https://www.pygame.org/docs/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/127163
推荐阅读
相关标签
  

闽ICP备14008679号