计算英雄敌人飞机坐标及切换爆炸图片

This commit is contained in:
206530321 2021-06-14 23:42:29 +08:00
parent f0ff92411c
commit d846adbe32
1 changed files with 278 additions and 0 deletions

278
play.py
View File

@ -107,3 +107,281 @@ class MainScene(object):
self.scene.blit(hero_info, (0, 0))
self.scene.blit(hero_life, (self.size[0] - 100, 0))
# 动作
def action_elements(self):
# 计算坐标地图
self.map.action()
# 依次计算英雄飞机每一颗发射子弹的坐标
for bullet in self.hero.bullets:
if bullet.visible:
bullet.action()
# 计算敌人飞机和其飞机子弹
for plane in self.enemy_list:
plane.action()
plane.shot()
for bullet in plane.bullets:
if bullet.visible:
bullet.action()
for boss in self.boss_list:
boss.action()
boss.shot()
for bullet in boss.bullets:
if bullet.visible:
bullet.action()
# 切换爆炸图片
for bomb in self.bombs:
if bomb.visible:
bomb.action()
# 处理事件
def handle_event(self):
event_list = pygame.event.get()
# 遍历事件列表
for event in event_list:
# 如果判断用户点击了X按钮则结束程序
if event.type == pygame.QUIT:
pygame.quit()
exit()
# 判断事件类型是否是键盘按下事件
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_j:
# self.hero.shot()
self.hero.space_key_down(pygame.K_j)
elif event.key == pygame.K_a:
self.hero.key_down(pygame.K_a)
elif event.key == pygame.K_d:
self.hero.key_down(pygame.K_d)
elif event.key == pygame.K_w:
self.hero.key_down(pygame.K_w)
elif event.key == pygame.K_s:
self.hero.key_down(pygame.K_s)
elif event.type == pygame.KEYUP:
if event.key == pygame.K_a:
self.hero.key_up(pygame.K_a)
elif event.key == pygame.K_d:
self.hero.key_up(pygame.K_d)
elif event.key == pygame.K_w:
self.hero.key_up(pygame.K_w)
elif event.key == pygame.K_s:
self.hero.key_up(pygame.K_s)
elif event.key == pygame.K_j:
self.hero.space_key_up(pygame.K_j)
elif event.type == self.ADDENEMY6:
self.enemy_list.append(EnemyPlane(self, type=6))
elif event.type == self.ADDENEMY1:
self.enemy_list.append(EnemyPlane(self, type=5))
# self.enemy_list.append(EnemyPlane(self,type = 3 ))
# 判断是否发生了鼠标拖动事件
if event.type == pygame.MOUSEMOTION:
# 获得鼠标点击三个按钮的点击情况(1,0,0)
# 如果第一个参数为1,表示左键被按下
# 如果第二个参数为1,表示滚轮被按下
# 如果第三个参数为1,表示右键被按下
buttons = pygame.mouse.get_pressed()
# 我们只处理左键被按下的情况
if buttons[0]:
# 获得拖动鼠标的拖动位置
position = pygame.mouse.get_pos()
# 飞机跟随坐标移动
# print(position)
self.hero.action(position[0], position[1])
self.hero.press_move()
self.hero.press_fire()
# 碰撞检测
def detect_conlision(self):
# 英雄机和飞机碰撞检查包括BOSS机
enemyscrash = pygame.sprite.spritecollide(self.hero, self.enemy_list, False, pygame.sprite.collide_mask)\
or pygame.sprite.spritecollide(self.hero, self.boss_list, False)
if enemyscrash:
self.hero_score += 1
for enemy in enemyscrash:
current_time = pygame.time.get_ticks()
if current_time - self.invincible_start < 2000:
return
self.invincible_start = current_time
self.hero.HP -= 1
for bomb in self.bombs:
if not bomb.visible:
# 爆炸对象设置爆炸位置
bomb.set_pos(self.hero.rect[0], self.hero.rect[1])
# 爆炸对象状态设置为True
bomb.visible = True
# 英雄机和敌人子弹碰撞检查
for enemy in self.enemy_list:
# 找到所有击中英雄飞机的子弹
enemybullets = pygame.sprite.spritecollide(
self.hero, enemy.bullets, False, pygame.sprite.collide_mask)
if enemybullets:
for bullet in enemybullets:
if not bullet.visible:
continue
bullet.visible = False
self.hero.HP -= 1
# 从预先创建完毕的爆炸中取出一个爆炸对象
for bomb in self.bombs:
if not bomb.visible:
# 爆炸对象设置爆炸位置
bomb.set_pos(self.hero.rect[0], self.hero.rect[1])
# 爆炸对象状态设置为True
bomb.visible = True
# 英雄机和BOSS子弹碰撞检查
for boss in self.boss_list:
# 找到所有击中英雄飞机的子弹
bossbullets = pygame.sprite.spritecollide(
self.hero, boss.bullets, False, pygame.sprite.collide_mask)
if bossbullets:
for bullet in bossbullets:
if not bullet.visible:
continue
bullet.visible = False
self.hero.HP -= 1
# 从预先创建完毕的爆炸中取出一个爆炸对象
for bomb in self.bombs:
if not bomb.visible:
# 爆炸对象设置爆炸位置
bomb.set_pos(self.hero.rect[0], self.hero.rect[1])
# 爆炸对象状态设置为True
bomb.visible = True
# # 检测英雄子弹是否和敌机碰撞
for enemy in self.enemy_list:
# 击中敌人飞机的英雄飞机子弹
herobullets = pygame.sprite.spritecollide(
enemy, self.hero.bullets, False, pygame.sprite.collide_mask)
if herobullets:
for bullet in herobullets:
if not bullet.visible:
continue
bullet.visible = False
for bomb in self.bombs:
if not bomb.visible:
bomb.set_pos(enemy.rect[0], enemy.rect[1])
bomb.visible = True
mus = pygame.mixer.Sound('./musics/boom_music.ogg')
mus.set_volume(6)
mus.play()
enemy.visible = False
self.hero_score += enemy.score
# 英雄机子弹是否和boss相撞
for boss in self.boss_list:
if not boss.visible:
continue
# 击中BOSS飞机的英雄飞机子弹
herobullets = pygame.sprite.spritecollide(
boss, self.hero.bullets, False, pygame.sprite.collide_mask)
if herobullets:
for bullet in herobullets:
if not bullet.visible:
continue
bullet.visible = False
boss.HP -= 10
if boss.HP >= 0:
continue
for bomb in self.bombs:
if not bomb.visible:
bomb.set_pos(boss.rect[0], boss.rect[1])
bomb.visible = True
mus = pygame.mixer.Sound('./musics/boom_music.ogg')
mus.set_volume(6)
mus.play()
# 添加 boss 移除代码
self.boss_list[0].visible = False
# self.boss_list[boss.index].visible = False
self.hero_score += boss.score
# 检查完毕,英雄是否没有血量了
if self.hero.HP <= 0:
self.gameover = True
def change_level(self):
if self.gamelevel == 1 and self.hero_score > LEVEL1_SCORE:
self.enemy_list.append(EnemyPlane(self, type=2))
self.enemy_list.append(EnemyPlane(self, type=3))
self.gamelevel = 2
elif self.gamelevel == 2 and self.hero_score > LEVEL2_SCORE:
for v in range(1, 3):
self.enemy_list.append(EnemyPlane(self, type=4))
# self.enemy_list.append(EnemyPlane(self, type = 5))
self.gamelevel = 3
elif self.gamelevel == 3 and self.hero_score > LEVEL3_SCORE:
self.boss_list = [BossPlane(self)]
# 续添加list[x]判断
self.boss_list[0].visible = True
self.gamelevel = 4
else:
pass
def game_over(self):
if self.hero.HP >= 0:
return
# print('gameover')
pygame.mixer.music.stop()
pygame.mixer.stop()
hero_info = self.my_font.render(
'score:' + str(self.hero_score), True, (255, 0, 0))
hero_life = self.my_font.render("生命: 0", True, (0, 255, 0))
self.scene.blit(hero_info, (0, 0))
self.scene.blit(hero_life, (self.size[0] - 100, 0))
game_restart_image = pygame.image.load('./images/menu/restart.png')
game_restart_rect = game_restart_image.get_rect()
game_restart_rect.left, game_restart_rect.top = self.size[0] / \
2 - 100, self.size[1]/2 - 200
game_over_image = pygame.image.load('./images/menu/quit.png')
game_over_rect = game_over_image.get_rect()
game_over_rect.left, game_over_rect.top = self.size[0] / \
2 - 100, self.size[1]/2
self.scene.blit(game_restart_image, game_restart_rect)
self.scene.blit(game_over_image, game_over_rect)
if pygame.mouse.get_pressed()[0]:
pos = pygame.mouse.get_pos()
# print(pos[0], pos[1])
# print(game_over_rect)
if (game_restart_rect.left < pos[0] < game_restart_rect.right
and game_restart_rect.top < pos[1] < game_restart_rect.bottom):
self.hero.HP = 10
self.gameover = False
if (game_over_rect.left < pos[0] < game_over_rect.right
and game_over_rect.top < pos[1] < game_over_rect.bottom):
pygame.quit()
exit()
# 主循环,主要处理各种事件
def run_scene(self):
# 播放背景音乐
pygame.mixer.music.load('musics/bgm.mp3')
pygame.mixer.music.play(-1)
while True:
# 计算元素坐标
self.action_elements()
# 绘制元素图片
self.draw_elements()
# 处理事件
self.handle_event()
# 碰撞检测
self.detect_conlision()
# 调整难度
self.change_level()
self.game_over()
# 刷新显示
pygame.display.update()
# fpsClock.tick(FPS)
# 入口函数
if __name__ == "__main__":
# 创建主场景
mainScene = MainScene()
# 开始游戏
mainScene.run_scene()