Python:pygame开发 解决如何同时按下两个方向键让精灵斜着走,对键盘同时按下两个方向键的处理(全网唯一)

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此时一位小白路过

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值