テトリスを作っています。
コード public class KeyInput implements KeyListener{ boolean keyUp; //上移動キー boolean keyDown; //下移動キー boolean keyLeft; //左移動キー boolean keyRight; //右移動キー /*コンストラクタ*/ public KeyInput(){ keyUp = false; keyDown = false; keyLeft = false; keyRight = false; } /*キーが押されたときに呼ばれるメソッド*/ @Override public void keyPressed(KeyEvent e){ /**キー取得*/ int keycode = e.getKeyCode(); if(keycode == KeyEvent.VK_UP){ keyUp = true; } if(keycode == KeyEvent.VK_DOWN){ keyDown = true; } if(keycode == KeyEvent.VK_LEFT){ keyLeft = true; } if(keycode == KeyEvent.VK_RIGHT){ keyRight = true; } } /*キーを離されたときに呼ばれるメソッド*/ @Override public void keyReleased(KeyEvent e){ /**キー取得*/ int keycode = e.getKeyCode(); if(keycode == KeyEvent.VK_UP){ keyUp = false; } if(keycode == KeyEvent.VK_DOWN){ keyDown = false; } if(keycode == KeyEvent.VK_LEFT){ keyLeft = false; } if(keycode == KeyEvent.VK_RIGHT){ keyRight = false; } } @Override public void keyTyped(KeyEvent e){ } }
上下左右キーを押したらtrue、離すとfalseになるようなっています。
また別のクラスで下のようなプログラムを書いています。
コード public void run(){ while(true){ repaint(); try{ Thread.sleep(20); } catch(InterruptedException e){ } } } /**描画処理*/ @Override protected void paintComponent(Graphics g){ super.paintComponent(g); if(keyInput.keyUp == true){ //処理なし } if(keyInput.keyDown == true){ objectPool.moveBlock(0, 1); } if(keyInput.keyLeft == true){ objectPool.moveBlock(-1, 0); } if(keyInput.keyRight == true){ objectPool.moveBlock(1, 0); } break; } public void moveBlock(int X, int Y){ int postX = x + X; int postY = y + Y ; /**Panel内移動可、外は移動不可*/ if(0 <= postX && postX <= panelW - width){ x = postX; } if(0 < postY && postY < panelH - height){ y = postY; } }
この二つのプログラムについてですが、
例えば左キーを1回押すと左に1だけ動いてほしいのですが、このプログラムだと3,4ほど左に動いてしまいます。
この原因はなんなのでしょうか?
また改善方法を教えていただきたいです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/09 02:07
2017/03/09 02:57
2017/03/10 04:03