当前位置:   article > 正文

pygame游戏模块详解_pygame模块详解

pygame模块详解

目录

一、下载pygame第三方模块

二、pygame模块知识点化(把模块分为n多个知识点)

1、使用pygame知识制作一个可以关闭的空白窗体,这里我就不用文字说明了,直接上代码,简洁明了。

 2、使用精灵显示背景, 背景的循环展示

3、使用精灵玩家,玩家可以移动

4、使用精灵显示道具,玩家与道具碰撞检测

5、UI的使用 (字体,鼠标点击检测)


前言

        Pygame 是一个专门用来开发游戏的 Python 模块,主要为开发、设计 2D 电子游戏而生,它是一个免费、开源的第三方软件包,支持多种操作系统,具有良好的跨平台性(比如 Windows、Linux、Mac 等)。Pygame 是 Pete Shinners 在 SDL(Simple DirectMedia Layer,一套开源的跨平台多媒体开发库)基础上开发而来,其目的是取代 PySDL。

一、下载pygame第三方模块

        在pycharm软件的终端命令栏中输入以下命令下载安装pygame  

pip install pygame

二、pygame模块知识点化(把模块分为n多个知识点)

1、使用pygame知识制作一个可以关闭的空白窗体,这里我就不用文字说明了,直接上代码,简洁明了。

  1. # 导入sys模块包 用于终止退出程序
  2. import sys
  3. # 导入pygame模块包
  4. import pygame
  5. pygame.init() # 初始化pygame 虽然在这个简单的开关空白窗体看不出作用 但是默认把他写上是必要的 防止报错
  6. screen = pygame.display.set_mode((400, 600)) # 设置一个400x400的空白窗体
  7. screen.fill((0, 255, 255)) # 这里我们给空白窗体添加一个背景颜色
  8. while True:
  9. # 循环获取事件,监听事件
  10. for event in pygame.event.get():
  11. # 判断用户是否点了关闭按钮
  12. if event.type == pygame.QUIT:
  13. # 卸载退出所有模块
  14. pygame.quit()
  15. # 终止程序
  16. sys.exit()
  17. pygame.display.flip() # 更新屏幕内容 没有它 你增加的内容是无法显示的

  这样我们就可以获得一个可关闭的带有背景颜色的空白窗体。

 2、使用精灵显示背景, 背景的循环展示

  1. import pygame, sys
  2. # 构造一个背景精灵类 继承pygame的精灵类
  3. class BgSprite(pygame.sprite.Sprite):
  4. # 初始化函数 加入参数name(需要加载的背景名) top_left(背景从哪里开始加载)
  5. def __init__(self, name, location):
  6. # 有精灵父类 必须调用
  7. super().__init__()
  8. self.image = pygame.image.load(name) # 加载图片
  9. self.rect = self.image.get_rect() # 获取rect的区域
  10. self.rect.topleft = location # 设置位置
  11. # 定义一个更新函数
  12. def update(self):
  13. self.rect.top += 10 # 每次向上移动10个像素
  14. if self.rect.top >= 600:
  15. self.rect.top = -600
  16. # 构造一个背景精灵的管理类
  17. class BgManage:
  18. # 定义初始化函数 传入Manage类的实例 方便把背景添加到screen上
  19. def __init__(self, mg):
  20. self.mg = mg
  21. self.bg_group = pygame.sprite.Group() # 添加一个背景精灵组
  22. self.bg_sprite1 = BgSprite("img/begin2.png", (0, 0)) # 实例化两个背景精灵加入背景精灵组
  23. self.bg_sprite1.add(self.bg_group)
  24. self.bg_sprite2 = BgSprite("img/begin2.png", (0, -600))
  25. self.bg_sprite2.add(self.bg_group)
  26. def update(self):
  27. self.bg_group.update()
  28. self.bg_group.draw(self.mg.screen)
  29. # 构造管理类管理精灵管理类
  30. class Manage:
  31. def __init__(self):
  32. pygame.init()
  33. self.clock = pygame.time.Clock()
  34. self.screen = pygame.display.set_mode((400, 600))
  35. pygame.display.set_caption("会动的背景")
  36. # 实例化背景精灵管理类
  37. self.bg_manage = BgManage(self)
  38. def run(self):
  39. while True:
  40. self.clock.tick(25)
  41. for event in pygame.event.get():
  42. if event.type == pygame.QUIT:
  43. pygame.quit()
  44. sys.exit()
  45. # 更新背景管理类中的内容
  46. self.bg_manage.update()
  47. pygame.display.flip()
  48. mg = Manage()
  49. mg.run()

