いつも KeyListener を使ったキー入力の処理ついて迷ってしまいます。
現在は後述のコードが示すように、押されたキーを ArrayList につっこんで if文 でひとつひとつ処理する方法をよく使っています(同時押しに対応するため)。これを書いていて「if文 がとても冗長だ。」といつも感じます。かといって switch文 を使うと、同時押しに対応できません。もっとなにかスマートに実装できる方法があるでしょうか(同時押しに対応したものでおねがいします)(or みなさんはどのように処理していますか?)
(※実装部分のみ抜粋)
Java
1 private ArrayList<Integer> key_pressed = new ArrayList<Integer>(); 2 3 public void _update() { 4 // マウス全般の処理 5 /* 省略 */ 6 // ここまで 7 8 // キーボードでのスクロール移動処理 9 byte speed = 1; 10 11 if(isPressed(KeyEvent.VK_SHIFT)) { 12 speed = 2; 13 } 14 15 if(isPressed(KeyEvent.VK_UP)) { 16 viewport_y += speed; 17 } 18 if(isPressed(KeyEvent.VK_DOWN)) { 19 viewport_y -= speed; 20 } 21 if(isPressed(KeyEvent.VK_LEFT)) { 22 viewport_x += speed; 23 } 24 if(isPressed(KeyEvent.VK_RIGHT)) { 25 viewport_x -= speed; 26 } 27 // ここまで 28 29 // キーボードでの拡大と縮小 30 if(isPressed(KeyEvent.VK_A) && grid_cell_size < max_grid_cell_size) { 31 grid_cell_size++; 32 } 33 if(isPressed(KeyEvent.VK_Z) && grid_cell_size > min_grid_cell_size) { 34 grid_cell_size--; 35 } 36 // ここまで 37 } 38 39 @Override 40 public void keyTyped(KeyEvent e) { 41 42 } 43 @Override 44 public void keyPressed(KeyEvent e) { 45 if(key_pressed.contains(e.getKeyCode())) return; 46 47 key_pressed.add(new Integer(e.getKeyCode())); 48 } 49 @Override 50 public void keyReleased(KeyEvent e) { 51 key_pressed.remove(new Integer(e.getKeyCode())); 52 } 53 54 public boolean isPressed(Integer keyCode) { 55 return key_pressed.contains(keyCode); 56 }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/19 10:02
2017/01/22 10:23
2017/01/23 00:05
2017/01/23 00:28