宅在家里,沉迷于pygame编程,这篇文章给大家分享一下基于pygame实现一些简单的小功能,这些功能可以很好的嵌入在游戏中增加游戏的交互性。

这篇文章主要讲述用pygame实现虚拟键盘的方式。

目录

1. 效果 & 功能

2. 代码

2.1. 按钮

2.2. 处理输入

2.3. 显示

2.3. 运行

3. 结语


1. 效果 & 功能

  • 主要实现功能有:

    • 输入0-9a-z间的字符
    • ‘del’进行删除
    • ‘end’结束输入

demo演示

2. 代码

首先引用基础库和声明一些常量方便之后更改。

SCREEN_SIZE = 1000, 500 # 屏幕大小# 一些常用颜色
WHITE = 255, 255, 255
GRAY = 190, 190, 190
BLACK = 0, 0, 0
LINEN = 250, 240, 230
DARKSLATEGRAY = 47, 79, 79PAD = 10 # 各物块,按钮之间的 padding
FPS = 60 # pygame显示的fpsDISPLAY_FONT = (None, 40) # 显示打印文字的字体
DISPLAY_BG_COLOR = LINEN  # 显示打印文字区域的背景色
DISPLAY_TEXT_COLOR = DARKSLATEGRAY # 打印文字的颜色KEYBOARD_FONT = (None, 30) # 按钮字体
KEYBOARD_BUTTON_SIZE = 40, 40 # 按钮大小
KEYBOARD_BG_COLOR = WHITE # 按钮背景色
KEYBOARD_BG_COLOR_CLICKED = GRAY # 按钮被选中时的背景色
KEYBOARD_TEXT_COLOR = BLACK # 按钮文字颜色

2.1. 按钮

首先时虚拟按钮的实现,我们在这里将每一个按钮都当作一个pygame.sprite.Sprite类,具体代码如下:

class KeyboardButton(pygame.sprite.Sprite):def __init__(self, **kwargs):# 创建按钮时需要有多个参数# size :按钮的大小# value :按钮的显示值# id : 按钮的idpygame.sprite.Sprite.__init__(self)self.size = kwargs.get('size')self.value = kwargs.get('value')if kwargs.get('id'):self.id = kwargs.get('id')else :# 若没有id,则我们默认self.value为按钮的self.idself.id = self.valueself.clicked = False # 按钮是否被选中self.render_image() # 渲染按钮显示图像def render_image(self):# 主要渲染两个图像:# self.image_org为原始图像# self.image_clicked为选中时的图像font = pygame.font.Font(*KEYBOARD_FONT)w, h = font.size(self.value)# 初始化Surfaceself.rect = Rect(0, 0, *self.size)self.image_org = pygame.Surface(self.size).convert()self.image_org.fill(KEYBOARD_BG_COLOR)# 居中渲染self.valueself.image_org.blit(font.render(self.value, True, KEYBOARD_TEXT_COLOR),((self.size[0] - w) // 2, (self.size[1] - h) // 2))self.image_clicked = self.image_org.copy()self.image_clicked.fill(KEYBOARD_BG_COLOR_CLICKED)self.image_clicked.blit(font.render(self.value, True, KEYBOARD_TEXT_COLOR),((self.size[0] - w) // 2, (self.size[1] - h) // 2))self.image = self.image_orgdef update(self):# 根据该按钮是否被选中决定显示图像if self.clicked:self.image = self.image_clickedelse:self.image = self.image_org

我们将把按钮都放入一个SpriteGroup中进行update, update时我们需要三个参数 (args = mouse_x, mouse_y, mouse_clicked) :

mouse_x, mouse_y, mouse_clicked (鼠标的位置,以及鼠标点击与否)

mouse_clicked = True (鼠标按下) | False (鼠标按上) | None (其它)

class KeyboardButtonGroup(pygame.sprite.Group):def __init__(self):pygame.sprite.Group.__init__(self)def update(self, *args):mouse_x, mouse_y, mouse_clicked = argsfor s in self.sprites():if s.rect.collidepoint(mouse_x, mouse_y):# 鼠标触碰按钮# 若鼠标按下if mouse_clicked == True:s.clicked = True# 若鼠标按上elif mouse_clicked == False:if s.clicked:# 若鼠标按上且之前按下时点击的该按钮s.clicked = Falseadd_input(s.id)else:if mouse_clicked == False:s.clicked = Falses.update() # 更新按钮的显示

2.2. 处理输入

在这里,我们定义一个类用于存放输入的字符并进行处理,注意在 KeyboardButtonGroup 中,我们通过 add_input(s.id) 用于处理得到的输入,这一部分我们讲述如何实现该功能。

