こんにちは。
Javaの基礎を一通り勉強したので、簡単なゲームでも作ってみようと思ったのですが、早速問題にぶつかってしまいました。
キーを入力して左右にキャラを移動させたいのですが、
キーを押し続けると最初の1歩はすぐに移動してくれるのですが、
そのあとワンテンポ遅れてから、「ズダダダダダ」ってな感じ?で動いてしまいます。
調べてみたら、キーリピートというのが問題になっていることは分かったのですが、
どうすれば普通のゲームのように動いてくれるのでしょうか?
今はまだ下のような感じなんですが・・・。(右に動くとき)
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == e.VK_RIGHT){
muki = 1; // キャラの向き
px += 10; // キャラのx座標
}
}
よろしくお願いします。
No.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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- レトロゲーム ファミコンのインベーダの質問その3 背景にインベーダーを描画したとしても、なぜ動けるのか? 3 2022/07/08 16:58
- その他(病気・怪我・症状) 右手首が動かしにくいです。 今日腕枕で昼寝をしていたら起床直後から現在まで右手首が全くと言っていいほ 1 2022/12/28 23:07
- その他(動画サービス) OBSで質問です ①HyperX Cloud Alpha ゲーミング ヘッドセット インライン音量コ 1 2022/11/21 22:10
- その他(プログラミング・Web制作) iMacのシェル内カーソル移動 1 2022/06/15 17:27
- Java Javaプログラミングの質問になります。 ボタンを押下した時に画面遷移して 画面から戻ってきた時のi 1 2023/06/26 07:50
- Java キー入力について 1 2023/06/03 11:04
- 楽器・演奏 フルートのキーの調子が悪いです。どうしたら治りますか 2 2022/09/04 11:37
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- 大学・短大 至急教えてください。アリゴリズムの問題です。 下の図3×9のマス目において、白いコマと黒いコマが3個 12 2022/07/07 18:05
- 神経の病気 手首の痛みの原因を教えて下さい。 6 2022/08/02 06:56
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GetDIBits関数の使い方について
-
ボタンのイベントで異なるウィ...
-
C#で、あるクラスのメンバーす...
-
デスクトップマスコットのドラ...
-
大量のデータを読み込んで表示...
-
ピクチャボックスのクリックイ...
-
C# 親フォームで指定した値を...
-
C#でキーイベントが発生しない...
-
Junitテストでvoid戻り値メッソ...
-
C#で別のFormへ複数の値を返そ...
-
C# DataGridView列カスタマイズ
-
appletの画像が表示されない
-
Processingでマウスクリックで...
-
Java 他クラスの呼び出しが上手...
-
staticな有効範囲の配列の作り...
-
なぜエラーになるのかがわかり...
-
C# WinForm のDataGridView Cel...
-
javaのrepaint()について
-
長方形を描いて、それを移動さ...
-
Javaでパラパラアニメを作成す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
Processingでマウスクリックで...
-
ボタンの複数割り当てについて
-
エンターキーを押すとOKボタン...
-
C# 矢印キーの取得
-
C# visibleプロパティをfalseに...
-
Thread.sleepのInterruptedExce...
-
C# DataGridView列カスタマイズ
-
C#でキーイベントが発生しない...
-
LVM_SETITEMSTATEでListViewの...
-
[C#.net]スレッド化された別フ...
-
GetDIBits関数の使い方について
-
C# 半角カナの文字化けについて
-
C# 親フォームで指定した値を...
-
javaアプレット repaintのタイ...
-
デスクトップマスコットのドラ...
-
C#で別のFormへ複数の値を返そ...
おすすめ情報