欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)