2020年9月12日星期六

94B 《零基礎入門學習Python》筆記 第094講:Pygame:飛機大戰5 下

<續上>

  1. #myplane.py
  2. import pygame
  3. class Myplane(pygame.sprite.Sprite):
  4. def __init__(self, bg_size):
  5. pygame.sprite.Sprite.__init__(self)
  6. self.image1 = pygame.image.load("images/me1.png").convert_alpha()
  7. self.image2 = pygame.image.load("images/me2.png").convert_alpha()
  8. #添加坠机图片
  9. self.destroy_images = []
  10. self.destroy_images.extend([\
  11. pygame.image.load("images/me_destroy_1.png").convert_alpha(), \
  12. pygame.image.load("images/me_destroy_2.png").convert_alpha(), \
  13. pygame.image.load("images/me_destroy_3.png").convert_alpha(), \
  14. pygame.image.load("images/me_destroy_4.png").convert_alpha() \
  15. ])
  16. self.rect = self.image1.get_rect()
  17. self.width, self.height = bg_size[0], bg_size[1]
  18. self.rect.left, self.rect.top = \
  19. (self.width - self.rect.width) // 2, \
  20. self.height - self.rect.height - 60 #减60,留给状态栏
  21. self.speed = 10
  22. self.active = True
  23. self.mask = pygame.mask.from_surface(self.image1) #将非透明部分标记为mask
  24. def moveUp(self):
  25. if self.rect.top > 0:
  26. self.rect.top -= self.speed
  27. else:
  28. self.rect.top = 0
  29. def moveDown(self):
  30. if self.rect.bottom < self.height - 60:
  31. self.rect.top += self.speed
  32. else:
  33. self.rect.bottom = self.height - 60
  34. def moveLeft(self):
  35. if self.rect.left > 0:
  36. self.rect.left -= self.speed
  37. else:
  38. self.rect.left = 0
  39. def moveRight(self):
  40. if self.rect.right < self.width:
  41. self.rect.left += self.speed
  42. else:
  43. self.rect.right = self.width
  1. #enemy.py
  2. import pygame
  3. from random import *
  4. class SmallEnemy(pygame.sprite.Sprite):
  5. def __init__(self, bg_size):
  6. pygame.sprite.Sprite.__init__(self)
  7. self.image = pygame.image.load("images/enemy1.png").convert_alpha()
  8. #添加坠机图片
  9. self.destroy_images = []
  10. self.destroy_images.extend([\
  11. pygame.image.load("images/enemy1_down1.png").convert_alpha(), \
  12. pygame.image.load("images/enemy1_down2.png").convert_alpha(), \
  13. pygame.image.load("images/enemy1_down3.png").convert_alpha(), \
  14. pygame.image.load("images/enemy1_down4.png").convert_alpha() \
  15. ])
  16. self.rect = self.image.get_rect()
  17. self.width, self.height = bg_size[0], bg_size[1]
  18. self.speed = 2
  19. self.active = True
  20. self.rect.left, self.rect.top = \
  21. randint(0, self.width - self.rect.width), \
  22. randint(-5 * self.height, 0) #在页面外部上方5个屏幕高度范围内随机生成一个敌机
  23. self.mask = pygame.mask.from_surface(self.image) #将非透明部分标记为mask
  24. def move(self):
  25. if self.rect.top < self.height:
  26. self.rect.top += self.speed
  27. else:
  28. self.reset()
  29. def reset(self):
  30. self.active = True
  31. self.rect.left, self.rect.top = \
  32. randint(0, self.width - self.rect.width), \
  33. randint(-5 * self.height, 0)
  34. class MidEnemy(pygame.sprite.Sprite):
  35. energy = 8
  36. def __init__(self, bg_size):
  37. pygame.sprite.Sprite.__init__(self)
  38. self.image = pygame.image.load("images/enemy2.png").convert_alpha()
  39. self.image_hit = pygame.image.load("images/enemy2_hit.png").convert_alpha()#中弹图片
  40. #添加坠机图片
  41. self.destroy_images = []
  42. self.destroy_images.extend([\
  43. pygame.image.load("images/enemy2_down1.png").convert_alpha(), \
  44. pygame.image.load("images/enemy2_down2.png").convert_alpha(), \
  45. pygame.image.load("images/enemy2_down3.png").convert_alpha(), \
  46. pygame.image.load("images/enemy2_down4.png").convert_alpha() \
  47. ])
  48. self.rect = self.image.get_rect()
  49. self.width, self.height = bg_size[0], bg_size[1]
  50. self.speed = 1
  51. self.active = True
  52. self.rect.left, self.rect.top = \
  53. randint(0, self.width - self.rect.width), \
  54. randint(-10 * self.height, -self.height) #在页面外部上方1个到10个屏幕高度范围内随机生成一个敌机(1-10个,就保证了不会一开始出大一个大的)
  55. self.mask = pygame.mask.from_surface(self.image) #将非透明部分标记为mask
  56. self.energy = MidEnemy.energy
  57. self.hit = False #检测是否被击中的属性
  58. def move(self):
  59. if self.rect.top < self.height:
  60. self.rect.top += self.speed
  61. else:
  62. self.reset()
  63. def reset(self):
  64. self.active = True
  65. self.energy = MidEnemy.energy
  66. self.rect.left, self.rect.top = \
  67. randint(0, self.width - self.rect.width), \
  68. randint(-10 * self.height, -self.height)
  69. class BigEnemy(pygame.sprite.Sprite):
  70. energy = 20
  71. def __init__(self, bg_size):
  72. pygame.sprite.Sprite.__init__(self)
  73. #大型敌机有飞行特效,两张图片切换
  74. self.image1 = pygame.image.load("images/enemy3_n1.png").convert_alpha()
  75. self.image2 = pygame.image.load("images/enemy3_n2.png").convert_alpha()
  76. self.image_hit = pygame.image.load("images/enemy3_hit.png").convert_alpha()#中弹图片
  77. #添加坠机图片
  78. self.destroy_images = []
  79. self.destroy_images.extend([\
  80. pygame.image.load("images/enemy3_down1.png").convert_alpha(), \
  81. pygame.image.load("images/enemy3_down2.png").convert_alpha(), \
  82. pygame.image.load("images/enemy3_down3.png").convert_alpha(), \
  83. pygame.image.load("images/enemy3_down4.png").convert_alpha(), \
  84. pygame.image.load("images/enemy3_down5.png").convert_alpha(), \
  85. pygame.image.load("images/enemy3_down6.png").convert_alpha() \
  86. ])
  87. self.rect = self.image1.get_rect()
  88. self.width, self.height = bg_size[0], bg_size[1]
  89. self.speed = 1
  90. self.active = True
  91. self.rect.left, self.rect.top = \
  92. randint(0, self.width - self.rect.width), \
  93. randint(-15 * self.height, -5 * self.height) #在页面外部上方5-15个屏幕高度范围内随机生成一个敌机
  94. self.mask = pygame.mask.from_surface(self.image1) #将非透明部分标记为mask
  95. self.energy = BigEnemy.energy
  96. self.hit = False #检测是否被击中的属性
  97. def move(self):
  98. if self.rect.top < self.height:
  99. self.rect.top += self.speed
  100. else:
  101. self.reset()
  102. def reset(self):
  103. self.active = True
  104. self.energy = BigEnemy.energy
  105. self.rect.left, self.rect.top = \
  106. randint(0, self.width - self.rect.width), \
  107. randint(-15 * self.height, -5 * self.height)
(未完待續)

0 留言:

發佈留言