• pygame实现跳跃发射子弹打怪效果


    1. import pygame
    2. import sys,time,random
    3. from pygame.locals import *
    4. pygame.init()
    5. # 设置按下鼠标的时候一直触发
    6. pygame.key.set_repeat(10, 10)
    7. # 加载背景图片
    8. bg = pygame.image.load('./img/bg.png')
    9. # 加载左方向行走和站立图片
    10. heroLStand = pygame.image.load('img/heroLstand.png')
    11. heroL1 = pygame.image.load('img/heroL1.png')
    12. heroL2 = pygame.image.load('img/heroL2.png')
    13. heroL3 = pygame.image.load('img/heroL3.png')
    14. # 加载右方向行走和站立图片
    15. heroRStand = pygame.image.load('img/heroRstand.png')
    16. heroR1 = pygame.image.load('img/heroR1.png')
    17. heroR2 = pygame.image.load('img/heroR2.png')
    18. heroR3 = pygame.image.load('img/heroR3.png')
    19. # 加载障碍物
    20. zaw1 = pygame.image.load('img/zaw1.png')
    21. zaw2 = pygame.image.load('img/zaw2.png')
    22. zaw3 = pygame.image.load('img/zaw3.png')
    23. # 加载武器图片
    24. wq = pygame.image.load('img/b.png')
    25. effer = pygame.image.load('img/effer.png')
    26. clock = pygame.time.Clock()
    27. # 创建一个画布
    28. canvas = pygame.display.set_mode((1200,600))
    29. # 初始数据
    30. # 设置跳跃高度
    31. jumpHeight = 40
    32. # 设置移动速度
    33. moveSpeed = 10
    34. #------------------创建武器类----------------
    35. class Wq():#武器的属性有:皮肤,坐标以及宽高,以及方向
    36. def __init__(self,skin,x,y,width,height,direction):
    37. self.skin = skin
    38. self.x = x
    39. self.y = y
    40. self.width = width
    41. self.height = height
    42. self.direction = direction
    43. # 武器的移动
    44. def shoot(self):
    45. #如果方向是往右则x值增加
    46. if self.direction == "right":
    47. for i in range(10):
    48. self.x = self.x+2
    49. else:# 否则就是往左移动
    50. for i in range(10):
    51. self.x = self.x-2
    52. #------------------创建英雄类----------------
    53. # 英雄类:属性, 皮肤skin,坐标,x,y 宽高width,height
    54. n = 0# 实现动态切换不同的图片
    55. class Hero():
    56. def __init__(self,skin,x,y,width,height,direction="right"):
    57. self.skin = skin
    58. self.x = x
    59. self.y = y
    60. self.width = width
    61. self.height = height
    62. self.direction = direction
    63. # 往左移动的方法
    64. def goLeft(self):
    65. self.x = self.x-moveSpeed
    66. # 往右移动的方法
    67. def goRight(self):
    68. self.x = self.x+moveSpeed
    69. # 往左移动的时候,图片的切换(英雄人物的切换)
    70. def leftChange(self):
    71. global n
    72. if n%3 == 0:# 如果对3取余结果等于0,使用第一张图片
    73. self.skin = heroL1
    74. elif n%3 == 1:
    75. self.skin = heroL2
    76. else:
    77. self.skin = heroL3
    78. n = n+1
    79. # 往右移动的时候,图片的切换(英雄人物的切换)
    80. def rightChange(self):
    81. global n
    82. if n%3 == 0:# 如果对3取余结果等于0,使用第一张图片
    83. self.skin = heroR1
    84. elif n%3 == 1:
    85. self.skin = heroR2
    86. else:
    87. self.skin = heroR3
    88. n = n+1
    89. #-----------------创建英雄对象-------------
    90. # heroRStand,10,400,135,200
    91. hero = Hero(heroRStand,10,400,135,200)
    92. #----------------创建障碍物类---------------------
    93. # 障碍物的属性:x,y,skin,width,height
    94. # 障碍物的方法: 往左移动的方法
    95. class Zaw():# 障碍物类
    96. def __init__(self,x,y,skin,width,height):
    97. self.x = x
    98. self.y = y
    99. self.skin = skin
    100. self.width = width
    101. self.height = height
    102. def walk(self):# 设置往左移动的方法
    103. self.x = self.x - 3
    104. # 创建列表存储同时存储多个障碍物对象
    105. zawList = []
    106. createTime = 0# 用来存储创建障碍物对象的时间
    107. # 创建一个方法:批量的生成障碍物对象
    108. def createZaw():
    109. # 因为每次创建障碍物对象的时候,都需要看间隔时间,时间符合要求则创建
    110. # 更新时间
    111. global createTime
    112. # 检测时间间隔
    113. if time.time()-createTime > 3:
    114. # 更新一下创建障碍物的时间
    115. createTime = time.time()
    116. type = random.randint(1,3)
    117. if type == 1:
    118. # 如果type的值是1就要创建第一种障碍物
    119. zawenemy = Zaw(1200,500,zaw1,46,46)
    120. elif type == 2:
    121. # 如果type的值是2就要创建第2种障碍物
    122. zawenemy = Zaw(1200,500,zaw2,142,103)
    123. else:# 创建第3种障碍物
    124. zawenemy = Zaw(1200,450,zaw3,180,180)
    125. # 将障碍物追加列表
    126. zawList.append(zawenemy)
    127. #--------------批量创建障碍物对象---------------------
    128. #-----------------创建传送到画布方法-----------
    129. # 让背景往右移动
    130. bginit1 = -1200
    131. bginit2 = 0
    132. def draw():
    133. global bginit1,bginit2
    134. canvas.blit(bg,(bginit1,0))
    135. canvas.blit(bg,(bginit2,0))
    136. bginit1 = bginit1+1# 因为整体往右移动故2张背景图片x的值全部都在增加
    137. bginit2 = bginit2+1
    138. if bginit1>1200:
    139. bginit1 = -1200
    140. if bginit2>1200:
    141. bginit2 = -1200
    142. canvas.blit(hero.skin,(hero.x,hero.y))
    143. # 将障碍物列表中的所有障碍物传送到画布上
    144. for e in zawList:
    145. if e.x < -200:# 说明往左移动的到最左边出画布
    146. zawList.remove(e)# 从障碍物列表中移出该障碍物
    147. else:
    148. canvas.blit(e.skin,(e.x,e.y))
    149. e.walk()
    150. # 将武器绘制到画布上
    151. for w in wqList:
    152. if w.x<-200 or w.x>1200:
    153. wqList.remove(w)
    154. else:
    155. canvas.blit(w.skin,(w.x,w.y))
    156. w.shoot()
    157. def hit():
    158. # 武器和障碍物碰撞
    159. for w in wqList:
    160. for e in zawList:
    161. if w.x+w.width >= e.x and w.x<=e.x+e.width\
    162. and w.y+150>=e.y:
    163. for i in range(4):
    164. canvas.blit(effer,(e.x,e.y))
    165. wqList.remove(w)
    166. zawList.remove(e)
    167. # 事件监听方法
    168. isJump = False# 默认False没有跳跃
    169. wqList = []# 武器库
    170. # 设置发射时间间隔
    171. shootTime = 0
    172. def eventDeal():
    173. global isJump
    174. if hero.direction == "right":
    175. hero.skin = heroRStand# 默认向右站立
    176. elif hero.direction == "left":
    177. hero.skin = heroLStand
    178. # 遍历所有的事件
    179. for e in pygame.event.get():
    180. # 点击关闭按钮的时候,关闭窗口处理
    181. if e.type == QUIT:
    182. pygame.quit()# pygame退出相当于窗口关闭
    183. sys.exit()# 系统退出
    184. #---------------上下左右键监听处理-------------------
    185. if e.type == KEYDOWN:# 当检测按下按键的时候
    186. # 判断按的左键
    187. if e.key == K_LEFT:
    188. print('您刚才按下了左键')
    189. hero.goLeft()# 往左移动
    190. hero.leftChange()# 调用往左移动切换图片的效果
    191. hero.direction = "left"
    192. elif e.key == K_RIGHT:
    193. print('您刚才按下了右键')
    194. hero.direction = "right"
    195. hero.goRight()
    196. hero.rightChange()
    197. elif e.key == K_SPACE:# 检测到空格
    198. print('您刚才按下课空格键')
    199. isJump = True# 当点击空格的时候跳跃状态切换成True
    200. elif e.key == K_UP:
    201. global shootTime
    202. if time.time()-shootTime > 1:
    203. shootTime = time.time()
    204. # 通过武器类创建武器库
    205. w = Wq(wq,hero.x,hero.y+hero.height/8,20,\
    206. 56,hero.direction)
    207. # 将武器追加到武器库
    208. wqList.append(w)
    209. while True:
    210. clock.tick(15)
    211. if isJump:
    212. hero.y = hero.y-jumpHeight
    213. jumpHeight = jumpHeight-2
    214. if hero.y == 400:
    215. isJump = False
    216. jumpHeight = 40
    217. createZaw()# 程序帮我们创建障碍物
    218. draw()
    219. hit()
    220. eventDeal()
    221. pygame.display.update()

    整个代码下载位置:https://download.csdn.net/download/Gjanuary/88384893

  • 相关阅读:
    【网络】安装Nginx笔记
    webpack5配置代码分包
    Java的基础框架之SpringMvc第一讲(SpringMvc请求与响应以及REST风格,Postman的使用)
    9.8 段错误,虚拟内存,内存映射 CSAPP
    DPDK以太网部分代码整理
    中贝通信-603220 三季报分析(20231120)
    JDK中的Set和Map解析
    pycharm 用MD文件制作流程图
    全栈开发性能优化基础第一单元日考技能
    小细节,大问题。分享一次代码优化的过程
  • 原文地址:https://blog.csdn.net/Gjanuary/article/details/133419877