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.

67 lines
2.7 KiB

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