计算英雄敌人飞机坐标及切换爆炸图片
This commit is contained in:
parent
f0ff92411c
commit
d846adbe32
278
play.py
278
play.py
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue