記事のソース: Computer Enthusiast 著者: Zhang Jian
「ラスト・デイ」でエルフのようにハリウッドの交通を飛び回ったミニクーパーをまだ覚えていますか?マーク・ウォールバーグとサリー・セロンは、敵の目の前で数千万相当の金を輸送するために運転しました。しかし、もし今、速く走れないミニクーパーの車体が目の前に置かれたらどう思いますか?やはり放浪のエルフなのか?今日はこのミニクーパーのパーツを一つ一つ組み立てて走らせてみましょう。
序文
この号から、完全なゲーム ソース コードを提供します (クリックしてダウンロード)。 Java Cafe では、誰もが理論と実践に平等に注意を払うことを提唱しています。このシリーズでは、新聞を読みながらコーヒーを飲むのと同じように、記事と合わせてソース コードを読むことができます。ここではディディの香りが尽きません。
ゲームレイアウト
「Lianliankan」は 2 次元のチェス ゲームです。チェス ゲームをデザインしたい場合は、GridLayout が最適です。次に、GridLayout のコンストラクターを見てみましょう。
・GridLayout():デフォルトではレイアウト領域は1*1のサイズに分割されています
・GridLayout(int rows, intcols): レイアウト領域の縦横のグリッド数を指定します。
・GridLayout(int rows, intcols, int hgap, int vgap):上記と同様に、各グリッド間の水平方向の間隔 hgap と垂直方向の間隔 vgap を指定します
これら 3 つのコンストラクターを恐れる必要はありません。実際、気に入っている限り、どれも安心して使用できます。たとえ誤って「間違った」コンストラクターを使用したとしても、後で調整する方法があります。唯一注意すべき点は、GridLayout にコントロールを追加するときのデフォルトの順序は左上から右下であることです。
次に、ゲームのグリッドの数を決定しましょう。グリッドの数はいくつが適切ですか?少なすぎるとゲームの難易度が低くなり、多すぎると視覚的な影響が生じます。したがって、将来変更する場合でも、定数のペアで表現する必要があります。
Java では、定数の定義は public Final static の形式で記述する必要があります。ゲーム ボードに横 8 マス、縦 8 マスがあると規定する場合、次のように定義する必要があります。
パブリック最終静的整数ROW = 8;
パブリック最終静的 int COLUMN = 8;
次に、GridLayout の 2 番目のコンストラクターを使用してレイアウトを作成します。
GridLayout GridLayout = new GridLayout(ROW, COLUMN);
最後に、ゲーム領域 (contentPanel) のレイアウトを上記のレイアウトに変更する必要もあります。
contentPanel.setLayout(gridLayout);
この時点でプログラムをコンパイルして実行すると、「なぜインターフェイスに変更がないのか? 何か問題があるのではないか?」と疑問に思うかもしれません。レイアウトを指定しましたが、コントロールは追加されていないため、当然ながら変化は見られません。次に、レイアウトにボタンを追加しましょう。
for (int i = 0; i < ROW * COLUMN; i++) {
JButton ボタン = new JButton("キョダイ");
contentPanel.add(ボタン);
}
プログラムをもう一度実行してみてください (図 1 を参照)。
大騒ぎをするための JButton の賢い使い方
JButton は Swing の非常に一般的なコントロールでもありますが、JButton を使いこなせるようになると、他の Swing コントロールも見つかるようになるため、それを理解して使用するには少し努力する必要があります。もとても似ています。
作成したプログラムを実行すると、ゲーム領域のボタンが常にいっぱいになっていることがわかり、実際のゲーム操作には非常に不便です。そのため、いくつかのグリッドを解放する方法を見つける必要があります。 GridLayout レイアウトは問題ありませんが、コントロールを追加するときに特定のグリッドをスキップできません。どうすればよいですか?
実際、これは難しいことではありません。GridLayout ではスキップができないため、特定のグリッドに追加されたコントロールを GridLayout レイアウトの背景と統合すると、一貫した視覚効果が得られます。さらに、他の人がこのグリッドを誤ってクリックした場合でも、ボタンは表示されたままになります。ボタンがクリックされないようにする方法を見つける必要があります。これには、JButton の setEnabled() メソッドを使用する必要があります。最後に、クリック可能なボタンについては、クリックされたときに、どのボタンがクリックされたかを区別する必要があります。
前回「About」関数を実装したとき、e.getSource() メソッドを使用してマウス クリック イベントのソースを特定しましたが、これは名前付きコントロールに対してのみ有効でした。ここでは、配列を使用してボタンを表すことが間違いなく最良の方法です。まず、上記のコードを変更してみましょう。
JButton[] ドット = 新しい JButton[ROW * COLUMN];
for (int i = 0; i < ROW * COLUMN; i++) {
dots[i] = new JButton("キョダイ");
dots[i].setActionCommand("" + i);
contentPanel.add(dots[i]);
dots[i].addActionListener(this);
}
ループ本体に dots[i] = new JButton("Kyodai") を記述することを忘れないでください。ドット グループ番号は前に定義して使用しましたが、これはプログラムにいくつかの JButton を使用する必要があることを示すだけです。 JButton はまだ初期化されていません。同時に、setActionCommand()を使用してボタンのイベント名を指定するだけでなく、addActionListener()メソッドを使用して各ボタンにイベント応答処理を追加します。
イベント応答コードに関しては、元の actionPerformed() イベント コードの後に追加できます。
if (e.getSource() JButton のインスタンス) {
JButton ボタン = (JButton) e.getSource();
int offset = Integer.parseInt(button.getActionCommand());
int行、col;
row = Math.round(オフセット / COLUMN);
列 = オフセット - 行 * COLUMN;
JOptionPane.showMessageDialog(this, "ROW="+row+", COL="
+ 列、「ボタン」、JOptionPane.INFORMATION_MESSAGE);
}
上記のコードでは、JButton の e.getSource() インスタンスを使用して、生成されたイベントが JButton タイプのコントロールによって生成されたかどうかを判断し、イベント ソースを生成するコントロールに対して強制クラス変換を実行してから、Integer.parseInt(ボタン .getActionCommand()) メソッドは取得したイベント名を整数に変換し、次のコードはこの整数を行と列の情報に復元します。
さて、プログラムを実行して各ボタンをクリックして、右のようなダイアログ ボックスが表示されるかどうかを確認してください。
添字は 0 から始まることに注意してください。この号のプログラムのソース コード (クリックしてダウンロード)。
Swing での画像の使用
現在、ユーザーの操作上の問題は解決済みです。インターフェイスを美しくするには、テキストの代わりに画像を使用する必要があります。時間と忍耐力のある友人は、自分でパーソナライズされた写真を作成できますが、各写真のサイズを一定に保つように注意してください。そうしないと、見た目が悪くなりすぎます。手間を省きたい場合は、ダウンロード パッケージで提供される画像を直接使用することもできます。
Swing では、setIcon(Image image) メソッドを使用して JButton のイメージを設定できます。このオブジェクトを取得するには、次のようなさまざまな方法があります。
・Toolkit クラスを使用して以下を取得します。
画像 = Toolkit.getDefaultToolkit().getImage(url);
・ImageIconクラスのgetImage()メソッドを使用して以下を取得します。
画像 = 新しい ImageIcon(getClass().getResource(ファイル名)).getImage();
ここでは最初の方法を選択します。将来的に Image オブジェクトを再度取得しやすくするために、これを関数として書くことができます。
画像 getImage(String ファイル名){
URLClassLoader urlLoader = (URLClassLoader) this.getClass().getClassLoader();
URL URL = null;
画像画像 = null;
URL = urlLoader.findResource(ファイル名);
画像 = Toolkit.getDefaultToolkit().getImage(url);
画像を返す;
}
この機能があれば、今後画像を使うのがさらに便利になりますね。
画像が利用できるようになったので、ソース コード パッケージ内の Map.Java の地図情報を画像の形式で表現できます。このコードはゲームのアルゴリズム コードに関するものなので、ここではコードの説明は省略します。 Map.Javaでは、2次元配列map[][]を使用して画像情報を保存すると同時に、1次元配列images[]を使用してマップ内の各要素を保存します。この値は、ゲーム インターフェイスのボタンに対応する値を示すだけでなく、このボタンによって使用される images[] 配列内の画像の番号も示します。これにより、プログラム実行インターフェイスがより美しくなります。
まとめ
今日は、Swing の JButton コントロールを紹介しました。ほとんどの Swing コントロールでは、JButton の使用法をコピーできます。この JButton を過小評価しないでください。これを使いこなすことができれば、あなたの Swing スキルはさらに高いレベルに向上します。さらに、Java で画像ファイルをロードする 2 つの方法も学びました。最後に、上記の 2 つの部分を組み合わせて、美しいゲーム インターフェイスを作成しました。ここでは完全なコードを書いていませんが、私のソースプログラムを参照し、皆さん自身の努力で目的を達成できると思います。解決できない問題が発生した場合は、[email protected] までご連絡ください。
今日の内容に満足していただけたでしょうか?まだまだ盛り上がりは続きますが、皆様も引き続き当カフェをご愛顧くださいませ!