diff --git a/button.py b/button.py new file mode 100644 index 0000000..cffcfd8 --- /dev/null +++ b/button.py @@ -0,0 +1,113 @@ +import pygame as pg + +#实现一个按键的类 +#参数: +# rect:按键大小位置 +# color:颜色 +# function:回调函数 +# clicked:按下状态 +# hovered:悬停状态 +# hover_text:悬停显示文本 +# clicked_text:按下显示文本 +# process_kwargs(kwargs):其他用户个性化配置, +# 简单来说就是各种属性参数 +class Button(object): + #初始化 + def __init__(self,rect,color,function,**kwargs): + self.rect = pg.Rect(rect) + self.color = color + self.function = function + self.clicked = False + self.hovered = False + self.hover_text = None + self.clicked_text = None + self.process_kwargs(kwargs) + self.render_text() + + #用于设置其他的参数 + def process_kwargs(self,kwargs): + settings = {"text" : None, + "font" : pg.font.Font(None,24), #调用默认自带字体 + "call_on_release" : True, + "hover_color" : None, + "clicked_color" : None, + "font_color" : (106, 90, 205), + "hover_font_color" : None, + "clicked_font_color" : None, + "click_sound" : None, + "hover_sound" : None} + for kwarg in kwargs: + if kwarg in settings: + settings[kwarg] = kwargs[kwarg] + else: + raise AttributeError("Button has no keyword: {}".format(kwarg)) + self.__dict__.update(settings) + + #显示按键文本 + def render_text(self): + if self.text: + if self.hover_font_color: + color = self.hover_font_color + self.hover_text = self.font.render(self.text,True,color) + if self.clicked_font_color: + color = self.clicked_font_color + self.clicked_text = self.font.render(self.text,True,color) + self.text = self.font.render(self.text,True,self.font_color) + + #按键事件 分别处理按下和松开的事件 + def check_event(self,event,tip = 0): + if event.type == pg.MOUSEBUTTONDOWN and event.button == 1: # 有按键按下动作 + return self.on_click(event,tip) + elif event.type == pg.MOUSEBUTTONUP and event.button == 1: # 有按键释放动作 + return self.on_release(event,tip) + else: # 无事件 + return tip + + #按键按下事件处理 + def on_click(self,event,tip = 0): + if self.rect.collidepoint(event.pos): # 按键冲突检查 判断是否为本实例按键区域 + self.clicked = True + if not self.call_on_release: + return self.function() # 执行回调函数 + else: + return tip + else: + return tip + + #按键松开事件处理 + def on_release(self,event,tip = 0): + if self.clicked and self.call_on_release: + self.clicked = False + if self.click_sound: + self.click_sound.play() # 按键按下音效 + return self.function() # 执行回调函数 + else: + return tip + + #按键悬停事件 + def check_hover(self): + if self.rect.collidepoint(pg.mouse.get_pos()): + if not self.hovered: + self.hovered = True + if self.hover_sound: + self.hover_sound.play() #按键悬浮音效 + else: + self.hovered = False + + #刷新按键状态 + def update(self,surface): #松开状态 + color = self.color + text = self.text + self.check_hover() + if self.clicked and self.clicked_color: #按下状态 + color = self.clicked_color + if self.clicked_font_color: + text = self.clicked_text + elif self.hovered and self.hover_color: #悬浮状态 + color = self.hover_color + if self.hover_font_color: + text = self.hover_text + surface.fill(color,self.rect.inflate(0,0)) + if self.text: + text_rect = text.get_rect(center=self.rect.center) + surface.blit(text,text_rect) \ No newline at end of file