1 import random
2 import pygame
3 SCREEN_RECT=pygame.Rect(0,0,480,700)
4 FAME_PER_SEC=60
5 # fame_per_sec
6 CREATE_ENEMY_EVENT=pygame.USEREVENT
7 HERO_FIRE_EVENT=pygame.USEREVENT+1
8
9 class GameSprite(pygame.sprite.Sprite):
10 def __init__(self,image_name,speed=1):
11 super().__init__()
12 self.image=pygame.image.load(image_name)
13 self.rect=self.image.get_rect()
14 self.speed=speed
15
16 def update(self):
17 self.rect.y+=self.speed
18
19 class Backrgound(GameSprite):
20 def __init__(self,is_alt=False):
21 super().__init__("./images/background.png")
22 if is_alt:
23 self.rect.y=-self.rect.height
24
25 def update(self):
26 super().update()
27 if self.rect.y>=SCREEN_RECT.height:
28 self.rect.y=-self.rect.height
29
30 class Enemy(GameSprite):
31 def __init__(self):
32 super().__init__("./images/enemy1.png")
33 self.speed=random.randint(1,3)
34 self.rect.bottom=0
35 max_x=SCREEN_RECT.width-self.rect.width
36 self.rect.x=random.randint(0,max_x)
37
38 def update(self):
39 super().update()
40 if self.rect.y>=SCREEN_RECT.height:
41 # print("飞出屏幕,需要从精灵组删除...")
42 self.kill()
43
44 def __del__(self):
45 # print("敌机销毁 %s"%self.rect)
46 pass
47
48 class Hero(GameSprite):
49 def __init__(self):
50 super().__init__("./images/me1.png",0)
51
52 self.rect.centerx=SCREEN_RECT.centerx
53 self.rect.bottom=SCREEN_RECT.bottom-120
54
55 self.bullets=pygame.sprite.Group()
56 def update(self):
57 self.rect.x+=self.speed
58 if self.rect.x<0:
59 self.rect.x=0
60 elif self.rect.right>SCREEN_RECT.right:
61 self.rect.right=SCREEN_RECT.right
62 def fire(self):
63 print("发射子弹...")
64 for i in (0,1,2):
65 bullet=Bullet()
66 bullet.rect.bottom=self.rect.y -i*20
67 bullet.rect.centerx=self.rect.centerx
68 self.bullets.add(bullet)
69
70 import pygame
71 from plane_sprites import *
72
73 class PlaneGame(object):
74 def __init__(self):
75 print("游戏初始化...")
76 self.screen=pygame.display.set_mode(SCREEN_RECT.size)
77 self.clcok=pygame.time.Clock()
78 self.__create_sprites()
79 pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)
80 pygame.time.set_timer(HERO_FIRE_EVENT,500)
81
82 def __create_sprites(self):
83 bg1=Backrgound()
84 bg2=Backrgound(True)
85 # bg2.rect.y=-bg2.rect.height
86 self.back_ground=pygame.sprite.Group(bg1,bg2)
87
88 self.enemy_group=pygame.sprite.Group()
89
90 self.hero=Hero()
91 self.hero_group=pygame.sprite.Group(self.hero)
92
93 def start_game(self):
94 print("游戏开始...")
95 while True:
96 self.clcok.tick(FAME_PER_SEC)
97 self.__event_handler()
98 self.__check_collide()
99 self.__update_sprites()
100 pygame.display.update()
101
102 def __event_handler(self):
103 for event in pygame.event.get():
104 if event.type==pygame.QUIT:
105 PlaneGame.__game_over()
106 elif event.type==CREATE_ENEMY_EVENT:
107 print("敌机出场...")
108 enemy=Enemy()
109 self.enemy_group.add(enemy)
110 elif event.type==HERO_FIRE_EVENT:
111 self.hero.fire()
112 # elif event.type==pygame.KEYDOWN and pygame.K_RETURN:
113 # print("向右移动...")
114 keys_pressend=pygame.key.get_pressed()
115 if keys_pressend[pygame.K_RIGHT]:
116 self.hero.speed=2
117 elif keys_pressend[pygame.K_LEFT]:
118 self.hero.speed=-2
119 else:
120 self.hero.speed=0
121
122 def __check_collide(self):
123 pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True)
124 enemies=pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
125 if len(enemies)>0:
126 self.hero.kill()
127 PlaneGame.__game_over()
128
129 def __update_sprites(self):
130 self.back_ground.update()
131 self.back_ground.draw(self.screen)
132
133 self.enemy_group.update()
134 self.enemy_group.draw(self.screen)
135
136 self.hero_group.update()
137 self.hero_group.draw(self.screen)
138
139 self.hero.bullets.update()
140 self.hero.bullets.draw(self.screen)
141
142 @staticmethod
143 def __game_over():
144 print("游戏结束")
145 pygame.quit()
146 exit()
147
148 if __name__ == '__main__':
149 game=PlaneGame()
150 game.start_game()