You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

193 lines
7.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import math
from typing import Any
import random
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite): # 子弹的基类
def __init__(self, ai_game): # 此处的ai_game 是一ship对象
super().__init__()
# 获取屏幕设置
self.screen = ai_game.screen
self.screen_rect = ai_game.screen.get_rect()
self.settings = ai_game.settings
self.speed_x = 0.0
self.speed_y = 5.0
def update(self, *args: Any, **kwargs: Any) -> None:
self.moving()
def moving(self):
self.rect.centerx += self.speed_x
self.rect.centery += self.speed_y
if self.rect.top > self.screen_rect.height or \
self.rect.top < 0 or self.rect.left < 0 or \
self.rect.right > self.screen_rect.width:
self.kill()
class Bullet1(Bullet): # 按下r键的追踪导弹
def __init__(self, ai_game):
super().__init__(ai_game)
# 获取飞船
self.attached_ship = ai_game
# 获取子弹的图片
self.image = pygame.image.load("resource/image/bullet1.png").convert()
self.image.set_colorkey(self.settings.BLACK)
self.rect = self.image.get_rect()
self.original = None
# 子弹速度
self.speed = 16
self.speed_x = 2
self.speed_y = 2
# 子弹位置
self.rect.center = ai_game.rect.midtop
# 子弹跟踪精灵
self.target = random.choice(self.settings.aliens.sprites())
self.rotate = False # 图片旋转
self.angle = 0
self.dis_pos = math.sqrt(pow(self.settings.screen_width, 2) + pow(self.settings.screen_height, 2))
# 向量
self.vect = pygame.Vector2
# 播放声音
sound = pygame.mixer.Sound("resource/Bonus/sfx_laser2.ogg")
sound.set_volume(0.1)
sound.play()
def update(self, *args: Any, **kwargs: Any) -> None:
self.moving()
def moving(self):
# self.get_close_position()
if self.target in self.settings.aliens:
self.get_enemy_position()
if not self.rotate:
self.original = self.image
self.rotate = True
if self.rotate:
center = self.rect.center # 获取旋转前的rect的中心
self.image = pygame.transform.rotate(self.original, -self.angle - 90) # 将原始图片进行旋转,保证不会失真
self.rect = self.image.get_rect(center=center) # 将旋转后的rect的中心与旋转前的中心对齐保证rect也同图片一起改变
angle = self.angle * math.pi / 180
self.speed_x = self.speed * math.cos(angle)
self.speed_y = self.speed * math.sin(angle)
self.rect.centerx += self.speed_x
self.rect.centery += self.speed_y * random.randrange(1, 3)
elif self.rect.centery < 0 or self.rect.centerx > self.screen_rect.width or self.rect.centerx < 0:
self.kill()
else:
self.rect.centerx += self.speed_x
self.rect.centery += self.speed_y
def get_enemy_position(self): # 获取导弹和敌人的相对角度
pos2 = self.vect(self.target.rect.centerx, self.target.rect.centery) # 敌人的坐标
pos1 = self.vect(self.rect.centerx, self.rect.centery) # 子弹的坐标
pos0 = self.vect(0, 0)
self.angle = pos0.angle_to(pos2 - pos1)
def get_close_position(self): # 飞船和所有外星人的最短距离、也可以改为子弹和外星人距离最近的,欧几里得距离
if len(self.settings.aliens.sprites()) > 0:
for alien in self.settings.aliens:
pos1 = self.vect(alien.rect.centerx, alien.rect.centery) # 敌人的位置
pos2 = self.vect(self.rect.centerx, self.rect.centery)
pos0 = pos2.distance_to(pos1)
if pos0 < self.dis_pos:
self.dis_pos = pos0
self.target = alien
class Bullet2(Bullet): # 按下空格的子弹
def __init__(self, ai_game):
super().__init__(ai_game)
# 获取子弹的图片
self.image = pygame.image.load("resource/Lasers/laserRed01.png").convert()
self.rect = self.image.get_rect()
# 子弹设置
self.speed_x = 0
self.speed_y = 12.0
# 子弹的位置
self.rect.midbottom = ai_game.rect.midtop
# 播放声音
sound = pygame.mixer.Sound("resource/Bonus/sfx_laser1.ogg")
sound.set_volume(0.2)
sound.play()
def update(self, *args: Any, **kwargs: Any) -> None:
self.moving()
def moving(self):
self.rect.x += self.speed_x
self.rect.y -= self.speed_y
if self.rect.bottom < 0:
self.kill()
class Bullet3(Bullet): # 敌人的子弹类
def __init__(self, ai_game):
super(Bullet3, self).__init__(ai_game)
# 获取子弹的图片
self.image = pygame.image.load("resource/image/bullet3.png")
self.image = pygame.transform.rotate(self.image, 180)
self.rect = self.image.get_rect()
self.rect.bottom = ai_game.rect.bottom
# 子弹的固定位置
self.angle = ai_game.angle
self.speed = 5.0
self.speed_x = self.speed * math.cos(self.angle)
self.speed_y = self.speed * math.sin(self.angle)
def update(self, *args: Any, **kwargs: Any) -> None:
self.moving()
class Bullet4(Bullet): # 敌人的子弹类
def __init__(self, ai_game):
super().__init__(ai_game)
# 获取子弹的图片
self.image = pygame.image.load("resource/Lasers/laserBlue03.png")
self.image = pygame.transform.rotate(self.image, 180)
self.rect = self.image.get_rect()
# 子弹的固定位置
self.rect.center = ai_game.rect.midbottom
# 子弹速度
self.speed_y = 8.0
def update(self, *args: Any, **kwargs: Any) -> None:
self.moving()
class Bullet5(Bullet): # boss的子弹类
def __init__(self, ai_game):
super().__init__(ai_game)
# 获取子弹的图片
self.images = self.settings.light_images
self.frame = 0
self.image = self.images[self.frame]
self.image = pygame.transform.scale2x(self.image)
self.rect = self.image.get_rect()
self.last_frame = 9
self.temp = 0
self.rect.center = ai_game.rect.midbottom
# 子弹速度
self.speed_y = 8.0
def update(self, *args: Any, **kwargs: Any) -> None:
self.change()
self.moving()
def change(self):
if self.frame <= self.last_frame and self.temp == 0:
self.image = self.images[self.frame]
self.image = pygame.transform.scale2x(self.image)
self.frame += 1
if self.frame >= 10:
self.temp = 1
elif self.temp == 1:
self.frame -= 1
self.image = self.images[self.frame]
self.image = pygame.transform.scale2x(self.image)
if self.frame == 0:
self.temp = 0