class Keyboard():keyboard_input = [] # 存放inputoutput = False # 是否最终输出
def empty_keyboard():# 初始化Keyboard中的变量Keyboard.keyboard_input = []Keyboard.output = Falsedef add_input(value):# 新的输入if value == 'del': # 删除if Keyboard.keyboard_input:Keyboard.keyboard_input.pop()elif value == 'end': # 输入完毕Keyboard.output = Trueelse: # 普通输入Keyboard.keyboard_input.append(value)def get_keyboard_input():return Keyboard.keyboard_inputdef end_of_input():return Keyboard.output

2.3. 显示

显示有两个区域,一个是显示输入区域,一个是按钮区域

def keyboard(screen):empty_keyboard()mouse_x, mouse_y, mouse_clicked = 0, 0, Nonekeyboard_button_grp = KeyboardButtonGroup()  # 初始化按钮for value in [str(i) for i in range(10)] + [chr(i) for i in range(ord('a'), ord('a') + 26)] + ['del', 'end']:keyboard_button_grp.add(KeyboardButton(size=KEYBOARD_BUTTON_SIZE, value=value))KEYBOARD_BUTTON_PER_ROW = 10  # 每行的按钮数量keyboard_rows = (len(keyboard_button_grp) - 1) // KEYBOARD_BUTTON_PER_ROW + 1  # 按钮的总行数KEYBOARD_SIZE = KEYBOARD_BUTTON_SIZE[0] * KEYBOARD_BUTTON_PER_ROW + PAD * (KEYBOARD_BUTTON_PER_ROW - 1), \KEYBOARD_BUTTON_SIZE[1] * keyboard_rows + PAD * (keyboard_rows - 1)  # 按钮区域的总大小DISPLAY_POSITION = (SCREEN_SIZE[0] - KEYBOARD_SIZE[0]) // 2, SCREEN_SIZE[1] // 10  # 显示输入区域的位置display_font = pygame.font.Font(*DISPLAY_FONT)  # 显示输入区域字体display_height = display_font.get_height() + 2 * PAD  # 显示输入区域高度x, y = DISPLAY_POSITION[0], DISPLAY_POSITION[1] + display_height + PAD  # 按钮区域的位置start_x = x# 对每个按钮位置进行排列for i, button in enumerate(keyboard_button_grp):button.rect.topleft = x, yif (i + 1) % KEYBOARD_BUTTON_PER_ROW:x += KEYBOARD_BUTTON_SIZE[0] + PADelse:x = start_xy += KEYBOARD_BUTTON_SIZE[1] + PADdef draw_area_display(screen):# 绘显示输入区域img = pygame.Surface((KEYBOARD_SIZE[0], display_height)).convert()img.fill(DISPLAY_BG_COLOR)img.blit(display_font.render(''.join(get_keyboard_input()), True, DISPLAY_TEXT_COLOR), (PAD, PAD))screen.blit(img, DISPLAY_POSITION)def draw_area_keyboard(screen, keyboard_button_grp):# 绘按钮区域keyboard_button_grp.draw(screen)fps_clock = pygame.time.Clock()while True:# 判断是否最终输出if end_of_input():return get_keyboard_input()mouse_clicked = None# 获取 mouse_x, mouse_y, mouse_clickedfor event in pygame.event.get():if event.type == QUIT:exit()if event.type == MOUSEBUTTONDOWN:mouse_clicked = Trueelif event.type == MOUSEBUTTONUP:mouse_clicked = Falseelif event.type == MOUSEMOTION:mouse_x, mouse_y = event.posscreen.fill(BLACK)draw_area_display(screen)keyboard_button_grp.update(mouse_x, mouse_y, mouse_clicked)draw_area_keyboard(screen, keyboard_button_grp)fps_clock.tick(FPS)pygame.display.update()

2.3. 运行

if __name__ == '__main__':pygame.init()screen = pygame.display.set_mode(SCREEN_SIZE)result = keyboard(screen)print(result)pygame.quit()

3. 结语

这篇文章给大家一个简单的展示如何通过pygame绘制和实现虚拟键盘,当然这里只是实现了简单的打字功能。通过修改 add_input(), 为特殊 id 的 KeyboardButton 定制一些特殊的功能都是可以尝试的。祝大家游戏愉快!

