Python:pygame开发 解决如何同时按下两个方向键让精灵斜着走,对键盘同时按下两个方向键的处理(全网唯一)
程序员文章站
2022-05-28 13:10:22
...
pygame中有两种键盘捕获方式
●第一种方式判断event.type == pygame.KEYDOWN
实现代码:
if event.type == pygame. KEYDOWN and event.key == pygame.K RIGHT:
print("向右移动...")
●第二种方式
1.首先使用pygame. key.get_ pressed()
返回所有按键元组
2.通过键盘常量,判断元组中某一个键是否被按下——如果被按下,对应数值为1
实现代码:
变量 = pygame.key.get_pressed()
if 变量[pygame.K_RIGHT]:
print("向右移动")
-`-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
●在这里说明一下,经过测试发现,用第二种方式写代码虽然更为简单方便,但是无法让创建的精灵在屏幕上斜着走,暨无法对同时对键盘按下两个方向键进行判断。
·
●这里我们采用第一种方式,监听键盘敲击事件,在按下某一个方向键时用列表存储每次按键的键值,同时在松开某一个方向键时删除此键在列表中的键值。
此目的是:只需要对列表中的键值进行判断从而使精灵进行移动即可,并且在列表中同一时间存储的数值不会超过两个!
·
代码实现:
精灵类
# 继承飞机基类
class hero_plane(planeSprites):
"""主机精灵"""
def __init__(self):
super().__init__("./飞机大战素材/主飞机.png", 0)
# 设置飞机初始位置
self.rect.centerx = SCREEN_RECT.centerx
self.rect.bottom = SCREEN_RECT.height - 100
# 用列表存储键盘的双键移动
self.key_list = []
# 按键按下时将监听到的键值加入列表
def key_down(self, key):
self.key_list.append(key)
# 按键松开时将监听到的键值从列表中删除
def key_up(self, key):
if len(self.key_list) != 0:
self.key_list.remove(key)
# 重写基类更新方法
def update(self, *args):
if len(self.key_list) != 0:
# 同时按下两个键时进行判断
if len(self.key_list) == 2:
if (self.key_list[0] == pygame.K_UP and self.key_list[1] == pygame.K_LEFT) or (self.key_list[
0] == pygame.K_LEFT and
self.key_list[
1] == pygame.K_UP):
self.rect.x -= 4
self.rect.y -= 4
elif (self.key_list[0] == pygame.K_UP and self.key_list[1] == pygame.K_RIGHT) or (self.key_list[
0] == pygame.K_RIGHT and
self.key_list[
1] == pygame.K_UP):
self.rect.x += 4
self.rect.y -= 4
elif (self.key_list[0] == pygame.K_DOWN and self.key_list[1] == pygame.K_RIGHT) or (self.key_list[
0] == pygame.K_RIGHT and
self.key_list[
1] == pygame.K_DOWN):
self.rect.x += 4
self.rect.y += 4
elif (self.key_list[0] == pygame.K_DOWN and self.key_list[1] == pygame.K_LEFT) or (self.key_list[
0] == pygame.K_LEFT and
self.key_list[
1] == pygame.K_DOWN):
self.rect.x -= 4
self.rect.y += 4
# 按下一个键时进行判断
else:
if self.key_list[0] == pygame.K_LEFT:
self.rect.x -= 4
elif self.key_list[0] == pygame.K_RIGHT:
self.rect.x += 4
elif self.key_list[0] == pygame.K_UP:
self.rect.y -= 4
elif self.key_list[0] == pygame.K_DOWN:
self.rect.y += 4
主函数类
# 精灵/精灵组创建
def __create_spirits(self):
self.hero = hero_plane()
self.heroGroup = pygame.sprite.Group(self.hero)
# 精灵更新处理
def __update_spirits(self):
self.heroGroup.update()
self.heroGroup.draw(self.screen)
# 事件监听处理
def __event_handler(self):
# 遍历监听到的所有事件
for event in pygame.event.get():
# 判断事件类型是否是按下键盘
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
# 向列表中加入向上键值
self.hero.key_down(pygame.K_UP)
elif event.key == pygame.K_DOWN:
self.hero.key_down(pygame.K_DOWN)
elif event.key == pygame.K_RIGHT:
self.hero.key_down(pygame.K_RIGHT)
elif event.key == pygame.K_LEFT:
self.hero.key_down(pygame.K_LEFT)
# 判断事件类型是否是松开键盘
elif event.type == pygame.KEYUP:
if event.key == pygame.K_UP:
# 在列表中删除向上按键值
self.hero.key_up(pygame.K_UP)
elif event.key == pygame.K_DOWN:
self.hero.key_up(pygame.K_DOWN)
elif event.key == pygame.K_RIGHT:
self.hero.key_up(pygame.K_RIGHT)
elif event.key == pygame.K_LEFT:
self.hero.key_up(pygame.K_LEFT)
上一篇: 【实用小知识点】Find与Component常用方法
下一篇: 三个数排序