一、主函数部分
1 import pygame 2 import sys 3 import traceback 4 from pygame.locals import * 5 import myplane 6 import enemy 7 import bullet 8 import supply 9 import random 10 11 pygame.init() 12 bg_size = width, height = 400, 700 13 screen = pygame.display.set_mode(bg_size) 14 pygame.display.set_caption("飞机大战") 15 16 background = pygame.image.load("images/background.png").convert() 17 18 BLACK = (0,0,0) 19 GREEN = (0, 255, 0) 20 RED = (255, 0, 0) 21 WHITE = (255,255,255) 22 23 #载入游戏音乐 24 pygame.mixer.music.load("sound/game_music.ogg") 25 pygame.mixer.music.set_volume(0.2) 26 bullet_sound = pygame.mixer.Sound("sound/bullet.wav") 27 bullet_sound.set_volume(0.2) 28 bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav") 29 bomb_sound.set_volume(0.2) 30 supply_sound = pygame.mixer.Sound("sound/supply.wav") 31 supply_sound.set_volume(0.2) 32 get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav") 33 get_bomb_sound.set_volume(0.2) 34 get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav") 35 get_bullet_sound.set_volume(0.2) 36 upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav") 37 upgrade_sound.set_volume(0.2) 38 enemy3_fly_sound = pygame.mixer.Sound("sound/enemy3_flying.wav") 39 enemy3_fly_sound.set_volume(0.2) 40 enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav") 41 enemy1_down_sound.set_volume(0.2) 42 enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav") 43 enemy2_down_sound.set_volume(0.2) 44 enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav") 45 enemy3_down_sound.set_volume(0.5) 46 me_down_sound = pygame.mixer.Sound("sound/me_down.wav") 47 me_down_sound.set_volume(0.2) 48 49 def add_small_enemies(group1, group2, num): 50 for i in range(num): 51 e1 = enemy.SmallEnemy(bg_size) 52 group1.add(e1) 53 group2.add(e1) 54 55 def add_mid_enemies(group1, group2, num): 56 for i in range(num): 57 e1 = enemy.MidEnemy(bg_size) 58 group1.add(e1) 59 group2.add(e1) 60 61 def add_big_enemies(group1, group2, num): 62 for i in range(num): 63 e1 = enemy.BigEnemy(bg_size) 64 group1.add(e1) 65 group2.add(e1) 66 67 def inc_speed(target, inc): 68 for each in target: 69 each.speed += inc 70 71 def main(): 72 pygame.mixer.music.play(-1) 73 74 clock = pygame.time.Clock() 75 76 # 中弹图片索引 77 e1_destroy_index = 0 78 e2_destroy_index = 0 79 e3_destroy_index = 0 80 me_destroy_index = 0 81 82 me = myplane.MyPlane(bg_size) 83 84 enemies = pygame.sprite.Group() 85 86 # 生成敌方小型飞机 87 small_enemies = pygame.sprite.Group() 88 add_small_enemies(small_enemies, enemies, 15) 89 90 mid_enemies = pygame.sprite.Group() 91 add_mid_enemies(mid_enemies, enemies, 5) 92 93 big_enemies = pygame.sprite.Group() 94 add_big_enemies(big_enemies, enemies, 1) 95 96 running = True 97 switch_image = True 98 delay = 100 99 score = 0 100 score_font = pygame.font.Font("font/font.ttf", 36) 101 102 bullets = [] 103 104 # 生成普通子弹 105 bullet1 = [] 106 bullet1_index = 0 107 BULLET1_NUM = 4 108 for i in range(BULLET1_NUM): 109 bullet1.append(bullet.Bullet1(me.rect.midtop)) 110 111 # 生命数量 112 life_image = pygame.image.load("images/life.png").convert_alpha() 113 life_rect = life_image.get_rect() 114 life_num = 5 115 116 # 游戏结束画面 117 gameover_font = pygame.font.Font("font/font.ttf", 48) 118 again_image = pygame.image.load("images/again.png").convert_alpha() 119 again_rect = again_image.get_rect() 120 gameover_image = pygame.image.load("images/gameover.png").convert_alpha() 121 gameover_rect = gameover_image.get_rect() 122 123 DOUBLE_BULLET_TIME = USEREVENT + 1 124 125 # 解除我方飞机无敌状态 126 INVINCEBLE_TIME = USEREVENT + 2 127 128 129 # 生成超级子弹 130 bullet2 = [] 131 bullet2_index = 0 132 BULLET2_NUM = 8 133 for i in range(BULLET2_NUM//2): 134 bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) 135 bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) 136 137 # 标记是否使用超级子弹 138 is_double_bullet = False 139 140 level = 1 141 142 # 全屏炸弹 143 bomb_image = pygame.image.load("images/bomb.png").convert_alpha() 144 bomb_rect = bomb_image.get_rect() 145 bomb_font = pygame.font.Font("font/font.ttf", 48) 146 bomb_num = 3 147 148 # 每30秒发放一个补给包 149 bullet_supply = supply.Bullet_Supply(bg_size) 150 bomb_supply = supply.Bomb_Supply(bg_size) 151 SUPPLY_TIME = USEREVENT 152 pygame.time.set_timer(SUPPLY_TIME, 30 *1000) 153 154 # 阻止重复读取成绩记录文件 155 recorded = False 156 157 # 标志是否暂停游戏 158 paused = False 159 paused_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha() 160 pause_pressed_image = pygame.image.load("images/pause_pressed.png").convert_alpha() 161 resume_nor_image = pygame.image.load("images/resume_nor.png").convert_alpha() 162 resume_pressed_image = pygame.image.load("images/resume_pressed.png").convert_alpha() 163 paused_rect = paused_nor_image.get_rect() 164 paused_rect.left, paused_rect.top = width - paused_rect.width -10, 10 165 paused_image = paused_nor_image 166 167 while running: 168 for event in pygame.event.get(): 169 if event.type == QUIT: 170 pygame.quit() 171 sys.exit() 172 elif event.type == MOUSEBUTTONDOWN: 173 if event.button == 1 and paused_rect.collidepoint(event.pos): 174 paused = not paused 175 if paused: 176 pygame.time.set_timer(SUPPLY_TIME, 0) 177 pygame.mixer.music.pause() 178 pygame.mixer.pause() 179 paused_image = resume_pressed_image 180 else: 181 pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) 182 pygame.mixer.music.unpause() 183 pygame.mixer.unpause() 184 paused_image = pause_pressed_image 185 elif event.type == MOUSEMOTION: 186 if paused_rect.collidepoint(event.pos): 187 if paused: 188 paused_image = resume_pressed_image 189 else: 190 paused_image = pause_pressed_image 191 else: 192 if paused: 193 paused_image = resume_nor_image 194 else: 195 paused_image = paused_nor_image 196 elif event.type == KEYDOWN: 197 if event.key == K_SPACE: 198 if bomb_num: 199 bomb_num -= 1 200 bomb_sound.play() 201 for each in enemies: 202 if each.rect.bottom > 0: 203 each.active = False 204 elif event.type == SUPPLY_TIME: 205 supply_sound.play() 206 if random.choice([True, False]): 207 bomb_supply.reset() 208 else: 209 bullet_supply.reset() 210 elif event.type == DOUBLE_BULLET_TIME: 211 is_double_bullet = False 212 pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) 213 elif event.type == INVINCEBLE_TIME: 214 me.invincible = False 215 pygame.time.set_timer(INVINCEBLE_TIME, 0) 216 217 218 # 根据用户的得分增加难度 219 if level == 1 and score > 50000: 220 level = 2 221 upgrade_sound.play() 222 add_small_enemies(small_enemies, enemies, 3) 223 add_mid_enemies(mid_enemies, enemies, 2) 224 add_big_enemies(big_enemies, enemies, 1) 225 inc_speed(small_enemies, 1) 226 elif level == 2 and score > 300000: 227 level = 3 228 upgrade_sound.play() 229 add_small_enemies(small_enemies, enemies, 5) 230 add_mid_enemies(mid_enemies, enemies, 3) 231 add_big_enemies(big_enemies, enemies, 2) 232 inc_speed(small_enemies, 1) 233 inc_speed(mid_enemies, 1) 234 elif level == 3 and score > 300000: 235 level = 4 236 upgrade_sound.play() 237 add_small_enemies(small_enemies, enemies, 5) 238 add_mid_enemies(mid_enemies, enemies, 3) 239 add_big_enemies(big_enemies, enemies, 2) 240 inc_speed(small_enemies, 1) 241 inc_speed(mid_enemies, 1) 242 elif level == 4 and score > 1000000: 243 level = 5 244 upgrade_sound.play() 245 add_small_enemies(small_enemies, enemies, 5) 246 add_mid_enemies(mid_enemies, enemies, 3) 247 add_big_enemies(big_enemies, enemies, 2) 248 inc_speed(small_enemies, 1) 249 inc_speed(mid_enemies, 1) 250 251 screen.blit(background, (0,0)) 252 253 if life_num and not paused: 254 # 绘制全屏炸弹补给并检测是否获得 255 if bomb_supply.active: 256 bomb_supply.move() 257 screen.blit(bomb_supply.image, bomb_supply.rect) 258 if pygame.sprite.collide_mask(bomb_supply, me): 259 get_bomb_sound.play() 260 if bomb_num < 3: 261 bomb_num += 1 262 bomb_supply.active = False 263 264 #发射子弹 265 if not(delay % 10): 266 bullet_sound.play() 267 if is_double_bullet: 268 bullets = bullet2 269 bullets[bullet2_index].reset((me.rect.centerx - 33, me.rect.centery)) 270 bullets[bullet2_index + 1].reset((me.rect.centerx + 33, me.rect.centery)) 271 bullet2_index = (bullet2_index + 2) % BULLET2_NUM 272 else: 273 bullets = bullet1 274 bullets[bullet1_index].reset(me.rect.midtop) 275 bullet1_index = (bullet1_index + 1) % BULLET1_NUM 276 277 #检测子弹是否击中敌机 278 for b in bullets: 279 if b.active: 280 b.move() 281 screen.blit(b.image, b.rect) 282 enemy_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask) 283 if enemy_hit: 284 b.active = False 285 for e in enemy_hit: 286 if e in mid_enemies or e in big_enemies: 287 e.hit = True 288 e.energy -= 1 289 if e.energy == 0: 290 e.active = False 291 else: 292 e.active = False 293 294 # 绘制全屏炸弹补给并检测是否获得 295 if bullet_supply.active: 296 bullet_supply.move() 297 screen.blit(bullet_supply.image, bullet_supply.rect) 298 if pygame.sprite.collide_mask(bullet_supply, me): 299 get_bullet_sound.play() 300 is_double_bullet = True 301 pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) 302 bullet_supply.active = False 303 304 # 绘制大型敌机 305 for each in big_enemies: 306 if each.active: 307 each.move() 308 if each.hit: 309 screen.blit(each.image_hit, each.rect) 310 each.hit = False 311 else: 312 if switch_image: 313 screen.blit(each.image1, each.rect) 314 else: 315 screen.blit(each.image2, each.rect) 316 if each.rect.bottom == -50: 317 enemy3_fly_sound.play(-1) 318 319 # 绘制血槽 320 pygame.draw.line(screen, BLACK, 321 (each.rect.left, each.rect.top - 5), 322 (each.rect.right, each.rect.top - 5), 323 2) 324 325 energy_remain = each.energy / enemy.BigEnemy.energy 326 if energy_remain > 0.2: 327 energy_color = GREEN 328 else: 329 energy_color = RED 330 pygame.draw.line(screen, energy_color, 331 (each.rect.left, each.rect.top -5), 332 (each.rect.left + each.rect.width * energy_remain, 333 each.rect.top - 5), 334 2) 335 336 else: 337 if not(delay % 3): 338 if e3_destroy_index == 0: 339 enemy3_down_sound.play() 340 screen.blit(each.destroy_images[e3_destroy_index], each.rect) 341 e3_destroy_index = (e3_destroy_index+1)%6 342 if e3_destroy_index == 0: 343 me_down_sound.stop() 344 score += 10000 345 each.reset() 346 347 # 绘制中型敌机 348 for each in mid_enemies: 349 if each.active: 350 each.move() 351 352 if each.hit: 353 screen.blit(each.image_hit, each.rect) 354 each.hit = False 355 else: 356 screen.blit(each.image1, each.rect) 357 358 # 绘制血槽 359 pygame.draw.line(screen, BLACK, 360 (each.rect.left, each.rect.top - 5), 361 (each.rect.right, each.rect.top - 5), 362 2) 363 364 energy_remain = each.energy / enemy.MidEnemy.energy 365 if energy_remain > 0.2: 366 energy_color = GREEN 367 else: 368 energy_color = RED 369 pygame.draw.line(screen, energy_color, 370 (each.rect.left, each.rect.top -5), 371 (each.rect.left + each.rect.width * energy_remain, 372 each.rect.top - 5), 373 2) 374 else: 375 if not(delay % 3): 376 if e2_destroy_index ==0: 377 enemy2_down_sound.play() 378 screen.blit(each.destroy_images[e2_destroy_index], each.rect) 379 e2_destroy_index = (e2_destroy_index+1)%4 380 if e2_destroy_index == 0: 381 score += 5000 382 each.reset() 383 384 # 绘制小型敌机 385 for each in small_enemies: 386 if each.active: 387 each.move() 388 screen.blit(each.image1, each.rect) 389 else: 390 if not(delay % 3): 391 if e1_destroy_index ==0: 392 enemy1_down_sound.play() 393 screen.blit(each.destroy_images[e1_destroy_index], each.rect) 394 e1_destroy_index = (e1_destroy_index+1)%4 395 if e1_destroy_index == 0: 396 score += 1000 397 each.reset() 398 399 key_pressed = pygame.key.get_pressed() 400 if key_pressed[K_w] or key_pressed[K_UP]: 401 me.moveUp() 402 if key_pressed[K_s] or key_pressed[K_DOWN]: 403 me.moveDown() 404 if key_pressed[K_a] or key_pressed[K_LEFT]: 405 me.moveLeft() 406 if key_pressed[K_d] or key_pressed[K_RIGHT]: 407 me.moveRight() 408 409 # 检测我方飞机是否被撞 410 enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask) 411 if enemies_down and not me.invincible: 412 me.active = False 413 for e in enemies_down: 414 e.active = False 415 416 # 绘制我方飞机 417 if me.active: 418 if switch_image: 419 screen.blit(me.image1, me.rect) 420 else: 421 screen.blit(me.image2, me.rect) 422 else: 423 me_down_sound.play() 424 if not(delay % 3): 425 screen.blit(each.destroy_images[me_destroy_index], each.rect) 426 me_destroy_index = (me_destroy_index+1)%4 427 # 剩余生命数量 428 if me_destroy_index == 0: 429 life_num -= 1 430 me.reset() 431 pygame.time.set_timer(INVINCEBLE_TIME, 3 * 1000) 432 433 # 绘制剩余炸弹数量 434 bomb_text = bomb_font.render("x %d" % bomb_num, True, WHITE) 435 text_rect = bomb_text.get_rect() 436 screen.blit(bomb_image, (10, height-10 - bomb_rect.height)) 437 screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) 438 439 440 if life_num: 441 for i in range(life_num): 442 screen.blit(life_image, 443 (width - 10 - (i+1)*life_rect.width, 444 height - 10 - life_rect.height)) 445 446 score_text = score_font.render(str("Score: %s" % score), True, WHITE) 447 screen.blit(score_text, (10,5)) 448 elif life_num == 0: 449 pygame.mixer.music.stop() 450 pygame.mixer.stop() 451 452 # 停止发放补给 453 pygame.time.set_timer(SUPPLY_TIME, 0) 454 455 if not recorded: 456 recorded = True 457 # 读取历史最高分 458 with open("record.txt", "r") as f: 459 record_score = int(f.read()) 460 461 if score > record_score: 462 with open("record.txt", "w") as f: 463 f.write(str(score)) 464 465 # 绘制结束画面 466 record_score_text = score_font.render("Best: %d" % record_score,True,WHITE) 467 screen.blit(record_score_text, (50,50)) 468 469 gameover_text1 = gameover_font.render("Your Score: ", True, WHITE) 470 gameover_text1_rect = gameover_text1.get_rect() 471 gameover_text1_rect.left, gameover_text1_rect.top = 472 (width - gameover_text1_rect.width) // 2, height // 2 473 screen.blit(gameover_text1, gameover_text1_rect) 474 475 476 gameover_text2 = gameover_font.render(str(score), True, WHITE) 477 gameover_text2_rect = gameover_text2.get_rect() 478 gameover_text2_rect.left, gameover_text2_rect.top = 479 (width - gameover_text2_rect.width) // 2, 480 gameover_text1_rect.bottom + 10 481 screen.blit(gameover_text2, gameover_text2_rect) 482 483 again_rect.left, again_rect.top = 484 (width - again_rect.width) // 2, 485 gameover_text2_rect.bottom + 50 486 screen.blit(again_image, again_rect) 487 488 gameover_rect.left, gameover_rect.top = 489 (width - again_rect.width) // 2, 490 again_rect.bottom + 10 491 screen.blit(gameover_image, gameover_rect) 492 493 # 检测用户的鼠标操作 494 # 如果用户按下鼠标左键 495 if pygame.mouse.get_pressed()[0]: 496 pos = pygame.mouse.get_pos() 497 if again_rect.left < pos[0] < again_rect.right and 498 again_rect.top < pos[1] < again_rect.bottom: 499 main() 500 elif gameover_rect.left < pos[0] < gameover_rect.right and 501 gameover_rect.top < pos[1] < gameover_rect.bottom: 502 pygame.quit() 503 sys.exit() 504 505 screen.blit(paused_image, paused_rect) 506 507 # 切换图片 508 if not(delay % 5): 509 switch_image = not switch_image 510 511 delay -= 1 512 if not delay: 513 delay = 100 514 515 pygame.display.flip() 516 clock.tick(60) 517 518 if __name__ == "__main__": 519 try: 520 main() 521 except SystemExit: 522 pass 523 except: 524 traceback.print_exc() 525 pygame.quit() 526 input() 527
二、自己操控的飞机代码
1 import pygame 2 3 class MyPlane(pygame.sprite.Sprite): 4 def __init__(self, bg_size): 5 pygame.sprite.Sprite.__init__(self) 6 7 self.image1 = pygame.image.load("images/me1.png").convert_alpha() 8 self.image2 = pygame.image.load("images/me2.png").convert_alpha() 9 self.destroy_image = [] 10 self.destroy_image.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.active = True 17 self.rect = self.image1.get_rect() 18 self.width, self.height = bg_size[0], bg_size[1] 19 self.rect.left, self.rect.top = 20 (self.width - self.rect.width) // 2, 21 self.height - self.rect.height - 60 22 self.speed = 10 23 self.mask = pygame.mask.from_surface(self.image1) 24 self.invincible = False 25 26 def moveUp(self): 27 if self.rect.top > 0: 28 self.rect.top -= self.speed 29 else: 30 self.rect.top = 0 31 32 def moveDown(self): 33 if self.rect.bottom < self.height - 60: 34 self.rect.top += self.speed 35 else: 36 self.rect.bottom = self.height - 60 37 def moveLeft(self): 38 if self.rect.left > 0: 39 self.rect.left -= self.speed 40 else: 41 self.rect.left = 0 42 43 def moveRight(self): 44 if self.rect.right < self. 45 self.rect.left += self.speed 46 else: 47 self.rect.right = self.width 48 49 def reset(self): 50 self.rect.left, self.rect.top = 51 (self.width - self.rect.width) // 2, 52 self.height - self.rect.height - 60 53 self.active = True 54 self.invincible = True 55 56 57
三、敌机部分代码
1 import pygame 2 from random import * 3 4 class SmallEnemy(pygame.sprite.Sprite): 5 def __init__(self, bg_size): 6 pygame.sprite.Sprite.__init__(self) 7 8 self.image1 = pygame.image.load("images/enemy1.png").convert_alpha() 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.image1.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) 23 self.mask = pygame.mask.from_surface(self.image1) 24 25 def move(self): 26 if self.rect.top < self.height: 27 self.rect.top += self.speed 28 else: 29 self.reset() 30 31 def reset(self): 32 self.active = True 33 self.rect.left, self.rect.top = 34 randint(0, self.width - self.rect.width), 35 randint(-5*self.height, 0) 36 37 38 class MidEnemy(pygame.sprite.Sprite): 39 energy = 18 40 41 def __init__(self, bg_size): 42 pygame.sprite.Sprite.__init__(self) 43 44 self.image1 = pygame.image.load("images/enemy2.png").convert_alpha() 45 self.image_hit = pygame.image.load("images/enemy2_hit.png").convert_alpha() 46 self.destroy_images = [] 47 self.destroy_images.extend([ 48 pygame.image.load("images/enemy2_down1.png").convert_alpha(), 49 pygame.image.load("images/enemy2_down2.png").convert_alpha(), 50 pygame.image.load("images/enemy2_down3.png").convert_alpha(), 51 pygame.image.load("images/enemy2_down4.png").convert_alpha(), 52 ]) 53 self.rect = self.image1.get_rect() 54 self.width, self.height = bg_size[0],bg_size[1] 55 self.speed = 1 56 self.active = True 57 self.hit = False 58 self.energy = MidEnemy.energy 59 self.rect.left, self.rect.top = 60 randint(0, self.width - self.rect.width), 61 randint(-5*self.height,-self.height) 62 self.mask = pygame.mask.from_surface(self.image1) 63 64 def move(self): 65 if self.rect.top < self.height: 66 self.rect.top += self.speed 67 else: 68 self.reset() 69 70 def reset(self): 71 self.active = True 72 self.energy = MidEnemy.energy 73 self.rect.left, self.rect.top = 74 randint(0, self.width - self.rect.width), 75 randint(-8*self.height,-self.height) 76 77 78 class BigEnemy(pygame.sprite.Sprite): 79 energy = 20 80 81 def __init__(self, bg_size): 82 pygame.sprite.Sprite.__init__(self) 83 84 self.image1 = pygame.image.load("images/enemy3_n1.png").convert_alpha() 85 self.image2 = pygame.image.load("images/enemy3_n2.png").convert_alpha() 86 self.image_hit = pygame.image.load("images/enemy3_hit.png").convert_alpha() 87 self.destroy_images = [] 88 self.destroy_images.extend([ 89 pygame.image.load("images/enemy3_down1.png").convert_alpha(), 90 pygame.image.load("images/enemy3_down2.png").convert_alpha(), 91 pygame.image.load("images/enemy3_down3.png").convert_alpha(), 92 pygame.image.load("images/enemy3_down4.png").convert_alpha(), 93 pygame.image.load("images/enemy3_down5.png").convert_alpha(), 94 pygame.image.load("images/enemy3_down6.png").convert_alpha(), 95 ]) 96 self.rect = self.image1.get_rect() 97 self.width, self.height = bg_size[0],bg_size[1] 98 self.speed = 1 99 self.active = True 100 self.hit = False 101 self.energy = BigEnemy.energy 102 self.rect.left, self.rect.top = 103 randint(0, self.width - self.rect.width), 104 randint(-10*self.height,-5*self.height) 105 self.mask = pygame.mask.from_surface(self.image1) 106 107 def move(self): 108 if self.rect.top < self.height: 109 self.rect.top += self.speed 110 else: 111 self.reset() 112 113 def reset(self): 114 self.energy = BigEnemy.energy 115 self.active = True 116 self.rect.left, self.rect.top = 117 randint(0, self.width - self.rect.width), 118 randint(-10*self.height,-5*self.height)
四、子弹部分代码
1 import pygame 2 3 class Bullet1(pygame.sprite.Sprite): 4 def __init__(self, positon): 5 pygame.sprite.Sprite.__init__(self) 6 7 self.image = pygame.image.load("images/bullet1.png").convert_alpha() 8 self.rect = self.image.get_rect() 9 self.rect.left, self.rect.top = positon 10 self.speed = 12 11 self.active = True 12 self.mask = pygame.mask.from_surface(self.image) 13 14 def move(self): 15 self.rect.top -= self.speed 16 17 if self.rect.top < 0: 18 self.active = False 19 20 def reset(self, position): 21 self.rect.left, self.rect.top = position 22 self.active = True 23 24 class Bullet2(pygame.sprite.Sprite): 25 def __init__(self, positon): 26 pygame.sprite.Sprite.__init__(self) 27 28 self.image = pygame.image.load("images/bullet2.png").convert_alpha() 29 self.rect = self.image.get_rect() 30 self.rect.left, self.rect.top = positon 31 self.speed = 50 32 self.active = True 33 self.mask = pygame.mask.from_surface(self.image) 34 35 def move(self): 36 self.rect.top -= self.speed 37 38 if self.rect.top < 0: 39 self.active = False 40 41 def reset(self, position): 42 self.rect.left, self.rect.top = position 43 self.active = True