2012年11月19日
Javaで2Dアクションゲーム
皆さんこんばんは^^
予告通りJavaで2Dアクションゲームを作る際の描画処理について書いていきたいと思います。
Javaでゲームを作るというのは今の時代だいぶましになってきたみたいですね。
いろんな方のHPを拝見させてもらいましたが、昔はとても苦労されていたみたいです。
さて、一言でゲームと言ってもとても多くの種類があります。
シミュレーションRPGのように再描画の回数が比較的多くないものから
アクションゲームのようにFPS60は欲しいゲームまで。
ほとんどのゲームはJava2Dと言われるJavaに標準搭載されてる描画処理で事足ります。
そして、Java2Dでのゲームについては多くのサンプルがあり、
とてもわかりやすいJavaでゲーム作りますが何か?様のHPがかなりお勧めです。
ただ、自分もそうだったのですがエフェクトが多くて、キャラクターが高速移動する
アクションゲームではどうしても処理が重たくなってしまいます。
自分は
CPU i7-2600
メモリ 12GB
GPU CPU内臓
という環境でエフェクトなどない状態でもFPSが80しかでなくて、
さらに学校のPCでは目を疑うFPSが6という状態でした(^_^;)
これほど遅い原因はやはりJavaが仮想マシンで動作しているからでしょう。
C言語などではハードの力を使えるので、画像の加工も速いです。
でもJavaではハードの力を存分に使用することはできません。
また、いろいろ調べてみると
JavaではGraphicsによって画像を合成することで背景とキャラクターを描画しますが、
このGraphicsでの処理がなかなか重たいらしい。
それってどうしようもないじゃないか、と思っていたところ
興味深い記事を見かけました。
それはスプライトという技法です。(技法って言っていいのかな?)
知ってる人からすれば「何をそんな常識を今更・・・」って思われるかもしれません。
でもゲームを作り始めたばかりではそんなことも知らないのです。
ゲームでキャラクターの位置を変える場合
Java2Dでは背景で塗りつぶして移動させた位置にキャラクターを描画するものでした。
これでは何も変わっていないところが無駄でしかありません。
これに対して、スプライトの考えでは
画像を合成するのではなく、背景とキャラクターを別々のパーツとして、
背景の上にキャラクターを乗せることで描画します。
位置の移動もキャラクターを移動させるだけで背景で塗り直しはしないで済みます。
さて、ようやく本題ですが、Java2Dではスプライト的描画はありません。
(もしかしたら可能なのかもしれませんが、調べても見つかりませんでした。)
では、どうやってスプライトをするのか?
それは簡単です。OpenGLを用いてポリゴンによるスプライトをするのです。
OpenGLとポリゴンと聞くとJava2Dよりも重たくなりそうな気がしますよね?
でもこれが違います。何故ならOpenGLを使うということは、
Java2Dではできなかったハードの力を使うことができるのです!
また、ポリゴンも直方体ではなく、平べったい板状のものを使用すれば重たくもないです。
つまり、なんちゃって2Dです笑
3D空間を使用するけど描画は完全に2Dってことです。
JavaでOpenGLを使うことで高速に処理ができるとは言いましたが
どうやってOpenGLを使うのかが次の問題になりますね。
JavaでのOpenGLではJOGLとLWJGLという2つが有名みたいです。
自分はLWJGLを使用することにしました。
それは、桃缶食べたい。様のブログがとてもわかりやすかったのが大きいです^^
ただ、やはり3D中心の内容なので、単純に2Dの高速描画を求めるにはちと処理が複雑で
難しかったです。それでも解説は詳しく説明されてるので一度は読んでみることをお勧めします。
そういうわけなのでこれからLWJGLを用いた2D描画についての記事を書いていきたいと思います。
自分もOpenGLについては完全に素人なので備忘録な感じで行くかもしれませんw
ちなみに、Java2DでFPS80だったゲームはLWJGLでまったく同じ処理を書いたところ
FPSが400出てましたww 5倍ですw
これでOpenGLの方が速いこともわかりましたw
次回は導入方法でも書こうと思います。
予告通りJavaで2Dアクションゲームを作る際の描画処理について書いていきたいと思います。
Javaでゲームを作るというのは今の時代だいぶましになってきたみたいですね。
いろんな方のHPを拝見させてもらいましたが、昔はとても苦労されていたみたいです。
さて、一言でゲームと言ってもとても多くの種類があります。
シミュレーションRPGのように再描画の回数が比較的多くないものから
アクションゲームのようにFPS60は欲しいゲームまで。
ほとんどのゲームはJava2Dと言われるJavaに標準搭載されてる描画処理で事足ります。
そして、Java2Dでのゲームについては多くのサンプルがあり、
とてもわかりやすいJavaでゲーム作りますが何か?様のHPがかなりお勧めです。
ただ、自分もそうだったのですがエフェクトが多くて、キャラクターが高速移動する
アクションゲームではどうしても処理が重たくなってしまいます。
自分は
CPU i7-2600
メモリ 12GB
GPU CPU内臓
という環境でエフェクトなどない状態でもFPSが80しかでなくて、
さらに学校のPCでは目を疑うFPSが6という状態でした(^_^;)
これほど遅い原因はやはりJavaが仮想マシンで動作しているからでしょう。
C言語などではハードの力を使えるので、画像の加工も速いです。
でもJavaではハードの力を存分に使用することはできません。
また、いろいろ調べてみると
JavaではGraphicsによって画像を合成することで背景とキャラクターを描画しますが、
このGraphicsでの処理がなかなか重たいらしい。
それってどうしようもないじゃないか、と思っていたところ
興味深い記事を見かけました。
それはスプライトという技法です。(技法って言っていいのかな?)
知ってる人からすれば「何をそんな常識を今更・・・」って思われるかもしれません。
でもゲームを作り始めたばかりではそんなことも知らないのです。
ゲームでキャラクターの位置を変える場合
Java2Dでは背景で塗りつぶして移動させた位置にキャラクターを描画するものでした。
これでは何も変わっていないところが無駄でしかありません。
これに対して、スプライトの考えでは
画像を合成するのではなく、背景とキャラクターを別々のパーツとして、
背景の上にキャラクターを乗せることで描画します。
位置の移動もキャラクターを移動させるだけで背景で塗り直しはしないで済みます。
さて、ようやく本題ですが、Java2Dではスプライト的描画はありません。
(もしかしたら可能なのかもしれませんが、調べても見つかりませんでした。)
では、どうやってスプライトをするのか?
それは簡単です。OpenGLを用いてポリゴンによるスプライトをするのです。
OpenGLとポリゴンと聞くとJava2Dよりも重たくなりそうな気がしますよね?
でもこれが違います。何故ならOpenGLを使うということは、
Java2Dではできなかったハードの力を使うことができるのです!
また、ポリゴンも直方体ではなく、平べったい板状のものを使用すれば重たくもないです。
つまり、なんちゃって2Dです笑
3D空間を使用するけど描画は完全に2Dってことです。
JavaでOpenGLを使うことで高速に処理ができるとは言いましたが
どうやってOpenGLを使うのかが次の問題になりますね。
JavaでのOpenGLではJOGLとLWJGLという2つが有名みたいです。
自分はLWJGLを使用することにしました。
それは、桃缶食べたい。様のブログがとてもわかりやすかったのが大きいです^^
ただ、やはり3D中心の内容なので、単純に2Dの高速描画を求めるにはちと処理が複雑で
難しかったです。それでも解説は詳しく説明されてるので一度は読んでみることをお勧めします。
そういうわけなのでこれからLWJGLを用いた2D描画についての記事を書いていきたいと思います。
自分もOpenGLについては完全に素人なので備忘録な感じで行くかもしれませんw
ちなみに、Java2DでFPS80だったゲームはLWJGLでまったく同じ処理を書いたところ
FPSが400出てましたww 5倍ですw
これでOpenGLの方が速いこともわかりましたw
次回は導入方法でも書こうと思います。
【Javaアクションゲームの最新記事】
投稿者:Sert|23:04|Javaアクションゲーム
この記事へのコメント