-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
209 lines (191 loc) · 7.73 KB
/
main.py
File metadata and controls
209 lines (191 loc) · 7.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#coding=utf-8
import pygame
import sys
import traceback
import plane_factory
import bullet_factory
import bullet
import level
import supply
import random
import barrier
import flywight
import command
import button
from pygame.locals import *
pygame.init()
pygame.mixer.init()
bg_size = width, height = 480, 700
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("飞机大战")
pygame.mixer.music.load("sound/game_music.ogg")
pygame.mixer.music.set_volume(0.2)
def readyForGame(clock, flyWight, enemy_plane):
levelButtons = (\
button.Button(flyWight.level_1_image),\
button.Button(flyWight.level_2_image),\
button.Button(flyWight.level_3_image),\
)
top = 300
for each in levelButtons:
each.layOut(((bg_size[0] - each.rect.width) // 2, top))
top += 100
levelButtons[0].setListener(level.Level_1(enemy_plane, bg_size))
levelButtons[1].setListener(level.Level_2(enemy_plane, bg_size))
levelButtons[2].setListener(level.Level_3(enemy_plane, bg_size))
while True:
clock.tick(60)
pygame.display.update()
screen.blit(flyWight.background, (0, 0))
gamestart_text = flyWight.start_font.render("Welecome to Airplane War", True, flyWight.WHITE)
gamestart_text_rect = gamestart_text.get_rect()
gamestart_text_rect.left, gamestart_text_rect.top = (width - gamestart_text_rect.width) // 2, 100
screen.blit(gamestart_text, gamestart_text_rect)
for each in levelButtons:
each.showImage(screen)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
for each in levelButtons:
if each.isClicked(pos):
return each.done()
pygame.display.flip()
def gameOver(clock, flyWight, score):
pygame.mixer.music.stop()
pygame.mixer.stop()
gameAgainButton = button.Button(flyWight.again_image)
gameOverButton = button.Button(flyWight.gameover_image)
pos_again = (bg_size[0] - gameAgainButton.rect.width) // 2, 400
gameAgainButton.layOut(pos_again)
pos_gameOver = (bg_size[0] - gameOverButton.rect.width) // 2, 500
gameOverButton.layOut(pos_gameOver)
while True:
clock.tick(60)
pygame.display.update()
screen.blit(flyWight.background, (0, 0))
gameover_text1 = flyWight.gameover_font.render("Your Score", True, flyWight.WHITE)
gameover_text1_rect = gameover_text1.get_rect()
gameover_text1_rect.left, gameover_text1_rect.top = (width - gameover_text1_rect.width) // 2, 200
screen.blit(gameover_text1, gameover_text1_rect)
gameover_text2 = flyWight.gameover_font.render(str(score), True, flyWight.WHITE)
gameover_text2_rect = gameover_text2.get_rect()
gameover_text2_rect.left, gameover_text2_rect.top = (width - gameover_text2_rect.width) // 2, 300
screen.blit(gameover_text2, gameover_text2_rect)
gameAgainButton.showImage(screen)
gameOverButton.showImage(screen)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == MOUSEBUTTONDOWN:
pos = pygame.mouse.get_pos()
if gameAgainButton.isClicked(pos):
main()
elif gameOverButton.isClicked(pos):
pygame.quit()
sys.exit()
pygame.display.flip()
def main():
clock = pygame.time.Clock()
pygame.mixer.music.play(-1)
flyWight = flywight.Common_FlyWight()
#生成飞机
me = plane_factory.ClientPlaneFactory.createPlane(bg_size)#生成我方飞机
enemy_plane = pygame.sprite.Group()#敌方飞机集合
#获取用户设置的关卡等级,以此用于敌军集合的生成,且生成敌军
readyForGame(clock, flyWight, enemy_plane)
#生成子弹
bulletGroup = bullet.BulletGroup(me)
#给飞机装配子弹
me.fire_command = command.FireBulletCommand(bulletGroup)
#生成补给
bullet_supply = supply.Bullet_Supply(bg_size)
bomb_supply = supply.Bomb_Supply(bg_size)
supplyFlyWight = flywight.Supply_FlyWight()
pygame.time.set_timer(supplyFlyWight.SUPPLY_TIME, 30 * 1000)
#生成障碍物
aerolite_barrier = barrier.Aerolite_Barrier(bg_size)
barrierFlyWight = flywight.Aerolite_Barrier_FlyWight()
pygame.time.set_timer(barrierFlyWight.BARRIER_TIME, 10 * 1000)
score = 0#统计得分
delay = 100#延迟
while me.life_num:
#TODO:对事件进行分析
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:#键盘事件
if event.key == K_SPACE:#空格键 使用炸弹
if me.bomb_num:#使用炸弹
me.bomb_num -= 1
supplyFlyWight.bomb_sound.play()
if aerolite_barrier.rect.bottom > 0:
aerolite_barrier.active = False#在界面中的障碍物
for each in enemy_plane:
if each.rect.bottom > 0:#在界面中的敌机
each.active = False
elif event.type == supplyFlyWight.SUPPLY_TIME:#补给时间
supplyFlyWight.supply_sound.play()
#随机生成补给
if random.choice([True, False]):
bullet_supply.reset()
else:
bomb_supply.reset()
elif event.type == supplyFlyWight.DOUBLE_BULLET_TIME:
me.is_double_bullet = False
pygame.time.set_timer(supplyFlyWight.DOUBLE_BULLET_TIME, 0)
elif event.type == barrierFlyWight.BARRIER_TIME:
aerolite_barrier.reset()
screen.blit(flyWight.background, (0, 0))
#检测键盘操作
key_pressed = pygame.key.get_pressed()
if key_pressed[K_w] or key_pressed[K_UP]:
me.moveUp()
if key_pressed[K_s] or key_pressed[K_DOWN]:
me.moveDown()
if key_pressed[K_a] or key_pressed[K_LEFT]:
me.moveLeft()
if key_pressed[K_d] or key_pressed[K_RIGHT]:
me.moveRight()
#绘制补给
bullet_supply.drawSupply(screen, me)
bomb_supply.drawSupply(screen, me)
#绘制障碍物
aerolite_barrier.drawBarrier(screen, me)
#发射子弹
if not (delay % 10):
me.fireBullet()
#检测子弹是否击中物体
bulletGroup.hitPlaneAndBarrier(screen, enemy_plane, aerolite_barrier)
#绘制敌机
for each in enemy_plane:
getScore = each.drawPlane(screen, delay)
if getScore != 0:
score += getScore
each.reset()
#检测客户机是否被撞
me.checkPlane(enemy_plane)
#绘制客户机
getScore = me.drawPlane(screen, delay)
score += getScore
#画出生命值和分数
me.drawLifeNumAndScore(screen, flyWight.score_font, score)
delay -= 1
if not delay:
delay = 100
pygame.display.flip()
clock.tick(60)
gameOver(clock, flyWight, score)
if __name__ == "__main__":
try:
main()
except SystemExit:
pass
except:
traceback.print_exc()
pygame.quit()
input()