ADD file via upload

master
prkzbs59u 3 years ago
parent db662df6dd
commit 7304e90732

@ -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
Loading…
Cancel
Save