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 += 3def 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