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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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