pygameの飛行機大戦ボタン操作ソリューション比較(1)

4343 ワード

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別の方法では、上のコードは1つのキーにのみ適用されます.
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))  

左右に移動すると、問題が来て、各キーを単独で押すことで、連続、緩み、キーを交換することができます.しかし、2つを押した後、1つのボタンを離すと、もう1つは無効になります.
4もう一つ方法を変えましょう.しばらくここまで書きます....続きを待つ