这样我们就得到一个会动的背景

3、使用精灵玩家,玩家可以移动

        在已有的代码中添加玩家精灵类和玩家管理类就可以实现

  1. import pygame, sys
  2. # 构造一个精灵父类
  3. class BaseSprite(pygame.sprite.Sprite):
  4. def __init__(self, name):
  5. super().__init__()
  6. self.image = pygame.image.load(name) # 加载图片
  7. self.rect = self.image.get_rect() # 获取rect的位置
  8. # 构造一个背景精灵类 继承的精灵父类
  9. class BgSprite(BaseSprite):
  10. # 初始化函数 加入参数name(需要加载的背景名) top_left(背景从哪里开始加载)
  11. def __init__(self, name, location):
  12. # 有精灵父类 必须调用
  13. super().__init__(name)
  14. self.rect.topleft = location # 设置位置
  15. # 定义一个更新函数
  16. def update(self):
  17. self.rect.top += 10 # 每次向上移动10个像素
  18. if self.rect.top >= 600:
  19. self.rect.top = -600
  20. # 构造一个背景精灵的管理类
  21. class BgManage:
  22. # 定义初始化函数 传入Manage类的实例 方便把背景添加到screen上
  23. def __init__(self, mg):
  24. self.mg = mg
  25. self.bg_group = pygame.sprite.Group() # 添加一个背景精灵组
  26. self.bg_sprite1 = BgSprite("img/begin2.png", (0, 0)) # 实例化两个背景精灵加入背景精灵组
  27. self.bg_sprite1.add(self.bg_group)
  28. self.bg_sprite2 = BgSprite("img/begin2.png", (0, -600))
  29. self.bg_sprite2.add(self.bg_group)
  30. def update(self):
  31. self.bg_group.update()
  32. self.bg_group.draw(self.mg.screen)
  33. class PlayerSprite(BaseSprite):
  34. # 初始化函数 加入参数name(需要加载的背景名) location(背景从哪里开始加载)
  35. def __init__(self, name, location):
  36. # 有精灵父类 必须调用
  37. super().__init__(name)
  38. self.rect.topleft = location # 设置位置
  39. def update(self):
  40. # 获取键盘事件 玩家移动
  41. key_pressed = pygame.key.get_pressed()
  42. # 按下键盘←键 向左移动
  43. if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
  44. self.rect.left -= 8
  45. # 按下键盘→键 向右移动
  46. elif key_pressed[pygame.K_RIGHT] and self.rect.right < 400:
  47. self.rect.left += 8
  48. # 按下键盘↑键 向上移动
  49. elif key_pressed[pygame.K_UP] and self.rect.top > 0:
  50. self.rect.top -= 8
  51. # 按下键盘↓键 向下移动
  52. elif key_pressed[pygame.K_DOWN] and self.rect.bottom < 600:
  53. self.rect.top += 8
  54. class PlayerManage: # 构造玩家管理类
  55. def __init__(self, mg):
  56. self.mg = mg
  57. # 添加玩家精灵组
  58. self.player_group = pygame.sprite.Group()
  59. # 实例玩家精灵并加入到玩家精灵组
  60. self.player_sprite = PlayerSprite("img2/me1.png", (150, 400))
  61. self.player_sprite.add(self.player_group)
  62. def update(self):
  63. self.player_group.update()
  64. self.player_group.draw(self.mg.screen)
  65. # 构造管理类管理精灵管理类
  66. class Manage:
  67. def __init__(self):
  68. pygame.init()
  69. self.clock = pygame.time.Clock()
  70. self.screen = pygame.display.set_mode((400, 600))
  71. pygame.display.set_caption("会动的背景")
  72. # 实例化背景精灵管理类
  73. self.bg_manage = BgManage(self)
  74. # 实例化玩家管理
  75. self.player_manage = PlayerManage(self)
  76. def run(self):
  77. while True:
  78. self.clock.tick(25)
  79. for event in pygame.event.get():
  80. if event.type == pygame.QUIT:
  81. pygame.quit()
  82. sys.exit()
  83. # 更新背景管理类中的内容
  84. self.bg_manage.update()
  85. self.player_manage.update()
  86. pygame.display.flip()
  87. mg = Manage()
  88. mg.run()

