From 7304e90732a21105136709c09e9cd03d37cb024d Mon Sep 17 00:00:00 2001 From: prkzbs59u <13617842856@163.com> Date: Tue, 26 Apr 2022 18:45:59 +0800 Subject: [PATCH] ADD file via upload --- bullet.py | 192 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 bullet.py diff --git a/bullet.py b/bullet.py new file mode 100644 index 0000000..bfe5057 --- /dev/null +++ b/bullet.py @@ -0,0 +1,192 @@ +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