class VisualUnit(pygame.sprite.Sprite): ''' 视觉单元类,游戏中显示的基本单元 静态图片、动态图片,矢量图形等等类型,都应该继承自本类 ''' def __init__(self,game,x=0,y=0,anchor=utils.Anchor.TOPLEFT): ''' 构造函数 game -- 当前游戏实例 ''' #调用父类构造函数 super().__init__() self.game = game self.x = x self.y = y self.anchor = anchor self.image = None self.rect = None def check_mouse_event(self, event): '''响应鼠标事件''' pass 在visual.py中新增一个类,取名Slider, 该类继承VisualUnit,为其添加新属性value,value的值大于等于0,小于等于100,0表示音量最小(关闭声音),100表示音量最大。在其image(画布)上利用pygame.draw.rect绘制两个扁的方框,分别表示数轴和可移动方块。该类需要响应鼠标事件,实现点击数轴设置音量和拖动方块设置音量两种方式。
时间: 2024-02-14 20:31:26 浏览: 27
class Slider(VisualUnit):
'''
滑块类,继承自视觉单元类
'''
def __init__(self, game, x=0, y=0, anchor=utils.Anchor.TOPLEFT):
'''
构造函数
game -- 当前游戏实例
'''
super().__init__(game, x, y, anchor)
self.value = 0 # 初始音量值为0
def check_mouse_event(self, event):
'''响应鼠标事件'''
if event.type == pygame.MOUSEBUTTONDOWN:
# 获取鼠标点击位置
mouse_pos = pygame.mouse.get_pos()
# 判断是否点击在滑块上
if self.rect.collidepoint(mouse_pos):
# 计算滑块相对于数轴的百分比位置
percentage = (mouse_pos[0] - self.rect.left) / self.rect.width
self.set_value(int(percentage * 100))
elif event.type == pygame.MOUSEMOTION and event.buttons[0] == 1:
# 获取鼠标移动位置
mouse_pos = pygame.mouse.get_pos()
# 判断是否移动在滑块上
if self.rect.collidepoint(mouse_pos):
# 计算滑块相对于数轴的百分比位置
percentage = (mouse_pos[0] - self.rect.left) / self.rect.width
self.set_value(int(percentage * 100))
def set_value(self, value):
'''设置音量值'''
if value < 0:
value = 0
elif value > 100:
value = 100
self.value = value
def draw(self):
'''绘制滑块'''
# 绘制数轴
pygame.draw.rect(self.image, (255, 255, 255), pygame.Rect(0, 0, self.rect.width, 2))
# 计算滑块的位置
slider_pos = int(self.value / 100 * self.rect.width)
# 绘制可移动方块
pygame.draw.rect(self.image, (0, 0, 255), pygame.Rect(slider_pos - 5, -10, 10, 20))
# 更新滑块的位置
self.rect = self.image.get_rect()
# 设置滑块的锚点
self.set_anchor(self.anchor)