この記事の例では、Swing に基づいて Java で実装された狩猟および射撃ゲームのコードについて説明します。皆さんの参考に共有してください。
具体的な実装コードは以下の通りです。
次のようにコードをコピーします。
パッケージゲーム;
java.awt.Graphicsをインポートします。
java.awt.Imageをインポートします。
javax.swing.JPanelをインポートします。
public class BackgroundPanel extends JPanel {
プライベート静的最終ロングシリアルバージョンUID = 1L;
private Image image;// 背景画像
public BackgroundPanel() {
setOpaque(false);
setLayout(null);
}
public void setImage(イメージ画像) {
this.image = 画像;
}
/**
*背景を描きます
*/
protected void PainComponent(グラフィックス g) {
if (画像 != null) {
//画像の幅
int width = getWidth();
// 画像の高さ
int 高さ = getHeight();
// 絵を描きます
g.drawImage(画像, 0, 0, 幅, 高さ, これ);
}
super.paintComponent(g);
}
}
次のようにコードをコピーします。
パッケージゲーム;
java.awt.Containerをインポートします。
インポート java.awt.event.*;
javax.swing.* をインポートします。
public class BirdLabel extends JLabelimplements Runnable {
プライベート静的最終ロングシリアルバージョンUID = 1L;
// スレッドのスリープ時間をランダムに生成、つまりバードの移動速度を制御します
private int sleepTime = (int) (Math.random() * 300) + 5;
プライベート int y = 100;
private Thread thread; // スレッドをメンバー変数として使用します。
プライベートコンテナの親。
private int core = 15;//このタイプのロールに対応するスコア
/**
※施工方法
*/
public BirdLabel() {
素晴らしい();
//鳥のアイコンオブジェクトを作成する
ImageIcon icon = new ImageIcon(getClass().getResource("bird.gif"));
setIcon(icon);//コントロールアイコンを設定します
addMouseListener(new MouseAction());//マウスイベントリスナーを追加
// コントロールイベントリスナーを追加
addComponentListener(new ComponentAction());
thread = new Thread(this);//スレッドオブジェクトを作成
}
/**
* コントロールのコントロールイベントリスナー
*/
プライベート最終クラス ComponentAction extends ComponentAdapter {
public voidComponentResize(final ComponentEvent e) {
thread.start();//スレッドの開始
}
}
/**
* コントロールのマウスイベントリスナー
*/
private Final class MouseAction extends MouseAdapter {
public void MousePress(final MouseEvent e) {
if (!MainFrame.readyAmmo())// 弾丸の準備ができていない場合
return;//何もしない
MainFrame.useAmmo(); // 弾丸を消費する
appScore(); // ボーナスポイント
destroy(); // このコンポーネントを破棄します
}
}
public void run() {
親 = null;
int幅 = 0;
試す {
while (幅 <= 0 || 親 == null) {
if (親 == null) {
parent = getParent(); // 親コンテナを取得します。
} それ以外 {
width =parent.getWidth(); // 親コンテナの幅を取得します。
}
Thread.sleep(10);
}
for (int i = width; i > 0 &&parent != null; i -= 8) {
setLocation(i, y);//このコンポーネントの位置を右から左に移動します
Thread.sleep(sleepTime);//しばらくスリープします
}
} catch (InterruptedException e) {
e.printStackTrace();
}
if (親 != null) {
MainFrame.appScore(-score * 10); // 自然破壊は減点となります。
}
destroy();// 移動が完了したら、このコンポーネントを破棄します
}
/**
※本コンポーネントを容器から取り出す方法
*/
public void destroy() {
if (親 == null)
戻る;
parent.remove(this);//このファイルを親コンテナから削除します
親.repaint();
parent = null; // このステートメントによるスレッド ループを終了します。
}
/**
※ポイントの加算方法
*/
private void appScore() {
System.out.println("鳥がぶつかった");
MainFrame.appScore(15);
}
}
次のようにコードをコピーします。
パッケージゲーム;
java.awt.Containerをインポートします。
インポート java.awt.event.*;
javax.swing.* をインポートします。
public class PigLabel extends JLabelimplements Runnable {
プライベート静的最終ロングシリアルバージョンUID = 1L;
// イノシシの移動速度である睡眠時間をランダムに生成します
private int sleepTime = (int) (Math.random() * 300) + 30;
private int y = 260;//コントロールの垂直座標
private int core = 10;//この文字に対応するスコア
private Thread スレッド; // 組み込みスレッド オブジェクト;
private Containerparent;//コントロールの親コンテナオブジェクト
/**
※施工方法
*/
public PigLabel() {
素晴らしい();
ImageIcon icon = new ImageIcon(getClass().getResource("pig.gif"));//イノシシの写真をロードする
setIcon(icon);//このコンポーネントのアイコンを設定します
//マウスイベントアダプターを追加
addMouseListener(new MouseAdapter() {
// マウスボタンの押下を処理する方法
public void MousePress(final MouseEvent e) {
if (!MainFrame.readyAmmo())
戻る;
MainFrame.useAmmo(); // 弾丸を消費する
appScore(); // ゲームにポイントを追加します
destroy(); // このコンポーネントを破棄します
}
});
//コンポーネントイベントアダプターを追加
addComponentListener(new ComponentAdapter() {
//コンポーネントのサイズを変更する場合
public voidComponentResize(final ComponentEvent e) {
thread.start();//スレッドを開始する
}
});
//スレッドオブジェクトを初期化する
スレッド = 新しいスレッド(この);
}
public void run() {
親 = null;
int幅 = 0;
while (width <= 0 ||parent == null) {//親コンテナの幅を取得します
if (親 == null)
親 = getParent();
それ以外
幅 = 親.getWidth();
}
// このコンポーネントを左から右に移動します
for (int i = 0; i < width &&parent != null; i += 8) {
setLocation(i, y);
試す {
Thread.sleep(sleepTime);//しばらくスリープします
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (親 != null) {
MainFrame.appScore(-score * 10); // 自然破壊は減点となります。
}
破壊する();
}
/**
※本コンポーネントを容器から取り出す方法
*/
public void destroy() {
if (親 == null)
戻る;
親.削除(これ);
親.repaint();
parent = null; // このステートメントによるスレッド ループを終了します。
}
/**
※ポイントの加算方法
*/
private void appScore() {
System.out.println("イノシシが襲われた");
MainFrame.appScore(10);
}
}
次のようにコードをコピーします。
パッケージゲーム;
静的 java.lang.Math.random をインポートします。
java.awt.* をインポートします。
インポート java.awt.event.*;
javax.swing.* をインポートします。
public class MainFrame extends JFrame {
プライベート静的最終ロングシリアルバージョンUID = 1L;
プライベート静的ロングスコア = 0;
private static Integer ammoNum = 5;//弾丸の数
private static JLabel スコアラベル;// スコア
プライベートBackgroundPanel背景パネル;
プライベート静的 JLabel ammoLabel;
プライベート静的 JPanel infoPane;
/**
※施工方法
*/
public MainFrame() {
素晴らしい();
setResizable(false);//フォームのサイズを調整する
setTitle("狩猟ゲーム");
infoPane = (JPanel) getGlassPane() // ガラスパネルを取得します。
JLabel label = new JLabel("Load箇条書き...");//プロンプトラベルコンポーネントを作成
label.sethorizontalAlignment(SwingConstants.CENTER);
label.setFont(new Font("楷体", Font.BOLD, 32));
label.setForeground(Color.RED);
infoPane.setLayout(new BorderLayout());
infoPane.add(label);//プロンプトラベルコンポーネントをガラスパネルに追加します
setAlwaysOnTop(true);//フォームはトップレベルに残ります
setBounds(100, 100, 573, 411);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
backgroundPanel = new BackgroundPanel(); // 背景のあるパネルを作成します。
背景パネル.setImage(new ImageIcon(getClass().getResource(
"background.jpg")).getImage());//背景画像を設定する
getContentPane().add(backgroundPanel, BorderLayout.CENTER);
//マウスイベントアダプターを追加
addMouseListener(new FrameMouseListener());
coreLabel = new JLabel() // スコアを表示するラベルコンポーネント
スコアラベル.sethorizontalAlignment(SwingConstants.CENTER);
スコアラベル.setForeground(Color.ORANGE);
スコアラベル.setText("スコア:");
スコアラベル.setBounds(25, 15, 120, 18);
背景パネル.add(スコアラベル);
ammoLabel = new JLabel(); // ラベルコンポーネントの自動数を表示します。
ammoLabel.setForeground(Color.ORANGE);
ammoLabel.sethorizontalAlignment(SwingConstants.RIGHT);
ammoLabel.setText("弾数: " + ammoNum);
ammoLabel.setBounds(422, 15, 93, 18);
背景パネル.add(弾薬ラベル);
}
/**
※加算ポイント方式
*/
public synchronized static void appScore(int num) {
スコア += 数値;
スコアLabel.setText("スコア: " + スコア);
}
/**
※弾丸の消費方法
*/
public synchronized static void useAmmo() {
同期済み (弾薬数) {
ammoNum--;// 弾丸の数を減らす
ammoLabel.setText("弾数: " + ammoNum);
if (ammoNum <= 0) {// 弾丸が 0 未満かどうかを判断します
new Thread(new Runnable() {
public void run() {
// プロンプト情報パネルを表示します
infoPane.setVisible(true);
試す {
// 弾丸のロードに 1 秒かかります
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ammoNum = 5;//弾丸の数を復元する
// 弾丸数量ラベルのテキストを変更します
ammoLabel.setText("弾数: " + ammoNum);
infoPane.setVisible(false);//プロンプト情報パネルを非表示にする
}
})。始める();
}
}
}
/**
* 弾丸が十分かどうかを判断する
*
*/
public synchronized static boolean readAmmo() {
同期済み (弾薬数) {
弾薬数 > 0 を返します。
}
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
試す {
MainFrame フレーム = new MainFrame();
フレーム.setVisible(true);
フレーム.スタート();
} catch (例外 e) {
e.printStackTrace();
}
}
});
}
/**
※ゲームの始め方
*/
public void start() {
新しい PigThread().start();
new BirdThread().start();
}
/**
* フォームのマウスイベントリスナー
*
*/
private Final class FrameMouseListener extends MouseAdapter {
public void MousePress(final MouseEvent e) {
コンポーネントの =backgroundPanel.getComponentAt(e.getPoint());
if (at instanceof BackgroundPanel) {//パネルをクリックすると、箇条書きも差し引かれます
MainFrame.useAmmo(); // 弾丸を消費する
}
/*
* if (BirdLabel のインスタンスで) {//birdMainFrame.appScore(32) をクリックした場合;//
* ボーナス ポイント} if (at instanceof PigLabel) {// イノシシがクリックされた場合
* MainFrame.appScore(11);//追加ポイント}
*/
}
}
/**
※豚キャラを生成するスレ
*
*/
class PigThread extends Thread {
@オーバーライド
public void run() {
while (true) {
//イノシシを表すラベル コントロールを作成します
PigLabel pig = new PigLabel();
pig.setSize(120, 80);//コントロールの初期サイズを設定します
backgroundPanel.add(pig);//背景パネルにコントロールを追加します
試す {
// スレッドは一定期間ランダムにスリープします
sleep((long) (random() * 3000) + 500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 鳥のキャラクターを生成するスレッド
*
*/
class BirdThread extends Thread {
@オーバーライド
public void run() {
while (true) {
//鳥を表すラベル コントロールを作成します
BirdLabel 鳥 = new BirdLabel();
bird.setSize(50, 50);//コントロールの初期サイズを設定します
backgroundPanel.add(bird);//背景パネルにコントロールを追加します
試す {
// スレッドは一定期間ランダムにスリープします
sleep((long) (Math.random() * 3000) + 500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
この記事が皆さんの Java プログラミングに役立つことを願っています。