PyGame键盘

news/2025/1/11 5:06:29/

一、游戏设备

       玩过游戏的都知道鼠标和键盘是游戏的不可或缺的输入设备。键盘可以控制有限的方向和诸多的命令操作,而鼠标更是提供了全方位的方向和位置操作。不过这两个设备并不是为游戏而生,专业的游戏手柄给玩家提供了更好的操作感,加上力反馈等技术,应该说游戏设备越来越丰富,玩家们也是越来越幸福。

二、键盘设备

我们先从最广泛的键盘开始讲起。

现在使用的键盘,基本都是QWERTY键盘(看看字幕键盘排布的左上就知道了),尽管这个世界上还有其他种类的键盘,比如AZERTY啥的,反正我是没见过,如果你能在写游戏的时候考虑到这些特殊用户自然是最好,个人感觉是问题不大吧。

以前第二部分也稍微使用了一下键盘,那时候是用了pygame.event.get()获取所有的事件,当event.type == KEYDOWN的时候,在判断event.key的种类,而各个种类也使用K_aK_b……等判断。这里再介绍一个pygame.key.get_pressed()来获得所有按下的键值,它会返回一个元组。这个元组的索引就是键值,对应的就是是否按下,比如说:

# -*- coding: utf-8 -*- 
# Time : 2019/2/7 11:58 
# Author : hubozhi
import pygame
from pygame.locals import *
from sys import exitdef fire():print("K_SPACE")if __name__ == "__main__":pygame.init()win = pygame.display.set_mode((640,480),0,32)while True:for event in pygame.event.get():if event.type==QUIT:exit()if event.type==KEYDOWN:pressed_keys = pygame.key.get_pressed()if pressed_keys[K_SPACE]:# Space key has been pressedfire()pressed_keys = pygame.key.get_pressed()


key.get_focused —— 返回当前的pygame窗口是否激活当然key模块下还有很多函数:

key.get_pressed 

获得所有按下的键值,它会返回一个元组
key.get_mods 按下的组合键(Alt, Ctrl, Shift)
key.set_mods 你也可以模拟按下组合键的效果(KMOD_ALT, KMOD_CTRL, KMOD_SHIFT)

key.set_repeat

无参数调用设置pygame不产生重复按键事件,二参数(delay, interval)调用设置重复事件发生的时间

key.name

接受键值返回键名

三、使用键盘控制方向

有了上一章向量的基础,只需一幅图就能明白键盘如何控制方向:

很多游戏也使用ASDW当做方向键来移动,我们来看一个实际的例子:

# -*- coding: utf-8 -*- 
# Time : 2019/2/7 11:58 
# Author : hubozhi
import pygame
from pygame.locals import *
from sys import exit
from gameobjects.vector2 import Vector2background_image_filename = './image/sushiplate.jpg'
sprite_image_filename = './image/fugu.png'if __name__ == "__main__":pygame.init()screen = pygame.display.set_mode((640, 480), 0, 32)background = pygame.image.load(background_image_filename).convert()sprite = pygame.image.load(sprite_image_filename).convert_alpha()clock = pygame.time.Clock()sprite_pos = Vector2(200, 150)sprite_speed = 300.while True:for event in pygame.event.get():if event.type == QUIT:exit()pressed_keys = pygame.key.get_pressed()key_direction = Vector2(0, 0)if pressed_keys[K_LEFT]:key_direction.x = -1elif pressed_keys[K_RIGHT]:key_direction.x = +1if pressed_keys[K_UP]:key_direction.y = -1elif pressed_keys[K_DOWN]:key_direction.y = +1key_direction.normalize()screen.blit(background, (0,0))screen.blit(sprite, sprite_pos)time_passed = clock.tick(30)time_passed_seconds = time_passed / 1000.0sprite_pos += key_direction * sprite_speed * time_passed_secondspygame.display.update()

        这个例子很简单,就是使用方向键移动小鱼。使用的知识也都讲过了,相信大家都可以理解。不过这里并不是单纯的判断按下的键来获得方向,而是通过对方向的加减来获得最终的效果,这样可能会更简短一些,也需要一些技术;如果把方向写入代码,效率更高,不过明显通用性就要低一些。记得把力气花在刀刃上!当然这个例子也不是那么完美,看代码、实践一下都能看到,左方向键的优先级大于右方向键,而上则优于下,我们是否有更好的方法?……有兴趣的自己考虑~

         这个例子我们可以看到,小鱼只能在八个方向移动,如何做到全方向?如果你游戏经验足一点或许可以想到,是的,先转向,再移动,尽管不是那么快捷,但毕竟达到了目标。我们看一下这样的代码怎么写:

