47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
import pygame
|
|
import math
|
|
|
|
|
|
class Shield(pygame.sprite.Sprite):
|
|
def __init__(self, player):
|
|
super().__init__()
|
|
self.player = player
|
|
self.radius = 16
|
|
self.arc_angle = 90
|
|
self.start_angle = 0
|
|
self.shield_image = pygame.Surface(
|
|
(self.radius*2, self.radius*2), pygame.SRCALPHA)
|
|
self.color = (0, 255, 0)
|
|
self.update_shield_image()
|
|
|
|
def update_shield_image(self):
|
|
self.shield_image.fill((0, 0, 0, 0)) # 透明背景
|
|
pygame.draw.arc(self.shield_image, self.color, self.shield_image.get_rect(), math.radians(
|
|
self.start_angle), math.radians(self.start_angle + self.arc_angle), self.radius)
|
|
|
|
def generate(self):
|
|
self.player_group = pygame.sprite.Group()
|
|
self.player_group.add(self.player)
|
|
|
|
# 根据玩家的位置和护盾角度调整护盾的位置和角度
|
|
self.rect = self.shield_image.get_rect(center=self.player.rect.center)
|
|
self.rect.x -= self.radius
|
|
self.rect.y -= self.radius
|
|
self.rotate_shield()
|
|
|
|
def rotate_shield(self):
|
|
rotated_image = pygame.transform.rotate(
|
|
self.shield_image, self.player.toword_angle)
|
|
self.image = pygame.Surface(rotated_image.get_size(), pygame.SRCALPHA)
|
|
self.image.blit(rotated_image, (0, 0))
|
|
self.mask = pygame.mask.from_surface(self.image)
|
|
|
|
def damage(self):
|
|
self.arc_angle -= 90
|
|
self.start_angle += 90
|
|
if self.arc_angle <= 0:
|
|
self.kill()
|
|
else:
|
|
self.update_shield_image()
|
|
self.rotate_shield()
|