• python第三方库pygame的使用


            作用:pygame一般用来做游戏

            注意:1.在使用pygame提供的功能之前,需要调用init方法

                       2.在游戏结束前需要调用 quit 方法

            pygame中的各个函数:

    1.pygame.init():该函数在使用pygame时进行初始化,只有引用了该函数才能使用pygame提供的所用功能

    2.pygame.Rect():该函数可以设置一张图片的位置以及大小,这是一个特殊的函数,不需要引用init函数都可以使用

    3.pygame.display.set_mode(resolution=(0,0),flags=0,depth=0):该函数可以创建游戏的主窗口对象,

            参数1:指定屏幕的宽和高,默认与屏幕大小一致

            参数2:指定屏幕的附加选项,默认不传递

            参数3:颜色的位数,默认自动匹配

    4.pygame.display.update():刷新主窗口内容

    5.pygame.image.load():加载需要的图片

    6.主窗口对象.blit(图像,位置):将图像绘制到指定的位置

    7.pygame.time.Clock():创建一个时间对象,用来控制帧率

    8.时间对象.tick(数字):控制每秒的帧率

    9.pygame.event.get():事件监听,返回的是一个列表

    10.pygame.sprite.Sprite:精灵,用来存储图像数据images和rect的对象

    11.pygame.sprite.Group(精灵1,精灵2):创建精灵组对象

    12.精灵组对象.update():更新精灵组中精灵的位置

    13.精灵组对象.draw():把精灵组中的所有精灵绘画到主窗口

    14.pygame.time.set_time(eventid,milliseconds):设置每个一段时间程序会执行什么内容,第一个需要基于常量pygame.USEREVENT来指定,第二个参数是毫秒值

    15.pygame.key.get_pressed():按键监听,会返回所有按键的元组,通过键盘常量,判断元组中某个按键是否被触发,如果被触发对应数值为1

    16.pygame.sprite.groupcollide(精灵组1,精灵组2,bool,bool):检测两个精灵组的碰撞,会返回一个字典,第一个参数和第三个参数关联,第二个参数和第四个参数关联,当bool类型为真时,碰撞会被销毁

    17.pygame.sprite.spritecollide(精灵,精灵组,bool):检测精灵和精灵组的碰撞,会返回一个精灵组的列表,当bool类型为真时,精灵组会被销毁

             一个飞机大战的游戏总结:

    1. import pygame
    2. import time
    3. from plane_Sprite import *
    4. class PlaneGame(object):
    5. def __init__(self):
    6. print('初始化')
    7. # 1.创建游戏窗口
    8. self.screem = pygame.display.set_mode(SCREEM_RECT.size) # 这里需要拿到元组类型的数据,使用 .size 可以拿到数组中的数据
    9. # 2.创建游戏时钟
    10. self.clock = pygame.time.Clock()
    11. # 3.调用私有方法,精灵和精灵组的创建
    12. self.__create_sprite()
    13. # 4.创建敌机定时器
    14. pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
    15. # 5.创建子弹定时器
    16. pygame.time.set_timer(HERO_FIRE_EVENT, 500)
    17. def __create_sprite(self):
    18. # 创建背景精灵类
    19. # bg1 = BackGround('./images/background.jpg')
    20. # bg2 = BackGround('./images/background.jpg')
    21. bg1 = BackGround()
    22. bg2 = BackGround(True)
    23. self.back_groud = pygame.sprite.Group(bg1, bg2) # 创建背景精灵组
    24. self.enemy_group = pygame.sprite.Group() # 创建敌机精灵组
    25. self.he1 = Hero()
    26. self.hero_group = pygame.sprite.Group(self.he1) # 创建英雄精灵组
    27. def StartGame(self):
    28. print('开始游戏')
    29. while True:
    30. # 1.设置刷新的帧率
    31. self.clock.tick(SHUA)
    32. # 2.事件监听
    33. self.__event_handler()
    34. # 3.碰撞检测
    35. self.__check_cllide()
    36. # 4.更新/和绘制精灵组图片
    37. self.__update_sprite()
    38. # 5.更新显示
    39. pygame.display.update()
    40. # 定义私有方法
    41. def __event_handler(self):
    42. """监听事件处理"""
    43. for event in pygame.event.get():
    44. if event.type == pygame.QUIT:
    45. # 调用静态方法:使用类名
    46. PlaneGame.__game_over()
    47. # 判断定时器事件
    48. elif event.type == CREATE_ENEMY_EVENT:
    49. # 创建敌机对象
    50. enemy = Enemy()
    51. # 添加到精灵组中
    52. self.enemy_group.add(enemy)
    53. elif event.type == HERO_FIRE_EVENT:
    54. self.he1.fire()
    55. # 获取键盘信息
    56. key_pressed = pygame.key.get_pressed()
    57. # 判断对应的键盘
    58. if key_pressed[pygame.K_RIGHT]:
    59. self.he1.speed = 3
    60. elif key_pressed[pygame.K_LEFT]:
    61. self.he1.speed = -3
    62. elif key_pressed[pygame.K_UP]:
    63. self.he1.speed = -2
    64. elif key_pressed[pygame.K_DOWN]:
    65. self.he1.speed = 2
    66. else:
    67. self.he1.speed = 0
    68. def __check_cllide(self):
    69. """碰撞检测"""
    70. # 子弹摧毁敌机
    71. pygame.sprite.groupcollide(self.he1.bullets, self.enemy_group, True, True)
    72. # 敌机撞毁英雄
    73. enemy_list = pygame.sprite.spritecollide(self.he1, self.enemy_group,True)
    74. if len(enemy_list) > 0:
    75. # 销毁英雄
    76. self.he1.kill()
    77. # 结束游戏
    78. PlaneGame.__game_over()
    79. def __update_sprite(self):
    80. """更新精灵组"""
    81. self.back_groud.update() # 刷新图像数据
    82. self.back_groud.draw(self.screem) # 绘画图像
    83. # 敌机精灵组更新
    84. self.enemy_group.update()
    85. self.enemy_group.draw(self.screem)
    86. # 英雄精灵组更新
    87. self.hero_group.update()
    88. self.hero_group.draw(self.screem)
    89. # 子弹精灵组更新
    90. self.he1.bullets.update()
    91. self.he1.bullets.draw(self.screem)
    92. @staticmethod # 静态方法
    93. def __game_over():
    94. """结束游戏"""
    95. print('游戏结束')
    96. pygame.quit()
    97. exit()
    98. if __name__ == "__main__":
    99. # 创建游戏对象
    100. plane_start = PlaneGame()
    101. # 启动游戏
    102. plane_start.StartGame()

    上面是游戏实现功能的代码

    1. import random
    2. import pygame
    3. # 定义常量,一般使用大写字母'
    4. # 屏幕大小常量
    5. SCREEM_RECT = pygame.Rect(0, 0, 591, 764)
    6. # 刷新的帧率
    7. SHUA = 60
    8. # 设置敌机定时器事件常量
    9. CREATE_ENEMY_EVENT = pygame.USEREVENT
    10. # 设置英雄子弹定时器事件常量
    11. HERO_FIRE_EVENT = pygame.USEREVENT + 1 # 因为 pygame.USEREVENT 被占用,所以需要加1进行区分
    12. class GameSprite(pygame.sprite.Sprite):
    13. """飞机大战游戏精灵"""
    14. def __init__(self, image_name, speed = 1):
    15. # 需要调用超级初始化方法
    16. super().__init__()
    17. # 定义属性
    18. self.image = pygame.image.load(image_name) # 加载图像
    19. self.rect = self.image.get_rect() # 获取到图像位置变更的信息
    20. self.speed = speed # 设置变更的速度
    21. def update(self):
    22. # 在屏幕垂直向上移动
    23. self.rect.y += self.speed
    24. # 创建一个子类,完成屏幕需求
    25. class BackGround(GameSprite):
    26. """游戏背景精灵"""
    27. # is_alt 判断参数
    28. def __init__(self, is_alt= False):
    29. # 调用父类初始化方法设置参数
    30. super().__init__('./images/background.jpg')
    31. # 判断是否是叠加图像
    32. if is_alt:
    33. self.rect.y = -self.rect.height
    34. def update(self):
    35. # 调用父类的方法
    36. super().update()
    37. # 2.判断是否移出屏幕,移出屏幕,重新设置到屏幕上方
    38. if self.rect.y >= SCREEM_RECT.height:
    39. self.rect.y = -self.rect.height
    40. # 创建敌机类
    41. class Enemy(GameSprite):
    42. def __init__(self):
    43. # 1.调用父类方法,创建敌机精灵,同时指定敌机图片
    44. super().__init__('./images/enemy_2.jpg')
    45. # 2.指定敌机的初始随机速度
    46. self.speed = random.randint(1, 3)
    47. # 3.指定敌机的初始随机位置
    48. self.rect.bottom = 0
    49. max_x = SCREEM_RECT.width - self.rect.width # 计算x的最大值
    50. self.rect.x = random.randint(0, max_x)
    51. def update(self):
    52. # 调用父类方法,保持垂直飞行
    53. super().update()
    54. # 判断是否非常屏幕,是,则删除精灵组
    55. if self.rect.y >= SCREEM_RECT.height + self.rect.height:
    56. # kill 方法可以将精灵从精灵组中移除,精灵就会被自动销毁
    57. self.kill()
    58. def __del__(self):
    59. # print('%s' % self.rect)
    60. pass
    61. # 创建英雄类
    62. class Hero(GameSprite):
    63. def __init__(self):
    64. # 1.调用父类中的初始方法,加载图片
    65. super().__init__('./images/planeNormal_2.jpg', 0)
    66. # 2.重新设置位置
    67. self.rect.centerx = SCREEM_RECT.centerx
    68. self.rect.bottom = SCREEM_RECT.bottom - 80
    69. # 创建子弹组
    70. self.bullets = pygame.sprite.Group()
    71. def update(self):
    72. self.rect.x += self.speed
    73. # 控制屏幕不会出界
    74. if self.rect.x <= -30:
    75. self.rect.x = -30
    76. elif self.rect.right >= SCREEM_RECT.right + 30:
    77. self.rect.right = SCREEM_RECT.right + 30
    78. def fire(self):
    79. # 设置每次发射三枚子弹
    80. for i in (0, 1, 2):
    81. # 1.创建子弹精灵
    82. bullet = Bullet()
    83. # 2.设置精灵位置
    84. bullet.rect.bottom = self.rect.y - i * 24
    85. bullet.rect.centerx = self.rect.centerx
    86. # 3.将精灵添加到精灵组
    87. self.bullets.add(bullet)
    88. # 创建子弹类
    89. class Bullet(GameSprite):
    90. def __init__(self):
    91. # 调用父类方法
    92. super().__init__('./images/bullet2.jpg', -3)
    93. def update(self):
    94. super().update()
    95. if self.rect.bottom < 0:
    96. self.kill()

    上面是每个精灵实现的代码,改代码段命名为 plane_Sprite,作为一个模块在功能实现代码中被引用,上面代码用到的图片需要自己找

            【代码实现效果】

     

  • 相关阅读:
    java计算机毕业设计项目材料管理系统源码+系统+数据库+lw文档+mybatis+运行部署
    React报错之React hook ‘useState‘ cannot be called in a class component
    信息学奥赛一本通 1361:产生数(Produce)
    渗透测试-命令执行注入
    [附源码]计算机毕业设计springboot行程规划app
    C# access to the path is denied
    神经网络之万能定理python-pytorch实现,可以拟合任意曲线
    索引的创建和设计原则
    Python:实现radix sort基数排序算法(附完整源码)
    Java 接口详解
  • 原文地址:https://blog.csdn.net/weixin_62859191/article/details/126511157