# -*- coding: utf-8 -*- 
# Time : 2019/2/7 11:58 
# Author : hubozhi
import pygame
from pygame.locals import *
from sys import exit
from gameobjects.vector2 import Vector2
from math import *background_image_filename = './image/sushiplate.jpg'
sprite_image_filename = './image/fugu.png'if __name__ == "__main__":pygame.init()screen = pygame.display.set_mode((640, 480), 0, 32)background = pygame.image.load(background_image_filename).convert()sprite = pygame.image.load(sprite_image_filename).convert_alpha()clock = pygame.time.Clock()sprite_pos = Vector2(200, 150)  # 初始位置sprite_speed = 300. # 每秒前进的像素数(速度)sprite_rotation = 0.# 初始角度sprite_rotation_speed = 360.  # 每秒转动的角度数(转速)while True:for event in pygame.event.get():if event.type == QUIT:exit()pressed_keys = pygame.key.get_pressed()rotation_direction = 0.movement_direction = 0.# 更改角度if pressed_keys[K_LEFT]:rotation_direction = +1.if pressed_keys[K_RIGHT]:rotation_direction = -1.# 前进、后退if pressed_keys[K_UP]:movement_direction = +1.if pressed_keys[K_DOWN]:movement_direction = -1.screen.blit(background, (0, 0))# 获得一条转向后的鱼rotated_sprite = pygame.transform.rotate(sprite, sprite_rotation)# 转向后,图片的长宽会变化,因为图片永远是矩形,为了放得下一个转向后的矩形,外接的矩形势必会比较大w, h = rotated_sprite.get_size()# 获得绘制图片的左上角sprite_draw_pos = Vector2(sprite_pos.x - w / 2, sprite_pos.y - h / 2)screen.blit(rotated_sprite, sprite_draw_pos)time_passed = clock.tick()time_passed_seconds = time_passed / 1000.0# 图片的转向速度也需要和行进速度一样,通过时间来控制sprite_rotation += rotation_direction * sprite_rotation_speed * time_passed_seconds# 获得前进(x方向和y方向),这两个需要一点点三角的知识heading_x = sin(sprite_rotation * pi / 180.)heading_y = cos(sprite_rotation * pi / 180.)# 转换为单位速度向量heading = Vector2(heading_x, heading_y)# 转换为速度heading *= movement_directionsprite_pos += heading * sprite_speed * time_passed_secondspygame.display.update()

我们通过上下控制前进/后退,而左右控制转向。我们通过pygame.transform.rotate()来获得了转向后的图片,具体参数可以参考代码。


http://www.ppmy.cn/news/157866.html

相关文章

linux umask值的用法

概念 user\group\others:rwx-rwx-rwxr-read,数值w-write,数值2x-execute,数值1root账号对目录的操作权限777,对文件的操作权限为666。普通账号对目录默认权限是777-022755,对文件的操作权限是666-022644 命令行 who…

【游戏引擎Easy2D】三分钟学会游戏的控制移动,键盘识别详解

【游戏引擎Easy2D】三分钟学会游戏的控制移动,键盘识别详细 🧛‍♂️iecne个人主页:点赞关注收藏评论支持哦~💡每天关注iecne的作品,一起进步✨一起学习内容专栏:C保姆级入门教程 C每日一题 C游戏设计教程…

常见的五种排序

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C 🔥座右铭:“不要等到什么都没有了,才下…

谷歌前搜索与AI部门老大昨日刚卸任,今天就被苹果挖走向库克汇报

▼ 点击上方蓝字 关注网易智能 为你解读AI领域大公司大事件,新观点新应用 图:约翰詹南德雷亚(John Giannandrea) 【网易智能讯 4月4日消息】苹果公司今日宣布聘请昨日离职的谷歌前搜索与AI部门高级副总裁约翰詹南德雷亚&#xff0…

【文章汇总】嵌入式Linux公众号

据悉,深圳某工程师沦为C语言笔试枪手 修改cmdline 把内存改成512MB 上拉电阻的作用

没有今天的百度,难道它真的天亮了?

loonggg 读完需要 10分钟 速读仅需 4 分钟 百度,昨天在港二次上市。 百度一艘被移动互联网时代落下的大船,总感觉从 10 年到 20 年,这十年间像是被搁浅了一般。 但是,现实却真的如此呢?在 2000 年 - 2010 年之间&#…

模型部署到移动端_模型压缩+编译器优化,使AI算法在移动端性能超越专用硬件...

作者 | 王言治,美国东北大学电子与计算机工程系助理教授 出品 | AI科技大本营(ID:rgznai100) 近年来,机器学习(Machine Learning)领域的研究和发展可谓是与日俱新,各式各样与机器学习相关的研究成果与应用层出不穷(如图像识别,自动…

全球最大手机公司又发年度新品:AI亮得一笔,智能音箱又晚又丑

雷刚 假装发自 新约克 量子位 报道 | 公众号 QbitAI 全球最大的手机公司三星,刚刚在纽约召开了年度新品发布会。 没错,以销量数据而言,地球上执牛耳者不是华为更不是苹果,依然还是韩国电子巨头Samsung。 所以无论对于终端消费者用…