2

YouTube ビデオの助けを借りずに最初のゲームを作ろうとしています。Java ゲームの作成に関する YouTube シリーズをたくさん見てきましたが、自分のやりたいことが見つからなかったので、十分に学んだ後、自分のゲームを作り始めました。私は Java を十分に理解しており、これまでのところすべて問題なく動作しています。

私はいくつかの助けを探してみましたが、人々が次の行に沿って何かを試していると言っている場所を見つけることができました:

setFocusable(true);
requestFocus();

しかし、これは私にとってはうまくいきませんでした。ほとんどの人が私のすべてのコードをただ見たいとは思わないことは知っていますが、それは扱いやすいと思います (まだそれほど多くのコードではありません)。

長くなる代わりに大きくなり、ヘビではなくモルモット (今のところオレンジ色の四角形で表されます) になる、一種のヘビのようなゲームにする予定です。

ゲーム.java:

package com.kaperly.game;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game extends JFrame {
    private static final long serialVersionUID = 1L;

    public static JFrame frame;
    public static JPanel panel;

    public static int width = 1000;
    public static int height = 600;

    public Game() {
        frame = new JFrame();
        panel = new Panel();

        frame.setPreferredSize(new Dimension(width, height));
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Guinea Pig Eat");
        frame.setLayout(new BorderLayout());
        frame.setVisible(true);
        panel.setFocusable(true);
        panel.requestFocus(true);

        frame.add(panel, BorderLayout.CENTER);
        frame.pack();
    }

    public static void init() {

    }

    public static void loop() throws InterruptedException { while(true) {
        Character.move();

        Thread.sleep(10);
    }}

    public static void main(String[] args) throws InterruptedException, IOException {
        Game game = new Game();

        init();
        loop();
    }
}

Panel.java:

package com.kaperly.game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;

public class Panel extends JPanel implements KeyListener {
    private static final long serialVersionUID = 1L;

    public static Image startButton;

    public static boolean goingRight = false;
    public static boolean goingLeft = false;
    public static boolean goingUp = false;
    public static boolean goingDown = false;

    private static int changeDirection = 0;

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_W) {
            goingUp = true;
            changeDirection = 1;
            System.out.println("Moved Up!");

        }else if(e.getKeyCode() == KeyEvent.VK_A) {
            goingLeft = true;
            changeDirection = 2;

        }else if(e.getKeyCode() == KeyEvent.VK_S) {
            goingDown = true;
            changeDirection = 3;

        }else if(e.getKeyCode() == KeyEvent.VK_D) {
            goingRight = true;
            changeDirection = 4;

        }else if(changeDirection == (1 | 2 | 3 | 4)) {
            changeDirection = 0;
            if(changeDirection == 1) {
                goingLeft = false;
                goingDown = false;
                goingRight = false;

            }else if(changeDirection == 2) {
                goingUp = false;
                goingDown = false;
                goingRight = false;

            }else if(changeDirection == 3) {
                goingUp = false;
                goingLeft = false;
                goingRight = false;

            }else if(changeDirection == 4) {
                goingUp = false;
                goingLeft = false;
                goingDown = false;
            }
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        //Set background color
        g.setColor(Color.GRAY);
        g.fillRect(0, 0, Game.width, Game.height);


        //Make Walls
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, Game.width, 25);
        g.fillRect(0, 550, Game.width, 25);
        g.fillRect(0, 0, 25, Game.height);
        g.fillRect(970, 0, 25, Game.height);

        //Show Character
        g.setColor(Color.ORANGE);
        g.fillRect(Character.x, Character.y, Character.width, Character.height);

        repaint();
    }
}

Character.java:

package com.kaperly.game;

public class Character {

    public static int x = 475;
    public static int y = 250;

    public static int width = 50;
    public static int height = 75;

    public static void move() {
        if(Panel.goingUp == true) {
            y = y ++;
        }
        if(Panel.goingLeft == true) {
            x = x --;
        }
        if(Panel.goingDown == true) {
            y = y --;
        }
        if(Panel.goingRight == true) {
            x = x ++;
        }
    }
}
4

3 に答える 3

3

KeyListener固有のフォーカス関連の問題があるため、避ける必要があります。何がコンポーネントからキーボード フォーカスを奪うのかはわかりません。

代わりに、キー イベントをトリガーするために必要なフォーカス レベルを制御できるKey Bindings API を利用してください。

Actionまた、他の場所でキーバインディングに関連付けられている基になるものを再利用することもできます...

クラスの名前をPanelより意味のある名前に変更することをお勧めします。AWT にはすでにPanelクラスがあり、この 2 つを混同するのは非常に簡単です。

于 2013-08-03T04:40:02.140 に答える
2

KeyListenerには 2 つの大きな問題があります。それらはすべてのキーにバインドされており、さらにコンポーネントはフォーカス可能でフォーカスされている必要がありますがJPanel、デフォルトではフォーカス可能ではありません。

requestFocussee the apiの使用を強くお勧めしません。

その代わりに、特定のキーをアクションにバインドするKeyBindingsを使用できます。

@camickr ブログに興味があるかもしれません。彼はこのMotion using the keyboard のようなスイング ユーティリティを投稿しています。

Panelまた、JPanel の親クラス名であるため、クラスを呼び出さないでください。混乱を招きます。

これを変える:

public class Game extends JFrame {

private JFrame frame;

}

public class Game {

private JFrame frame;
}

KeyListener別のことは、その使用の代わりにトップレベルクラスで実装しないanonymous classesか、単一責任の原則private classesに違反しています

于 2013-08-03T04:43:51.547 に答える
1

ゲームまたはパネル クラスのいずれかにキーリスナーを登録する必要があります。ドキュメントには次のように書かれています。

そのクラスから作成されたリスナー オブジェクトは、コンポーネントの addKeyListener メソッドを使用してコンポーネントに登録されます。キーが押される、離される、またはタイプされると、キーボード イベントが生成されます。次に、リスナー オブジェクト内の関連するメソッドが呼び出され、KeyEvent がそれに渡されます。

したがって、パネルでは次のことができます

  public Panel(){
        addKeyListener(this);
    } 

コードには他にも問題がありますが、これで入力が機能するはずです。

于 2013-08-03T04:17:33.780 に答える