pygame之飞机大战按键操作解决方案比较(1)

在pygame 编写的飞机大战里,可以用鼠标来移动,鼠标左右键来发射子弹。这个相对来说容易写。

经过多次实践,实现如下功能:

用 ASDW来控制飞机移动,用J来控制子弹发射。当然键是可以随意定义的,用这些是因为个人习惯。

为了简单化,只是让程序 print() 输出信息来表示实现的功能。

1、最简单的实现方法

import pygame
from sys import exit  #用到exit() 省的每次退出都有红字提示

class Keycontral(object):

    def __init__(self):
        pygame.init()
        scene = pygame.display.set_mode((400,600))
        pygame.display.set_caption('按键测试')
        #记录 a 键 按下的次数
        self.key_a_count = 0  
        #记录 j 键 按下的次数  
        self.key_j_count = 0
    
    def keyTest(self):
        while True:
            for event in pygame.event.get():
                #退出程序
                if event.type == pygame.QUIT:
                        pygame.quit()
                        exit()
                #按键测试开始,按键被按下
                if event.type == pygame.KEYDOWN:
                    # a 按下,其他控制键先不写
                    if event.key == pygame.K_a:
                        self.key_a_count +=1
                        print('KEY A IS PRESSED ' + str(self.key_a_count))
                        
                    # j 按下,射击键
                    if event.key == pygame.K_j:
                        self.key_j_count += 1
                        print('Key J is pressed ' + str(self.key_j_count))
                
if __name__ == "__main__" :
    demo1 = Keycontral()
    demo1.keyTest()

基本的方向控制及射击功能完成了。

2  按住不放,实现连续移动的功能

但是只能单次击键,按住不放不能用,手受不了。但pygame没有直接提供按住状态的函数,只能自己实现

下面实现按住 a 键 不放,实现连续移动的功能。

用到一个简单的函数 

pygame.key.set_repeat()

control how held keys are repeated

set_repeat() -> None

set_repeat(delay, interval) -> None

When the keyboard repeat is enabled, keys that are held down will generate multiple pygame.KEYDOWN events. The delay is the number of milliseconds before the first repeated pygame.KEYDOWN will be sent. After that another pygame.KEYDOWN will be sent every interval milliseconds. If no arguments are passed the key repeat is disabled.

When pygame is initialized the key repeat is disabled.

简单一点就是说设置后,pygame.KEYDOWN 能不停的重复。

代码如下:

#添加代码一行
def __init__(self):
         # 1为 true,50 毫秒的相应时间
         pygame.key.set_repeat(1,50)

按键能实现连续的效果了,所有 KEYDOWN 的按键都相应了。

3  换个方式,上面代码只适合一个按键

用 pygame.key.set_repeat() 似乎能实现按键不放的效果,可是还是不理想,按住 A 键 后能连续监测到,但按住J 键后,A键无效了,松开 J 键,A 键照样无反应。这不是我想要的效果。经过摸索,找到了

pygame.key.get_pressed get the state of all keyboard buttons

完整代码如下:

import pygame
from sys import exit  #用到exit() 省的每次退出都有红字提示

class Keycontral(object):
    def __init__(self):
        pygame.init()
        scene = pygame.display.set_mode((400,600))
        pygame.display.set_caption('按键测试')
        #记录 a 键 按下的次数
        self.key_a_count = 0  
        #记录 j 键 按下的次数  
        self.key_j_count = 0
        pygame.key.set_repeat(1,50)
    
    def keyTest(self):
        while True:
            for event in pygame.event.get():
                #退出程序
                if event.type == pygame.QUIT:
                        pygame.quit()
                        exit()
                #按键测试开始,按键被按下
                keys = pygame.key.get_pressed()
                    # a 按下,其他控制键先不写
                if keys[pygame.K_a]:
                    self.key_a_count +=1
                    print('KEY A IS PRESSED ' + str(self.key_a_count))               
                    # j 按下,射击键
                if keys[pygame.K_j]:
                    self.key_j_count += 1
                    print('Key J is pressed ' + str(self.key_j_count))
                
if __name__ == "__main__" :
    demo1 = Keycontral()
    demo1.keyTest()

好像效果好一点了,同时按下 A 键 J 键 能轮流输出结果了,也就是能向左移动的过程中射击了。以为大功告成了。

继续添加  D 键 

                if keys[pygame.K_]:
                    self.key_d_count +=1
                    print('KEY D IS PRESSED ' + str(self.key_d_count))  

左右一移动,问题来了,每个键单独按,能实现连续,松开,换键,也行。但是两个按住后,松开其中一个按键,另一个无效了。

4 再换个方式吧。暂时写到这里。。。。。待续

猜你喜欢

转载自blog.csdn.net/hailler1119/article/details/88133283