4、使用精灵显示道具,玩家与道具碰撞检测

        在已有的代码中添加道具精灵类和道具管理类,然后添加碰撞检测就可以实现

  1. import random
  2. import pygame, sys
  3. # 构造一个精灵父类
  4. class BaseSprite(pygame.sprite.Sprite):
  5. def __init__(self, name):
  6. super().__init__()
  7. self.image = pygame.image.load(name) # 加载图片
  8. self.rect = self.image.get_rect() # 获取rect的位置
  9. # 构造一个背景精灵类 继承的精灵父类
  10. class BgSprite(BaseSprite):
  11. # 初始化函数 加入参数name(需要加载的背景名) top_left(背景从哪里开始加载)
  12. def __init__(self, name, location):
  13. # 有精灵父类 必须调用
  14. super().__init__(name)
  15. self.rect.topleft = location # 设置位置
  16. # 定义一个更新函数
  17. def update(self):
  18. self.rect.top += 10 # 每次向上移动10个像素
  19. if self.rect.top >= 600:
  20. self.rect.top = -600
  21. # 构造一个背景精灵的管理类
  22. class BgManage:
  23. # 定义初始化函数 传入Manage类的实例 方便把背景添加到screen上
  24. def __init__(self, mg):
  25. self.mg = mg
  26. self.bg_group = pygame.sprite.Group() # 添加一个背景精灵组
  27. self.bg_sprite1 = BgSprite("img/begin2.png", (0, 0)) # 实例化两个背景精灵加入背景精灵组
  28. self.bg_sprite1.add(self.bg_group)
  29. self.bg_sprite2 = BgSprite("img/begin2.png", (0, -600))
  30. self.bg_sprite2.add(self.bg_group)
  31. def update(self):
  32. self.bg_group.update()
  33. self.bg_group.draw(self.mg.screen)
  34. class PlayerSprite(BaseSprite):
  35. # 初始化函数 加入参数name(需要加载的图片) location(玩家从哪里开始加载)
  36. def __init__(self, name, location):
  37. # 有精灵父类 必须调用
  38. super().__init__(name)
  39. self.rect.topleft = location # 设置位置
  40. def update(self):
  41. # 获取键盘事件 玩家移动
  42. key_pressed = pygame.key.get_pressed()
  43. # 按下键盘←键 向左移动
  44. if key_pressed[pygame.K_LEFT] and self.rect.left > 0:
  45. self.rect.left -= 8
  46. # 按下键盘→键 向右移动
  47. elif key_pressed[pygame.K_RIGHT] and self.rect.right < 400:
  48. self.rect.left += 8
  49. # 按下键盘↑键 向上移动
  50. elif key_pressed[pygame.K_UP] and self.rect.top > 0:
  51. self.rect.top -= 8
  52. # 按下键盘↓键 向下移动
  53. elif key_pressed[pygame.K_DOWN] and self.rect.bottom < 600:
  54. self.rect.top += 8
  55. class PlayerManage: # 构造玩家管理类
  56. def __init__(self, mg):
  57. self.mg = mg
  58. # 添加玩家精灵组
  59. self.player_group = pygame.sprite.Group()
  60. # 实例玩家精灵并加入到玩家精灵组
  61. self.player_sprite = PlayerSprite("img2/me1.png", (150, 400))
  62. self.player_sprite.add(self.player_group)
  63. def update(self):
  64. self.player_group.update()
  65. self.player_group.draw(self.mg.screen)
  66. # 构造道具精灵类
  67. class PropSprite(BaseSprite):
  68. # 初始化函数 加入参数name(需要加载的道具图片) center(道具加载的位置)
  69. def __init__(self, name, center):
  70. super().__init__(name)
  71. self.rect.center = center
  72. def update(self):
  73. self.rect.top += 10
  74. if self.rect.top >= 600:
  75. self.kill()
  76. class PropManage:
  77. def __init__(self, mg):
  78. self.mg = mg
  79. self.prop_group = pygame.sprite.Group()
  80. self.time_count = 3 # 计时器
  81. def update(self):
  82. # 每过一段时间就会产生道具
  83. self.time_count -= 0.1
  84. if self.time_count <= 0:
  85. self.time_count = 3
  86. self.prop_sprite = PropSprite("img2/bomb_supply.png", (random.randint(0, 370), 0))
  87. self.prop_sprite.add(self.prop_group)
  88. self.prop_group.update()
  89. self.prop_group.draw(self.mg.screen)
  90. # 构造管理类管理精灵管理类
  91. class Manage:
  92. def __init__(self):
  93. pygame.init()
  94. self.clock = pygame.time.Clock()
  95. self.screen = pygame.display.set_mode((400, 600))
  96. pygame.display.set_caption("会动的背景")
  97. # 实例化背景精灵管理类
  98. self.bg_manage = BgManage(self)
  99. # 实例化玩家管理
  100. self.player_manage = PlayerManage(self)
  101. # 实例化道具管理
  102. self.prop_manage = PropManage(self)
  103. def run(self):
  104. while True:
  105. self.clock.tick(25)
  106. for event in pygame.event.get():
  107. if event.type == pygame.QUIT:
  108. pygame.quit()
  109. sys.exit()
  110. # 更新背景管理类中的内容
  111. self.bg_manage.update()
  112. self.player_manage.update()
  113. self.prop_manage.update()
  114. # 组与组之间的碰撞检测
  115. result = pygame.sprite.groupcollide(self.player_manage.player_group, self.prop_manage.prop_group, False, True)
  116. if result:
  117. print("吃到了道具")
  118. pygame.display.flip()
  119. mg = Manage()
  120. mg.run()

