3

私はゲームのような小さなヘビを書いていて、キーイベントリスナーを実装していたので、矢印キーが押されるとリッスンし、フレーム内の楕円の位置を増減します。以下は私のコードですが、何が起こっていると思いますか? 考えられる解決策をグーグルで調べてみましたが、空でした。

package snakegame;

import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;

/**
 *
 * @author PlaixHax0r
 */
public class SnakeGame extends JFrame{

    int x, y;

    public class ActionListener extends KeyAdapter{
        public void KeyPressed(KeyEvent a){

            int KeyCode = a.getKeyCode();

            if(KeyCode == KeyEvent.VK_RIGHT){
                x++;
            }

            if(KeyCode == KeyEvent.VK_LEFT){
                x--;
            }

            if(KeyCode == KeyEvent.VK_DOWN){
                y++;
            }

            if(KeyCode == KeyEvent.VK_UP){
                y--;
            }


        }

        public void KeyReleased(KeyEvent a){

        }

    }



    public SnakeGame(){
        addKeyListener(new ActionListener());
        setTitle("Snake 1.0");
        setVisible(true);
        setSize(500, 500);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        x=150;
        y=150;

    }

    public void paint(Graphics g){
        g.drawString("Welcome to Snake Empire", 180, 50);
        g.fillOval(x, y, 15, 15);

        repaint();
    }


    public static void main(String[] args) {
        new SnakeGame();

    }
}
4

3 に答える 3

11

いくつかの推奨事項:

  • JFrame に直接描画しないでください。paintComponent(...)描画チュートリアルを確認すると、JPanel または他の JComponent のメソッド オーバーライドで描画することがわかります。
  • あなたの最初の行paintComponent(...)は通常、スーパーのメソッドへの呼び出しです:super.paintComponent(g)
  • orrepaint()の中で呼び出さないでください。これは、制御されていないアニメーションを行うには不適切な方法です。paint(...)paintComponent(...)
  • 代わりにスイングタイマーを使用してください。
  • クラスにコア クラスと同じ名前を付けないでください。特に、必要に応じて実際の ActionListener を使用することがほぼ不可能になるため、ActionListener という名前を付けないでください。
  • KeyListeners は、リッスンするコンポーネントがフォーカス可能で、フォーカスがある場合にのみ機能します。
  • Swing アプリで KeyListeners を使用するのは避け、代わりに Key Bindings を使用してください。これについては、多くの例で何度も議論されているため、このサイトを検索してください。

Key Bindings Tutorialを見て、次に Key Bindings herehereを使用するための私のコード例を見てください。

于 2013-01-27T13:47:35.440 に答える
5

ホバークラフトで見られる問題に加えて、私が見ている問題は次のとおりです。

  • KeyListener (または KeyAdapter) メソッドをオーバーライドしていません。メソッドの名前KeyPressedは であり、Java ではメソッドは常に小文字で始まります。メソッドの名前はkeyPressed(). メソッドをオーバーライドする場合は、常に @Override アノテーションを使用してください。そうすれば、メソッド名にタイプミスがあるためにそうしないと、コンパイラ エラーが発生します。

     @Override
     public void keyPressed(KeyEvent event) {
         ...
     }
    
  • キーが押されたときに repaint() を呼び出していないので、Swing がフレームを再描画する理由はありません。

于 2013-01-27T13:50:51.220 に答える
4

ゲームは別のものです (フレームを表示するためにスイングを使用するものもあります)。これらはあなたのゲームの問題です。

  • repaint()内で呼び出していpaint()ます。実際に完了する前に、別のペイント イベントをスケジュールします。何度も呼び出すと、CPUがバーストします。keyPressed()楕円形を移動する必要がある場合は、メソッドの最後で repaint を呼び出すだけです。

  • タイミングを制御できませんでした。これにより、ゲームが高速なシステムでは高速に実行され、低速なシステムでは低速になるという状況が発生します。で検索してみてくださいgame loops

  • 多くのゲームは複数のスレッドを使用します。EDTCPU の占有を防ぎ、通常の速度で入力を検出できるようにするために、とは別の論理スレッド。

  • フレームに直接レンダリングすることは避けてください。アクティブ レンダリングが必要で、 を作成する場合にのみお勧めしますBufferStrategy(ただし、ペイント メソッドは使用しません)。

  • ダブルバッファリングを使用していません。ゲームがちらつく原因となります。

  • 入力状態でオブジェクトの位置を直接変更しないでください。オブジェクトが一定の間隔でのみ更新されるように、更新時に特定の速度を変更し、それらを位置に追加するだけです (負の速度も使用します)。

  • そして最後に を検索してみjava game development tutorialsます。ここには簡単なフレームワーク(チュートリアル)があり、主題への良い導入を提供します。(これはスネークゲームの例です)。

.NETJava の命名規則を取り除く(メソッド名を大文字で始める)

于 2013-01-27T14:17:39.283 に答える