# _*_coding: utf-8_*_
"""
Time: 2022/8/13 10:32
Author: 翟海鹏(ZII)
Version: alpha-0.0.1
File: keys.py
Describe: 这一部分实现按键信息读取|存储|创建与按键显示,因为目前没有写显示模块所以实际上是两个模块集成到一块了,不利于后期修改物料的显示顺序
last modified: 2022/8/15 21:07
"""
import os
from pathlib import Path
import pygame
from pygame.surface import Surface
class Key: # 按键实体类
pos = None
def __init__(self, value='', pos: [] = None, state: bool = False):
if pos is None:
self.show = False # 这个show目前没用上,用来控制按键按钮的隐藏与显示
self.pos = pos # 按钮坐标
self.isPressed = state # 按键是否按下,按下为真,弹起为假
self.value = value # 按键绑定值
class KeyBoard:
def __init__(self,
layoutPath: Path | str = '../../res/layout', # 布局路径,以点阵形式存储每一个键对应的位置
imgPath: Path | str = '../../res/img/keyboard_button'): # 图标路径,用以显示
self.keys: dict[str: Key] = {'': Key()}
self.layoutPath = layoutPath
# 载入按键的按钮显示布局
r = open(layoutPath, 'r')
tmp = r.readline()
while tmp != '':
value, pos = tmp.rstrip('\n').split('\t')
pos = [int(_) for _ in pos.strip('(').rstrip(')').split(', ')]
self.addKey(value, pos)
tmp = r.readline()
r.close()
# 载入图片
self.img = [pygame.image.load(str(imgPath) + '/' + str(_)) for _ in os.listdir(imgPath)]
# 添加按键
def addKey(self, value: str = '', pos=None):
self.keys[value] = Key(value)
if value != '':
match pos:
# 主动添加按键到鼠标位置
case None:
self.keys[value].pos = pygame.mouse.get_pos()
open(self.layoutPath, 'a').writelines(f'{value}\t' + str(self.keys[value].pos) + '\n')
# 自定义按键位置的添加按键
case (_, _):
if all([type(_) == int for _ in pos]):
self.keys[value].pos = pos
# 其他情况,就是其他情况
case _:
raise ValueError("please check file layout,there might has some trouble")
# 更改按键按钮坐标,目前没用上
def moveKey(self, value: str = '', pos: [] = None):
if pos is None:
pass
return
if value in self.keys:
self.keys[value].pos = pos
else:
pass
return
# 按键事件处理-按下
def pressKey(self, value: str):
if value in self.keys:
self.keys[value].isPressed = True
else:
self.addKey(value)
# 按键事件处理-弹起
def releaseKey(self, value: str):
if value in self.keys:
self.keys[value].isPressed = False
# 显示队列更新
def update(self, surface: Surface):
# 这是一个单独用来显示字体的函数,可以剥离到别的地方单独用
def render_text(text: str, color, pos):
font = pygame.font.SysFont('宋体', 30)
text = font.render(text, True, pygame.Color(color))
surface.blit(text, pos)
for value, key in self.keys.items():
if key.pos is not None:
surface.blit(self.img[key.isPressed], key.pos)
render_text(value, [255,255,255]if key.isPressed else[0,0,0], [key.pos[0]+17, key.pos[1]+13])
评论0