Javaにおける2Dゲーム描画設計 (ウィンドウとコンポーネント)
前回でImageクラスの描画を行うという話でしたが、Imageクラスの描画には下地となる、ウィンドウ、コンポーネントが必要になります。
階層をイメージるうとこのような感じとなります。

このイメージは1/9に説明した概念に基いた考えとなります。
では実際にどのように実装するか検討してみることにしましょう。ここではアプリケーション形式にて作成することを前提に説明したいと思います。
まず、Javaアプリケーションとして、プログラムインスタンスを生成する訳ですが、このプログラムインスタンスをウィンドウクラスから派生させます。
ウィンドウクラスはFrameというクラスが実現を行えるのですが、このFrameクラスはかなり使い勝手が悪いことと、OSのリソースを消費しやすいという理由から、ここではSwingコンポーネントであるJFrameクラスを用いて実現します。
(JFrameはFrameから派生したSwingコンポーネントクラスとなります)
プログラムインスタンスとウィンドウを作成する単純なコードは以下のようになります。
【単純なコーディング例】
まずはこれでウィンドウが表示されます。
ここでポイントとなるのは、ゲームのウィンドウのサイズを変更可能にするか不可能にするかということです。
もしも変更可能にすると、ゲーム中でもマウスにより大きさの変更ができるために、場合により影響が出てきます。
とりあえずここでは大きさは変更できないものとして設計を進めていきます。また、とりあえず今は200x200の画面サイズとして紹介します。
次にウィンドウ内のコンポーネントの作成です。このコンポーネントがゲームの本当の画面(1/9でも説明したようにウィンドウはあくまでも画面の外側となります)となり、ここにImageクラスの情報が描画されるようになります。
先程のソースを拡張してコンポーネントをウィンドウの中に収めてみましょう。
ここではソースファイルを分けて紹介します。
また、今後は徐々にプログラムサイズが大きくなっていくので、今迄紹介していったソースファイルを盛り付けたものを添付した形で紹介していくと思います。
【単純なコーディング例】
サンプルソース 2008.02.12
今回はコンポーネントであるJPanelクラスから派生させたMainScreenというクラスを作成しました。
このコンポーネントクラスをJFrameの派生であるGameクラスの中に追加した形となります。
ここまでの作成で、Imageクラスを描画するための土台が作成できました。
次回はこのコンポーネントクラスの中にImageクラスのビットマップを描画してみたいと思います。
階層をイメージるうとこのような感じとなります。

このイメージは1/9に説明した概念に基いた考えとなります。
では実際にどのように実装するか検討してみることにしましょう。ここではアプリケーション形式にて作成することを前提に説明したいと思います。
まず、Javaアプリケーションとして、プログラムインスタンスを生成する訳ですが、このプログラムインスタンスをウィンドウクラスから派生させます。
ウィンドウクラスはFrameというクラスが実現を行えるのですが、このFrameクラスはかなり使い勝手が悪いことと、OSのリソースを消費しやすいという理由から、ここではSwingコンポーネントであるJFrameクラスを用いて実現します。
(JFrameはFrameから派生したSwingコンポーネントクラスとなります)
プログラムインスタンスとウィンドウを作成する単純なコードは以下のようになります。
【単純なコーディング例】
import java.awt.*; import javax.swing.*; public class Game extends JFrame { /** * プログラムのエントリポイント * @param argvs プログラムの引数 */ public static void main(String[] argvs) { // インスタンス(ウィンドウ)を作成します Game game = new Game(); // ウィンドウの表示場所と大きさを設定します game.setBounds(100, 100, 200, 200); // ウィンドウの大きさを固定します game.setResizable(false); // ウィンドウを閉じたらプログラム終了とします game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // ウィンドウを表示させます game.setVisible(true); } } |
まずはこれでウィンドウが表示されます。
ここでポイントとなるのは、ゲームのウィンドウのサイズを変更可能にするか不可能にするかということです。
もしも変更可能にすると、ゲーム中でもマウスにより大きさの変更ができるために、場合により影響が出てきます。
とりあえずここでは大きさは変更できないものとして設計を進めていきます。また、とりあえず今は200x200の画面サイズとして紹介します。
次にウィンドウ内のコンポーネントの作成です。このコンポーネントがゲームの本当の画面(1/9でも説明したようにウィンドウはあくまでも画面の外側となります)となり、ここにImageクラスの情報が描画されるようになります。
先程のソースを拡張してコンポーネントをウィンドウの中に収めてみましょう。
ここではソースファイルを分けて紹介します。
また、今後は徐々にプログラムサイズが大きくなっていくので、今迄紹介していったソースファイルを盛り付けたものを添付した形で紹介していくと思います。
【単純なコーディング例】
[Game.java] import java.awt.*; import javax.swing.*; public class Game extends JFrame { /** * プログラムのエントリポイント * @param argvs プログラムの引数 */ public static void main(String[] argvs) { // インスタンス(ウィンドウ)を作成します Game game = new Game(); // ウィンドウの表示場所と大きさを設定します game.setBounds(100, 100, 200, 200); // ウィンドウの大きさを固定します game.setResizable(false); // ウィンドウを閉じたらプログラム終了とします game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // メインスクリーンをウィンドウに登録します MainScreen screen = new MainScreen(200, 200); game.getContentPane().add(screen, BorderLayout.CENTER); // コンポーネントを追加したので更新を行います game.getContentPane().validate(); // 内部コンポーネントの大きさにアジャストします game.pack(); // ウィンドウを表示させます game.setVisible(true); } } [MainScreen.java] import java.awt.*; import javax.swing.*; /** * メインスクリーン */ public class MainScreen extends JPanel { public Dimension m_screenSize = new Dimension(); /** * コンストラクタ * @param width スクリーン幅(単位ピクセル) * @param height スクリーン高さ(単位ピクセル) */ public MainScreen(int width, int height) { m_screenSize.width = width; m_screenSize.height = height; } /** * 推奨サイズイベント(上部で pack されたとき) * @return パックされた幅と高さ */ public Dimension getPreferredSize() { return new Dimension(m_screenSize.width, m_screenSize.height); } } |
サンプルソース 2008.02.12
今回はコンポーネントであるJPanelクラスから派生させたMainScreenというクラスを作成しました。
このコンポーネントクラスをJFrameの派生であるGameクラスの中に追加した形となります。
ここまでの作成で、Imageクラスを描画するための土台が作成できました。
次回はこのコンポーネントクラスの中にImageクラスのビットマップを描画してみたいと思います。
コメント
コメントの投稿
« 必要なツールの開発 l Home l 昔のゲームの想い出 [0015] 「フリスキートム」 [日本物産] [1981] [アーケード] »