- ベストアンサー
キーリピートとは?Javaプログラミングでのキャラの移動における問題解決方法
- Javaプログラミングでキャラの移動を行う際に起こるキーリピート問題について、解決方法を探しています。
- キーリピートとは、キーを押し続けた場合にキーボードから複数のイベントが発生する現象のことです。
- 特にゲームプログラミングでは、キーリピートが原因でキャラクターの動きが不自然になることがあります。問題を解決するためには、キーリピートを無効化する方法があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
よくある簡単な方法は、 ■使用するキーごとに「押下判別フラグ」を用意し ■keyPressed()でフラグをtrueし、keyRelease()ではfalse。 これ以外の処理は行わない。 ■ゲームのメインループ内からこのフラグ値を参照して、 その値をゲームに反映させる(※自機の位置を決めたりする)。 というものだと思う。(この方法ならばキーリピートは無視される。) これが最善の方法かはわからない。(あんまり研究したことない。) 他にも方法があるけど、素人なので詳しいことはわからない。 もっとイカした方法があるかも? ゲームプログラミングは特に、 ネット上にあるサンプルコードを実際に 見たほうが勉強になるかも。 ・要点を解説 http://ponk.jp/java_shoot/index.php?page=1 ・ソースコードの例 http://www.na.rim.or.jp/~ykumano/java/java.htm#03 ・サンプル↓ class T extends Component implements Runnable, KeyListener{ Thread th;boolean r_down, l_down;int x; final int R = KeyEvent.VK_RIGHT, L = KeyEvent.VK_LEFT; public void keyPressed(KeyEvent e){ switch(e.getKeyCode()) { case R:r_down = true;break; case L:l_down = true;break; } } public void keyReleased(KeyEvent e){ switch(e.getKeyCode()) { case R:r_down = false;break; case L:l_down = false;break; } } public void keyTyped(KeyEvent e){} public void init() { addKeyListener(this); th=new Thread(this);th.start();requestFocus(); } public void run() { while(true){_doSomething();sleep(33);repaint();} } void _doSomething() { if(r_down){x += 5;}if(l_down){x -= 5;} } public void paint(Graphics g){g.drawRect(x,70,16,16);} public static void main(String[] args) { Frame f = new Frame();T a = new T();f.add(a); f.setSize(200, 160);f.setVisible(true);a.init(); } void sleep(long t){try{Thread.sleep(t);}catch(Exception e){}} }