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クラスのビットマップを描画してみたいと思います。
昔のゲームの想い出 [0015] 「フリスキートム」 [日本物産] [1981] [アーケード]
《初エロゲープレー!(爆)》
フリスキートムは貯水タンクから配水管を通して浴槽にお湯を一杯溜めて、女性をお風呂に入れるという面クリアタイプのアクションゲームです。
配水管は画面一杯に入り組んだ迷路のような配管となっており、敵であるネズミがウロウロしています。ネズミは定期的に配管を噛み切ってしまい、お湯の流れを止めに入るので、自機はこの噛み切られたパイプを取り、噛み切られた配管を修復するといった内容となります。
難易度としては恐しい程の高難易度で、当時の私は2面をなんとかクリアできたるかできないか…というような状況でした。
正直、ネズミの攻撃は避けられるとかいうレベルではなく、自機がインベーダーの砲台並の移動速度に対して、上からギャプラスのPARSEC31の敵並にボディスラムをかまして降ってくる…という、「知らない人は一体どんなゲームだよ!」と思わせるような難易度でした。
そんな高難易度に対して死ぬ気で頑張ってお湯を張りきると、まるでご褒美のように「女性が泡のお湯に入るシーン」が画面一杯に表示されます。
当時この画面を見た時に私の目が画面に「釘付け & 超赤面状態」になってしまいました(爆)
「TVゲームでこんな表現が許されるのかっ!?」と、しかもこのシーン、泡が時間と共に徐々に消えていくではありませんか!
結局シーンが終了する頃には色々と見えてしまっており、一緒にゲームセンターに来ていた友人も「オマエ、や~らしぃ!」と無責任な発言を浴せてきました。そして、正直、こっちもどうして良いものか分らない状況となり、初見の時はプレー中にも関わらず、その場を去って行くことになりました。
こうして、半分トラウマのような状況のまま、私の初エロゲー体験が終るのでありました。(いいすぎ(笑))
しかしながら、このように『現代の「萌え」とは一味違った「エロス」』をTVゲームで一早く感じることができた経験というのは貴重なひとときだったと思っています。
◇ ◇ ◇
このゲームは翌年に「LSIゲーム FLフリスキートム」としてコンシューマー向けに発売しているのですが、アーケードのゲームバランスのソレとはうって変って、もの凄くバランスが良く、以前紹介したペンゴ同様、かなりの良移植に成功しています。しかもエロ度は低いものの、女性がキチンと風呂に入るフィーチャーなどまで完全移植しており、当時の私は大満足でプレーしたものです。
(ちなみに2008年の現在、私の手元で現役で動いています。今プレーしても正直良作と思う程、良くできています)

このゲームは本当に面白い!

クリアすると女性がお風呂に…(´д`;ハアハア
フリスキートムは貯水タンクから配水管を通して浴槽にお湯を一杯溜めて、女性をお風呂に入れるという面クリアタイプのアクションゲームです。
配水管は画面一杯に入り組んだ迷路のような配管となっており、敵であるネズミがウロウロしています。ネズミは定期的に配管を噛み切ってしまい、お湯の流れを止めに入るので、自機はこの噛み切られたパイプを取り、噛み切られた配管を修復するといった内容となります。
難易度としては恐しい程の高難易度で、当時の私は2面をなんとかクリアできたるかできないか…というような状況でした。
正直、ネズミの攻撃は避けられるとかいうレベルではなく、自機がインベーダーの砲台並の移動速度に対して、上からギャプラスのPARSEC31の敵並にボディスラムをかまして降ってくる…という、「知らない人は一体どんなゲームだよ!」と思わせるような難易度でした。
そんな高難易度に対して死ぬ気で頑張ってお湯を張りきると、まるでご褒美のように「女性が泡のお湯に入るシーン」が画面一杯に表示されます。
当時この画面を見た時に私の目が画面に「釘付け & 超赤面状態」になってしまいました(爆)
「TVゲームでこんな表現が許されるのかっ!?」と、しかもこのシーン、泡が時間と共に徐々に消えていくではありませんか!
結局シーンが終了する頃には色々と見えてしまっており、一緒にゲームセンターに来ていた友人も「オマエ、や~らしぃ!」と無責任な発言を浴せてきました。そして、正直、こっちもどうして良いものか分らない状況となり、初見の時はプレー中にも関わらず、その場を去って行くことになりました。
こうして、半分トラウマのような状況のまま、私の初エロゲー体験が終るのでありました。(いいすぎ(笑))
しかしながら、このように『現代の「萌え」とは一味違った「エロス」』をTVゲームで一早く感じることができた経験というのは貴重なひとときだったと思っています。
このゲームは翌年に「LSIゲーム FLフリスキートム」としてコンシューマー向けに発売しているのですが、アーケードのゲームバランスのソレとはうって変って、もの凄くバランスが良く、以前紹介したペンゴ同様、かなりの良移植に成功しています。しかもエロ度は低いものの、女性がキチンと風呂に入るフィーチャーなどまで完全移植しており、当時の私は大満足でプレーしたものです。
(ちなみに2008年の現在、私の手元で現役で動いています。今プレーしても正直良作と思う程、良くできています)

このゲームは本当に面白い!

クリアすると女性がお風呂に…(´д`;ハアハア
| HOME |