電子書籍の厳選無料作品が豊富!

JFrameを使ってノベルゲームを制作しています。
機能としてJFrameをリサイズできるようにしたいと思っています。
方法としては二つあると思ってます
(1)ベースとなる構築された画面をイメージとして扱い、それを伸縮してJFrameにあわせる。
(2)JFrameに合わせて画面のパーツの大きさをそれぞれ設定し構築していく。

(2)の方法だと縦横比が崩れたときの処理をぱっとは思いつかない(ノベルゲームなのですが、文が出るパネルが縦横比の崩れた変化をすると文字がはみ出たりする恐れがある気が・・)ので、(1)の方法をとりたいと思っています。

不可視のJFrame(以後BufferFrame)をつくり、そこでコンポーネントなどを貼り付けたりしておく。BufferFrameのImageオブジェクトを取得し、基盤クラス(JFrameを継承)のdrawImage(略)で伸縮して張り付けることによって実現できるかなと思いましたが、肝心なImageオブジェクトの取得の方法が分かりません。

createImage(int, int)というメソッドかなと思ったのですがうまくいきませんでした。


質問としては、「ゲーム画面のリサイズ処理としてこれが正しいのか」というのと正しいならば、「具体的にどのようにそれを実現すれば良いのか」という二点です。

もし分かる方がいらっしゃればご教示願います。

A 回答 (2件)

要するに、JFrameのWindow内の表示をImageとして取り出せないか、ということでしょうか。



JFrame自体は内部的にオフスクリーンバッファに表示イメージを描画していますので、どこかにイメージデータは保持しているとは思いますが、残念ながらそれを簡単に取り出すメソッドやフィールドなどは用意されていません。ですので、簡単に取り出す方法はありません。

どうしてもというなら、Robotクラスを使ってWindow内のイメージをキャプチャーする、という荒業はあります。こんな感じですね。

Robot robot = new Robot();
Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage bufferedImage = robot.createScreenCapture(captureSize);

ただ、意味がないと思いますが。既に表示の各部品をコンポーネント化し、それぞれでリサイズに対応するように設計できているようですから、それが正しいアプローチだと思います。せっかくコンポーネント化されたものを全体でひとまとめに扱うというのは、コンポーネント化に反する無意味なアプローチのように思えます。
    • good
    • 0

要するに、Imageをファイルから作成する方法、ということですか。

いろいろやりかたはありますが、私の場合はImageIO.readを使うやり方が一番てっとり早くて楽ですね。例えばこんな感じです。

BufferedImage img = ImageIO.read(new File("image.png"));

>ゲーム画面のリサイズ処理としてこれが正しいのか

これは、それぞれの設計の仕方によるでしょうから、、これが正しいというものはないように思いますよ。ただ、Swingなどは部品のコンポーネント化が進められていて、それぞれのコンポーネントごとに独立して扱えるようにするのが基本だろうと思います。

ですから、イメージを利用するにしても、画面全体を1枚の絵で貼り付けるより、例えば「メニューのパネル」「ゲームシーンのパネル」「メッセージの表示パネル」というように画面に表示される部品ごとにコンポーネント化して、それぞれの中でリサイズ時の処理などを実装していくと良いと主ますよ。

この回答への補足

回答ありがとうございます。
説明下手ですみません。ファイルからImageを作成する方法ではなく、JFrameに表示されている(みえている)画面からImageを作成する方法があるかどうかが分からないのです。

指南してくださった各コンポーネントでリサイズの処理をする・・ はたった今なんとかできました!そういう意味ではリサイズは出来るようになったわけですが、もともと目指していたのとはちょっと違います。

具体的な話をすると、背景を表示させるパネルや、メッセージを表示するパネル(JFrameの上に乗ってる子JPanel)をJFrame上に乗せて画面を構築させてます。その関係を保ったままリサイズをしたいと思っていました。例えば横にびよーんと画面を伸ばしたら画面内のパネルや文字も全部びよーんと横に歪み平ぺったくなる、という処理です。それを実現するためには文字やパネルなどの全てをイメージとして扱うことができれば手っ取り早いと思ったのです。

リサイズは出来るようになったのでこんな質問は必要ないと思われるかもしれませんが、
もしよろしければその点についてご教示願います。

補足日時:2014/05/17 19:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!