前からだいぶあきすぎたが、再開してみる。以前はGlendaクラスがKeyListenerを実装していたが、キー監視用のクラスを作り、キーが押されてるかどうかの確認をそのクラスのオブジェクトで行うことにした。このクラスから複数オブジェクトを作ってもしょうがないのでシングルトンにした。変更したクラスは2つ。GameとGlenda。そしてKeyInputを追加した。
まずGlendaクラスから。ただKeyListener外して、代わりにKeyInputを持たせた。actionでそのキーを押されてるか判定して移動する。
package game.object.character; import java.awt.Image; import java.awt.event.KeyEvent; import game.key.KeyInput; import game.object.DrawData; import game.object.GameObject; /** * プレイヤーが操作するキャラクターであるGlenda(Plan9のマスコット)を表すクラス */ public class Glenda extends GameObject{ /** キーボードを押したときに移動する距離 */ private static final int MOVE_DISTANCE = 4; /** キーボード監視用変数 */ private KeyInput keyInput; /** * 画像を受け取り、初期化する * * @param image Glendaの画像 */ public Glenda(Image image){ super("Glenda", GameObject.Group.Player, image); keyInput = KeyInput.getKeyInput(); } /** * Glendaを移動させる。移動先を決めた後、キーボードでの移動を許可する */ @Override public DrawData action(){ if(keyInput.isKeyInput(KeyEvent.VK_UP)){ move(currentX, currentY - MOVE_DISTANCE); } if(keyInput.isKeyInput(KeyEvent.VK_DOWN)){ move(currentX, currentY + MOVE_DISTANCE); } if(keyInput.isKeyInput(KeyEvent.VK_LEFT)){ move(currentX - MOVE_DISTANCE, currentY); } if(keyInput.isKeyInput(KeyEvent.VK_RIGHT)){ move(currentX + MOVE_DISTANCE, currentY); } DrawData data = new DrawData(); data.setX(currentX); data.setY(currentY); data.setImage(imageList.get(0)); return data; } }
次にGameクラス。変更箇所は1行
//addKeyListener(glenda);だった部分
addKeyListener(KeyInput.getKeyInput());
最後にKeyInputクラス。キーイベントを受け取り、押されたらMapの対応する値をtrueに、離されたら対応する値をfalseにする
package game.key; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Map; import java.util.HashMap; public class KeyInput implements KeyListener{ private static KeyInput input = new KeyInput(); private Map<Integer, Boolean> keyMap; private KeyInput(){ keyMap = new HashMap<Integer, Boolean>(); for(int i = 0; i < 255; i++){ keyMap.put(i, false); } } public static KeyInput getKeyInput(){ return input; } public boolean isKeyInput(int code){ return keyMap.get(code); } public void keyPressed(KeyEvent e){ keyMap.put(e.getKeyCode(), true); } public void keyReleased(KeyEvent e){ keyMap.put(e.getKeyCode(), false); } public void keyTyped(KeyEvent e){} }