import pygame from math import sin class Entity(pygame.sprite.Sprite): def __init__(self,groups): # 初始化精灵对象,将其添加到指定的精灵组中 super().__init__(groups) # 当前动画帧的索引,初始值为 0 self.frame_index = 0 # 动画播放速度,控制动画切换的速度 self.animation_speed = 0.15 # 实体对象的移动方向向量,初始为零向量 self.direction = pygame.math.Vector2() def move(self,speed): # 检查移动方向向量的大小是否不为零 if self.direction.magnitude() != 0: # 将移动方向向量归一化(单位化),确保移动方向的长度为1,用于保持移动速度的一致性和准确性 self.direction = self.direction.normalize() # 更新碰撞箱(hitbox)的水平位置 self.hitbox.x += self.direction.x * speed # 进行水平方向上的碰撞检测和处理 self.collision('horizontal') # 更新碰撞箱(hitbox)的垂直位置 self.hitbox.y += self.direction.y * speed # 进行垂直方向上的碰撞检测和处理 self.collision('vertical') # 更新实体对象的外部矩形(rect)的中心位置,确保渲染时显示在正确的位置 self.rect.center = self.hitbox.center # 根据传入的方向进行碰撞检测和处理 def collision(self,direction): # 检测水平方向上的碰撞 if direction == 'horizontal': # 检测当前实体对象的碰撞箱与障碍物精灵的碰撞箱是否相交 for sprite in self.obstacle_sprites: if sprite.hitbox.colliderect(self.hitbox): # 向右移动 if self.direction.x > 0: # 调整碰撞箱的右侧边界为障碍物的左侧边界 self.hitbox.right = sprite.hitbox.left # 向左移动 if self.direction.x < 0: # 调整碰撞箱的左侧边界为障碍物的右侧边界 self.hitbox.left = sprite.hitbox.right # 检测垂直方向上的碰撞 if direction == 'vertical': # 检测当前实体对象的碰撞箱与障碍物精灵的碰撞箱是否相交 for sprite in self.obstacle_sprites: if sprite.hitbox.colliderect(self.hitbox): # 向下移动 if self.direction.y > 0: # 调整碰撞箱的底部边界为障碍物的顶部边界 self.hitbox.bottom = sprite.hitbox.top # 向上移动 if self.direction.y < 0: # 调整碰撞箱的顶部边界为障碍物的底部边界 self.hitbox.top = sprite.hitbox.bottom def wave_value(self): # 获取当前游戏时间的正弦值 value = sin(pygame.time.get_ticks()) # 如果正弦值大于等于0,则返回255,否则返回0 if value >= 0: return 255 else: return 0