当前位置:   article > 正文

pygame

pygame running=false

关于pygame

PyGame是SDL库的Python包装器。SDL是一个跨平台库,用于访问计算机多媒体硬件组件(声音,视频,输入等)。SDL是一个非常强大的工具,用于构建各种各样的东西,但它是用C语言编写的,C很难,所以我们使用PyGame。

github网址:https://github.com/pygame/pygame

安装

pip install pygame
  1. C:\Users\huang>pip install pygame
  2. Collecting pygame
  3. Downloading https://files.pythonhosted.org/packages/ed/56/b63ab3724acff69f4080e54c4bc5f55d1fbdeeb19b92b70acf45e88a5908/pygame-1.9.6-cp37-cp37m-win_amd64.whl (4.3MB)
  4. 100% |████████████████████████████████| 4.3MB 55kB/s
  5. Installing collected packages: pygame
  6. Successfully installed pygame-1.9.6

基础对象

屏幕对象

首先,我们需要一张画布,我们称之为“屏幕”,它是我们绘画的平台。为了创建一个屏幕,我们需要调用pygame.display 中的 set_mode 方法,然后向 set_mode() 传递包含屏幕窗口宽度和高度的元组(本教程中使用 800x600 尺寸)。

  1. import pygame
  2. from pygame.locals import *
  3. pygame.init()
  4. screen = pygame.display.set_mode((800,600))

运行代码,出现一个新窗口,随后消失。

游戏主循环

如果运行上面的代码,你会看到我们的窗口短暂弹出,然后在程序退出时立即消失。所以要进行循环维持进程。游戏主循环是所有操作发生的地方。在游戏过程中,它不断的更新游戏状态,渲染游戏画面和收集输入指令。创建循环时,需要确保我们有办法跳出循环,退出应用。所有的用户输入(和我们稍稍后提到的其他事件)都会进入 PyGame 的事件队列,通过调用 pygame.event.get() 可以访问该队列。这将返回一个包含队列里所有事件的列表,我们将循环这个列表,并根针对相应的事件类型做出反应。现在我们只关心KEYDOWN和QUIT事件:

  1. # 用于保证主循环运行的变量
  2. running = True
  3. # 主循环!
  4. while running:
  5. # for 循环遍历事件队列
  6. for event in pygame.event.get():
  7. # 检测 KEYDOWN 事件: KEYDOWN 是 pygame.locals 中定义的常量,pygame.locals文件开始已经导入
  8. if event.type == KEYDOWN:
  9. # 如果按下 Esc 那么主循环终止
  10. if event.key == K_ESCAPE:
  11. running = False
  12. # 检测 QUIT : 如果 QUIT, 终止主循环
  13. elif event.type == QUIT:
  14. running = False

将上述代码添加到之前的代码下,并运行。你应该看到一个空的窗口。只有你按下 ESC 键 或者触发一个 QUIT 事,否则这个窗口不会消失。

Surface 和 Rects

Surface和 Rects是 PyGame 中的基本构件。可以将 Surface 看作一张白纸,你可以在上面随意绘画。我们的屏幕对象也是一个 Surface 。它们可以包含图片。Rects 是 Surface 中矩形区域的表示。

让我们创建一个 50x50 像素的 Surface,然后给它涂色。由于屏幕是黑色的,所以我们使用白色。 我们然后调用 get_rect() 在 Surface上 得到一个矩形区域和 Surface 的 x 轴 和 y 轴。

  1. # 创建Surface 并用原则设定它的长度和宽度
  2. surf = pygame.Surface((50,50))
  3. # 设定Surface的颜色,使其和屏幕分离
  4. surf.fill((255,255,255))
  5. rect = surf.get_rect()

Blit 和 Flip

仅仅只是创建了 Surface 并不能在屏幕上看到它。为此我们需要将这个 Surface 绘制(Blit)到另一个 Surface 上。Blit 是一个专业术语,意思就是绘图。你仅仅只能从一个Surface Blit 到另一个Surface,我们的屏幕就是一个 Surface 对象。以下是我们如何将 surf 画到屏幕上:

  1. # 这一行表示:将surf画到屏幕 x:400.y:300的坐标上
  2. screen.blit(surf,(400,300))
  3. pygame.display.flip() 

blit() 有两个参数:要画的 Surface 和 在源 Surface 上的坐标。此处我们使用屏幕的中心,但是当你运行代码时,你会发现我们的 surf 并没有出现在屏幕的中心。这是因为 blit() 是从左上角开始画 surf 。

注意在 blit 之后的 pygame.display.filp() 的调用。Flip将会更新自上次 flip 后的整个屏幕,两次 flip 之间发生的修改都将在屏幕上显示。没有调用flip()那就什么也不会出现。

Sprites

什么是 Sprites ?从编程术语来讲,Sprites 是屏幕上事物的二维表达。本质上来讲,Sprite 就是一个图片。Pygame 提供一个叫做 Sprites 的基础类,它就是用来扩展的,可以包含想要在屏幕上呈现的对象一个或多个图形表示。我们将会扩展Sprite 类,这样可以使用它的内建方法。我们称这个新的对象为 Player 。Plyaer 将扩展 Sprite,现在只有两个属性:surf 和 rect。我们也会给 surf 涂色(本教程使用白色),如之前 surface 例子,只是现在 Surface 属于 Player :

  1. class Player(pygame.sprite.Sprite):
  2. def __init__(self):
  3. super(Player,self).__init__()
  4. self.surf = pygame.Surface((75,25))
  5. self.surf.fill((255,255,255))
  6. self.rect = self.surf.get_rect()

现在把上面的代码整合一下:

  1. # 调用pygame模块
  2. import pygame
  3. # 调用 pygame.locals 使容易使用关键参数
  4. from pygame.locals import *
  5. # 定义Player对象 调用super赋予它属性和方法
  6. # 我们画在屏幕上的surface 现在是player的一个属性
  7. class Player(pygame.sprite.Sprite):
  8. def __init__(self):
  9. super(Player,self).__init__()
  10. self.surf = pygame.Surface((75,25))
  11. self.surf.fill((255,255,255))
  12. self.rect = self.surf.get_rect()
  13. # 初始化 pygame
  14. pygame.init()
  15. # 创建屏幕对象
  16. # 设定尺寸为 800x600
  17. screen = pygame.display.set_mode((800,600))
  18. # 初始化Player, 现在他仅仅是一个矩形
  19. player = Player()
  20. # 控制主循环的进行的变量
  21. running = True
  22. # 主循环
  23. while running:
  24. # 事件队列中的循环
  25. for event in pygame.event.get():
  26. # check for KEYDOWN event: KEYDOWN is a constant defined in pygame.locals,which we imported earlier
  27. if event.type == KEYDOWN:
  28. # if the Esc KEY has been pressed set running to false to exit the main loop
  29. if event.key == K_ESCAPE:
  30. running = False
  31. # check for QUIT event: if QUIT, set running to false
  32. elif event.type == QUIT:
  33. running = False
  34. # 这一行表示:将surf画到屏幕 x:400.y:300的坐标上
  35. screen.blit(player.surf,(400,300))
  36. # 更新
  37. pygame.display.flip()

运行上述代码,你将会在屏幕中心看到一个白色的矩形:

 

 

 

转载于:https://www.cnblogs.com/huangqihui/p/11190131.html

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

闽ICP备14008679号