pygame制作飞机大战

旧城等待, 2023-01-19 09:42 278阅读 0赞

今天正好有些时间,就把前两天看到的一篇制作飞机大战的文章
https://blog.csdn.net/A757291228/article/details/116305295,按照步骤复现了一下,同时也改进了其中的一些内容,总结记录一下整个复现过程。

首先制作飞机大战用到的一个包pygame,这个包我之前没接触过,不过没关系,安装一个这个包,接着做。自己按照文章的内容敲一遍代码,然后大致了解了这个包的一些用法:

  1. pygame制作的游戏的流程大致是这样的:
    在这里插入图片描述
  2. 可以看出整体通过一个循环不断执行代码,直到游戏终止,所以每次循环体内都是游戏运行过程中发生的所有事件的处理方法,最后通过刷新界面显示处理后的结果。
  3. 主要用到pygame中的如下方法

































函数 说明
init 初始化界面
imgae.load 加载某个路径下的图片
display.set_mode 设置界面的大小
screen.blit 将加载的图片传到界面中的某个位置进行展示
event.get() 捕获所有的事件,关于pygame中的事件其实和c#做winform窗体类似,有很多事件,捕获到事件后,然后对捕获的不同的事件设置不同的响应。
display.update() 刷新界面,不刷新界面,是没有办法展现的。
  1. 由于制作的相对来说是比较简单的,所以大体上就用到了上述方法,所以主要的内容就是写处理事件响应代码。
  2. 另外,自己做出了一些小的改动,添加了一些新的事件,修改了一些事件的响应,比如:子弹打到敌机之后子弹和敌机同时消失、飞机按方向键松开后就停止移动。

完整代码如下:
关于代码中的素材,请点击下载

  1. import math
  2. import random
  3. import pygame
  4. bg = pygame.image.load(r'.\img\bg.png') # load加载图片,背景图
  5. hero = pygame.image.load(r'.\img\hero1.png') # 主角图
  6. enemy = pygame.image.load(r'.\img\enemy1.png') # 敌人图
  7. enemy_boom = pygame.image.load(r'.\img\enemy1_down1.png') # 敌人爆炸图
  8. bullet = pygame.image.load(r'.\img\bullet1.png') # 子弹图
  9. heroX = 250
  10. heroY = 680
  11. stepX = 0
  12. stepY = 0
  13. bullets_pos = []
  14. enemy_speed = 2
  15. enemy_objs = []
  16. pygame.init()
  17. screen = pygame.display.set_mode((600, 800)) # 创建窗口,窗口的大小为(600, 800)
  18. pygame.display.set_caption("这是一个飞机游戏") # 设置窗口的标题
  19. def distance(bx, by, ex, ey):
  20. a = bx - ex
  21. b = by - ey
  22. return math.sqrt(a * a + b * b)
  23. def screen_border(X, Y):
  24. # 左右屏幕
  25. if X < 0:
  26. X = 0
  27. elif X > 500:
  28. X = 500
  29. # 上下屏幕
  30. if Y < 0:
  31. Y = 0
  32. elif Y > 700:
  33. Y = 700
  34. return X, Y
  35. def keydown_envent(event, stepX, stepY, hero_pos):
  36. """ 按键事件控制目标移动 :param event: 事件 :param stepX: x方向移动距离 :param stepY: y方向移动距离 :return: 移动后的stepX和stepY """
  37. bullet_pos = []
  38. if event.key == pygame.K_RIGHT:
  39. stepX = 2
  40. elif event.key == pygame.K_LEFT:
  41. stepX = -2
  42. elif event.key == pygame.K_UP:
  43. stepY = -2
  44. elif event.key == pygame.K_DOWN:
  45. stepY = 2
  46. elif event.key == pygame.K_SPACE:
  47. bullet_pos = [hero_pos[0], hero_pos[1]]
  48. return stepX, stepY, bullet_pos
  49. def enemy_show(enemy_objs, startY=-40):
  50. """ 添加5个敌人,并令敌人移动5个单位 :param enemy_objs: :param startY: 敌人出现的y坐标位置 :return: enemy_objs 返回敌人移动后的坐标 """
  51. if len(enemy_objs) < 5:
  52. while len(enemy_objs) < 5:
  53. enemy_X = random.randint(0, 500)
  54. enemy_pos = [enemy_X, startY]
  55. screen.blit(enemy, enemy_pos)
  56. enemy_objs.append(enemy_pos)
  57. else:
  58. i = 0
  59. for pos in enemy_objs:
  60. if pos[1] >= 700:
  61. pos[1] = 0
  62. screen.blit(enemy, pos)
  63. enemy_objs[i] = [pos[0], pos[1] + enemy_speed]
  64. i = i + 1
  65. return enemy_objs
  66. while True:
  67. bullet_pso = []
  68. heroX += stepX
  69. heroY += stepY
  70. heroX, heroY = screen_border(heroX, heroY)
  71. screen.blit(bg, (0, 0)) # blit在屏幕上画出加载的图片,第一个参数是图片参数,第二个参数是整个屏幕的x和y坐标,x越大越靠右,y越大越靠下
  72. screen.blit(hero, (heroX, heroY))
  73. enemy_objs = enemy_show(enemy_objs) # 增加敌机
  74. i = 0
  75. for v in bullets_pos:
  76. if v[1] < 0:
  77. pass
  78. bullets_pos[i] = [v[0], v[1] - 5]
  79. screen.blit(bullet, (bullets_pos[i][0] + 45, bullets_pos[i][1]))
  80. distance_b = [bullets_pos[i][0], bullets_pos[i][1]]
  81. ei = 0
  82. for ep in enemy_objs:
  83. if distance(distance_b[0], distance_b[1], ep[0], ep[1]) < 60:
  84. screen.blit(enemy_boom, (ep[0], ep[1]))
  85. bullets_pos[i][1] = -1
  86. enemy_objs[ei] = [random.randint(0, 500), -50]
  87. ei = ei + 1
  88. i = i + 1
  89. for event in pygame.event.get(): # get()将会获取玩家做的所有事情
  90. if event.type == pygame.QUIT:
  91. exit()
  92. if event.type == pygame.KEYUP:
  93. if event.key == pygame.K_SPACE:
  94. pass
  95. else:
  96. stepX = stepY = 0
  97. if event.type == pygame.KEYDOWN:
  98. stepX, stepY, bullets_pos_ = keydown_envent(event, stepX, stepY, [heroX, heroY])
  99. if len(bullets_pos_) > 0:
  100. bullets_pos.append(bullets_pos_)
  101. pygame.display.update() # 刷新界面

发表评论

表情:
评论列表 (有 0 条评论,278人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java飞机

    一、项目分析 1、设计步骤 在一个Java Swing的小游戏中,首先需要考虑的是组件的绘制,其次是如何让需要运动的组件运动起来,最后是如何检测物体的碰撞等。 (1)