キーイベント2

前回のキーイベントはキーを一回押すごとに上下左右に動きました.
今回は, キーを押している分だけ動作するプログラムです.
これはインベーダーゲームでビームを連続で発射するとき等に使うことができます.

import pygame
from pygame.locals import *
import sys

SCREEN_SIZE = (1000, 700)

pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_caption("キーイベント2")
backImg = pygame.image.load("hakusuiko.jpg").convert()
pythonImg2 = pygame.image.load("kappa3.png").convert()
colorkey = pythonImg2.get_at((0,0))  # 左上の色を透明色に
pythonImg2.set_colorkey(colorkey, RLEACCEL)
pythonImg2_rect = pythonImg2.get_rect()
pythonImg2_rect.center = (500, 350)

vx = vy = 1  # キーを押したときの移動距離

while True:
    screen.blit(backImg, (0,0))
    # 押されているキーをチェック
    pressed_keys = pygame.key.get_pressed()
    # 押されているキーに応じて画像を移動
    if pressed_keys[K_LEFT]:
        pythonImg2_rect.move_ip(-vx, 0)
    if pressed_keys[K_RIGHT]:
        pythonImg2_rect.move_ip(vx, 0)
    if pressed_keys[K_UP]:
        pythonImg2_rect.move_ip(0, -vy)
    if pressed_keys[K_DOWN]:
        pythonImg2_rect.move_ip(0, vy)


    screen.blit(pythonImg2,pythonImg2_rect)
    pygame.display.update()

    for event in pygame.event.get():
        if event.type == QUIT: sys.exit()
        if event.type == KEYDOWN:  # キーを押したとき
            # ESCキーならスクリプトを終了
            if event.key == K_ESCAPE:
                sys.exit()

これもwhile文から説明します.
pygame.key.get_pressed()関数はキーを押した話したの瞬間の動作ではなく, 関数が呼び出した時にどのキーが押されているか検出するものなので, 押されている間はずっと検出され指定した動作を続けることができます. また, この関数はどのキーが押されたかわかります.

get_pressed()のタプルをpressed_keyに格納して, pressed_keys[]を調べます.
押されてないときは0でFalse, 押されているときは1でTrueとなり, if文の条件分岐上で検出され動作します.