processingのキー入力の問題点

processingでアクションゲームを作ろうとした場合、キー入力に関して問題が出てきます。どんな問題かというと…

  • キーの押しっぱなしがカクカクする
  • キーの同時押しを判定できない

などです。

def keyPressed()を使った場合

問題点は

  • 反応が遅い(カクカクする)
  • 同時押しを認識しない
  • 同時押しすると挙動がおかしい
x = 150
y = 100
def setup():
    size(300, 200)
    noStroke()
    fill(255)

def draw():
    background(240, 210, 210)
    ellipse(x, y, 20, 20)

def keyPressed():
    global x, y
    if keyCode == LEFT:
        x += -3
    if keyCode == RIGHT:
        x += 3
    if keyCode == UP:
        y += -3
    if keyCode == DOWN:
        y += 3

def draw()を使った場合

def keyPressed()と比べると反応は良くなるが、下記の問題点は改善されない

  • 同時押しを認識しない
  • 同時押しすると挙動がおかしい
x = 150
y = 100
def setup():
    size(300, 200)
    noStroke()
    fill(255)

def draw():
    global x, y
    background(240, 210, 210)
    ellipse(x, y, 20, 20)
    if keyPressed:
        if keyCode == LEFT:
            x += -1
        if keyCode == RIGHT:
            x += 1
        if keyCode == UP:
            y += -1
        if keyCode == DOWN:
            y += 1

両方を組み合わせた方法

def keyPressed()の判定の確実性とdef draw()の速度の良いところを組み合わせてみます。

from KeyState import KeyState

x = 150
y = 100
def setup():
    size(300, 200)
    noStroke()
    fill(255)

def draw():
    global x, y
    background(220, 240, 220)
    ellipse(x, y, 20, 20)
    if keyPressed:
        if KeyState.isPress(LEFT):
            x += -3
        if KeyState.isPress(RIGHT):
            x += 3
        if KeyState.isPress(UP):
            y += -3
        if KeyState.isPress(DOWN):
            y += 3
            
def keyPressed():
    if key == 65535:
        KeyState.put(keyCode, True)
    else:
        KeyState.put(key, True)

def keyReleased():
    if key == 65535:
        KeyState.put(keyCode, False)
    else:
        KeyState.put(key, False)
    

コードが複雑になるため専用のクラスを作成してあります。コードエディタの新しいタブを開いて「KeyState.py」という名前をつけてください。また、必ず保存をしてから実行をしてください。複数のファイルから構成されるプログラムは必ず保存する必要があります。

class KeyState(object):
    up = False
    down = False
    left = False
    right = False

    @classmethod
    def put(self, code=0, state=False):
        if code == UP:
            KeyState.up = state
        if code == DOWN:
            KeyState.down = state
        if code == LEFT:
            KeyState.left = state
        if code == RIGHT:
            KeyState.right = state

    @classmethod
    def isPress(self, code=0):
        if code == UP:
            return KeyState.up
        if code == DOWN:
            return KeyState.down
        if code == LEFT:
            return KeyState.left
        if code == RIGHT:
            return KeyState.right
        return keyPressed

コメントする