Pygame小工具:模拟键盘 - 虚拟键盘(Keyboard)相关推荐

  1. 微信小程序模拟车牌号键盘

    微信小程序模拟车牌号键盘 效果图 中文键盘 英文数字键盘 项目地址:https://github.com/ushars/keyboard

  2. 小程序input调用虚拟键盘阻止系统键盘与虚拟键盘点击穿透问题

    解决小程序input调用虚拟键盘并阻止调用系统键盘问题与虚拟键盘点击穿透导致下方input获焦问题 点击input弹出虚拟键盘,并不调起系统键盘解决方案 wxml代码 <input type=& ...

  3. android 系统 keyboard 第一个字母是大写,「这个控件叫什么」系列之虚拟键盘/软键盘/Soft Keyboard...

    @龙爪槐守望者 :鉴于国内交互设计名词混乱不统一,很多设计师不知道如何用专业术语称呼一个控件,因此我开了<这个控件叫什么>专题,梳理控件的名称和使用事项,希望能为推动交互设计发展,做出一点 ...

  4. KeyboardCleanTool - Mac键盘锁定/开启小工具

    KeyboardCleanTool 是一款非常实用的Mac键盘锁定/开启小工具.在清洁键盘的时候,我们往往需要将 Mac 关机,或是断开键盘与电脑的连接.否则,等到当清洁工作完成时,已经按下了无数键, ...

  5. Qt调用虚拟键盘(软键盘)

    qt作为一个好用的Ui交互制作工具,怎么能缺少外部的IO设备. 在一些应用场景,往往需要一个软键盘(虚拟键盘),闲话少说,直接上方案: 1.首先托几个能输入的控件,外加一个按钮 2. 写代码就完事了: ...

  6. html win10虚拟键盘,笔记本电脑win10虚拟键盘打开的方法

    win10是微软推出的新一代云操作系统,为用户提供多平台体验!如今,您可以在您的电脑中开启虚拟键盘,使用虚拟键盘轻松实现各种输入. 日常工作生活中,使用电脑时,有时需要开启虚拟键盘,包括"屏 ...

  7. 【Python】实现键盘鼠标动作录制和执行的小工具

    突发奇想做一个可以实现鼠标键盘操作录制,并可以回放操作的小工具.依托于pynput模块来实现鼠标键盘的控制,tkinter来实现图形界面的绘制.分为以下几个步骤: 一 录制(记录过程,并将用户的操作保 ...

  8. i道i的鼠标键盘小工具

    i道i的鼠标键盘小工具,拥有鼠标操作,键盘操作,键盘鼠标录制,录制文件编辑的功能,现在正在测试阶段,欢迎试用与反馈bug. 下载链接:i道i的鼠标键盘小工具.exe 代码如下:(上千行粘贴到csdn挺 ...

  9. 计算机键盘标注,你所不知道的 Windows 10 小诀窍:万能计算器、虚拟键盘、屏幕截图标注...

    原标题:你所不知道的 Windows 10 小诀窍:万能计算器.虚拟键盘.屏幕截图标注 Windows 10 里面有许多好用的小功能,只是藏得很深,平常你不一定会发现它,又或者可能是并没有特别标注出来 ...

  10. JavaScript 虚拟键盘:Mindfusion JavaScript Keyboard

    高度交互,高度可定制--JavaScript 虚拟键盘--Mindfusion JavaScript Keyboard 现在,您的 JavaScript 应用程序可以像本地移动应用程序一样处理屏幕输入 ...

最新文章

  1. 数据库事务的隔离级别 (转)
  2. HashMap存自定义对象为什么要重写 hashcode 和 equals 方法?
  3. devc++64位不兼容_DNF玩家遭强制脱坑,只因64位更新后无法上游戏,如何解决?...
  4. msys2 config.guess: unable to guess system type
  5. oracle夜未眠之一增删改查
  6. PyCharm集成Anaconda3环境下安装 腾讯优图报错 ERROR: Could not install packages due to an EnvironmentError
  7. java 地址传递 返回值_Java中的值传递和引用传递
  8. @mapper注解的使用_SpringBoot-Mybatis通用mapper使用
  9. 利用 Composer 一步一步构建自己的 PHP 框架(四)——使用 ORM
  10. Quartz.NET开源作业调度框架系列(五):AdoJobStore保存job到数据库
  11. ZYNQ下载程序出现错误Memory write error at 0x100000. APB
  12. python爬虫qq付费音乐_Python爬虫实战之爬取QQ音乐数据!QQ音乐限制太多了
  13. html怎么显示五线谱,教你一个怎么看五线谱的绝招!
  14. Java创建Shape类
  15. 降维算法原理篇:主成分分析PCA、奇异值分解SVD、因子分析法FA、独立成分分析ICA等原理详推
  16. 你好,我是计算机组成原理(计算机组成原理1)
  17. 【时间序列预测】股价预测零售预测
  18. 【RESTful】REST 与 RESTful 理解与实践
  19. 1200000有多少个约数
  20. 分享8个有趣的python小玩具

热门文章

  1. html实现图片裁剪,【前端】图片裁剪(二)Jcrop实现裁剪
  2. 灵感爆发:An/flash 影片剪辑动画播放一遍后,摆脱paly()的控制
  3. PDF文件修改最常用的方式有哪些?
  4. 一题多解×2(流的概念+递归)
  5. pdf转word ocr_最强PDF转WORD软件:ABBYY FineReader
  6. 阿里巴巴协助征战SARS(简单)
  7. 斯坦福大学公开课:机器学习的动机与应用
  8. oracle裁员原因_Oracle中国良心裁员:首批900人,赔偿N+6
  9. c++while循环
  10. 自然辩证法小总结思维导图