dポイントプレゼントキャンペーン実施中!

こんにちは。

Javaの基礎を一通り勉強したので、簡単なゲームでも作ってみようと思ったのですが、早速問題にぶつかってしまいました。

キーを入力して左右にキャラを移動させたいのですが、
キーを押し続けると最初の1歩はすぐに移動してくれるのですが、
そのあとワンテンポ遅れてから、「ズダダダダダ」ってな感じ?で動いてしまいます。
調べてみたら、キーリピートというのが問題になっていることは分かったのですが、
どうすれば普通のゲームのように動いてくれるのでしょうか?

今はまだ下のような感じなんですが・・・。(右に動くとき)
public void keyPressed(KeyEvent e) {
  if(e.getKeyCode() == e.VK_RIGHT){
    muki = 1; // キャラの向き
    px += 10; // キャラのx座標
  }
}

よろしくお願いします。

A 回答 (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){}}
}

参考URL:http://ponk.jp/java_shoot/index.php?page=1,http://www.na.rim.or.jp/~ykumano/java/java.htm#03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!