5、UI的使用 (字体,鼠标点击检测)

  1. import sys
  2. import pygame
  3. # 游戏状态 ready 未开始 gaming 游戏中 end 游戏结束
  4. # 创建点击检测类
  5. class Util:
  6. """
  7. 工具类: 提供静态方法
  8. """
  9. @staticmethod
  10. def check_click(sprite):
  11. # 如果是鼠标的左键
  12. """
  13. 精灵的点击检测
  14. """
  15. if pygame.mouse.get_pressed()[0]:
  16. if sprite.rect.collidepoint(pygame.mouse.get_pos()):
  17. return True
  18. return False
  19. # 创建ui精灵类 继承pygame精灵
  20. class UISprite(pygame.sprite.Sprite):
  21. def __init__(self, name, center):
  22. super().__init__()
  23. self.image = pygame.image.load(name)
  24. self.rect = self.image.get_rect()
  25. self.rect.center = center
  26. # 构造Ui精灵管理类
  27. class UIManage:
  28. def __init__(self, gm):
  29. self.gm = gm
  30. self.foot = pygame.font.Font("font/font.ttf", 30)
  31. # 创建一个游戏前的精灵组
  32. self.ready_group = pygame.sprite.Group()
  33. self.begin_btn = UISprite("img/begin_btn.png", (200, 300))
  34. self.begin_btn.add(self.ready_group)
  35. # 游戏中在屏幕显示字体
  36. self.score_surface = self.foot.render(f"Score:{0}", True, (255, 0, 0))
  37. # 游戏结束
  38. self.end_group = pygame.sprite.Group()
  39. self.gm_over_btn = UISprite("img/begin_btn.png", (200, 300))
  40. self.gm_over_btn.add(self.end_group)
  41. def update(self):
  42. # 游戏前有一个开始按钮
  43. if self.gm.state == "ready":
  44. self.ready_group.draw(self.gm.screen)
  45. # 把开始精灵传入工具类
  46. if Util.check_click(self.begin_btn):
  47. # 状态切换到游戏中
  48. self.gm.state = "gaming"
  49. elif self.gm.state == "gaming":
  50. # 游戏中会显示一个游戏分数的字体
  51. self.gm.screen.blit(self.score_surface, (0, 0))
  52. elif self.gm.state == "end":
  53. # 游戏结束会出现重新开始按钮 点击重新开始会再次切换到游戏中
  54. self.end_group.draw(self.gm.screen)
  55. if Util.check_click(self.gm_over_btn):
  56. self.gm.state = "gaming"
  57. class GameManage:
  58. def __init__(self):
  59. pygame.init()
  60. self.screen = pygame.display.set_mode((400, 600))
  61. self.state = "ready"
  62. # 实例化UI精灵管理类
  63. self.ui_manage = UIManage(self)
  64. def run(self):
  65. while True:
  66. for event in pygame.event.get():
  67. if event.type == pygame.QUIT:
  68. pygame.quit()
  69. sys.exit()
  70. # 测试一键自杀 游戏结束
  71. if event.type == pygame.KEYUP:
  72. if event.key == pygame.K_SPACE:
  73. self.state = "end"
  74. self.screen.fill((0, 255, 255))
  75. self.ui_manage.update()
  76. pygame.display.flip()
  77. gm = GameManage()
  78. gm.run()

开始前:

游戏中:

游戏结束:

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