• ベストアンサー

JAVAでゲームを作ろうとしているのですが

Javaでシューティングゲームを作ろうとしています。 それで、敵や弾などのバリエーションを増やそうとすると たちまちクラスが増えていってしまいswitch文での分岐が多くなってしまいとても見通しがわるくなっています。 文化祭で出すため、他の人が編集するときに見やすくしたいのですが、 どうにもできません。何か良い方法を教えてください。 また、JARファイルで実行しようとしても"mainが見つかりません"と出てきてしまい途方に暮れています。 解凍してマニフェストファイルをみても他のJARファイルと何も変わっていないのに このゲームをJARファイルにすると作動しなくなるのです。(mainのあるクラスをJavaコマンドから実行すると普通に実行できます。) 何か良い解決策はないのでしょうか?

  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.2

質問者さんが「#1さんへのお礼欄」で書いた件について。 --- 敵機・弾などの"ゲームオブジェクト"クラス(※ゲームオブジェクトの種類)ごとに "インスタンス管理"クラスを作るとか。 (または各"ゲームオブジェクト"クラスの "staticな領域"(クラス変数・クラスメソッド)に、 "インスタンス管理機構"を作る方法もあるかも) interface InstanceManager { public GameObj generate(); public void destroy(); } //各実装 class EnemyAGenerator extends InstanceManager{ private LinkedList instancePool;//インスタンスプール ・・・ } --- そうすると、 ゲームオブジェクトの種類の数だけ、 「インスタンス管理」オブジェクトができるので、 これらの「管理」オブジェクトを、1つのListかMapにぶち込んで 一括管理すればいいのではないでしょうか。 --- プロのゲームプログラミングの現場で 一般にどうやってるのかは知りませんが・・・。 「プロのゲームプログラミングの現場でどうやってるのか」は、 C++のカテゴリで質問すれば回答がもらえるかもしれません。

hikider
質問者

お礼

ありがとうございました。そのような方法があるんですか。 ぜひやってみようと思います。

その他の回答 (1)

noname#49664
noname#49664
回答No.1

どのように設計しているのかによると思うのですが。 自分で作るとしたら、まず「敵」のインターフェイスを定義します。そこに、必要なメソッド(弾の弾道を計算するとか、弾の破壊力、敵の動きの軌跡計算など、敵の情報に関する全メソッド)を定義しておきます。そして、敵のクラスはすべてこのインターフェイスをimplementsして作成します。 これに加え、現在の敵の管理をするクラス、コントロールをするクラスを定義します。敵が発生したら敵管理クラスにaddするような設計をしておきます(敵管理クラスではコレクションで敵を保管しておくとかするでしょう)。そしてコントロールクラスでは、敵管理クラスから全敵のコレクションを取得して繰り返しで敵インスタンスを取得し、そのメソッドを呼び出して敵の移動や弾の弾道計算や自機との衝突などの処理をさせます。 基本は、繰り返しですべての種類の敵クラスを同じように処理する、ということでしょう。どのような敵クラスであっても、「このメソッドを呼び出せば次のステップに場所を移動する」「このメソッドを呼び出せば発射した弾がすべて次のステップに移動する」というように、呼び出すメソッドをインターフェイスで共通化できれば、敵の種類ごとに処理を分ける必要はありません。また、そのようにすれば、新たな敵クラスを定義するのも簡単でしょう。 >また、JARファイルで実行しようとしても"mainが見つかりません"と出てきてしまい途方に暮れています。 これは、単にマニフェストファイルのMain-Classの指定が間違っているということはありませんか。例えば、クラス名だけでパッケージ指定をしてない、とか。また、最後は改行してありますか? そのあたりを確認してみてください。

hikider
質問者

お礼

JARファイルの件については自己解決しました。 お騒がせしてしまいすいません。 設計については、Taskクラスという抽象クラスに初期化用のメゾットと移動,描画メゾットを抽象メゾットとして持たせて派生クラスをつくって、そこに敵,弾,自機などを実装しています。 そして、それらをまとめるタスク管理クラスをつくって、そこで配列を使いnewを一気にしてメモリを確保し、 使うときに初期化メゾットを使いその配列の部分をnullにし、戻すときはnullだった配列の部分に放り込むことでプールを実現しています。 そして、出したのをリストにまとめて移動,描画を行います。 この実装のデメリットが、派生クラスの種類が増えたりするとその分配列の初期化、使うときや返す時の処理が個別になってSwitch文が永遠と 続くような実装になってしまうということです。 また、タスク管理クラスはSingleTonにしていて他のタクス等(敵とか)からでもタクス(弾など)を生成できるようにしています。 なので,敵などのクラスが増えるとタスク管理クラスが膨れ上がってしまうのです。 やはりこれ以上楽な実装は無理なのでしょうか?

関連するQ&A

  • main()を持つクラスが2つ以上あるexecutable jar

    main()を持つクラスが2つ以上あるexecutable jar を作成して、 main()を持つクラスを 必要に応じて、起動仕分けることは 可能なのでしょうか? もし、可能であるとすれば マニフェストファイルには どのように記述すればよいのでしょうか? そして、 java -jar コマンドで起動するときにどのようにすればよいのでしょうか? 不可能であれば不可能であるということを 教えてください。 以上

    • ベストアンサー
    • Java
  • Javaの実行ファイルからjarを生成する方法を、わかりやすく教えてく

    Javaの実行ファイルからjarを生成する方法を、わかりやすく教えてくだされば。 現在JavaベースのRPG製作ソフトを作成しているのですが、製作ソフトから実行可能jar形式で実行プログラムを生成する方法を探しています。 jarファイルをzipと同じ形式で、META-INFなどのフォルダ、クラスファイル、マニフェストファイル、画像ファイルなどを出力すればいいと思うのですが、それよりもてっとりばやく簡単に作成する方法は無いのでしょうか。 あるいはjarにファイルを追加する簡単な方法とか...お願いします。

  • jarファイルのマニフェストについて

    JAVA初心者です。複数classをjarファイルにして実行する場合。マニフェストを登録すると、java -jarオプションで実行できると思いますが、それぞれのclassが別階層にあった場合メインクラスが見つからないとうエラーで実行できません。別階層にある場合はマニフェストは使えないのでしょうか。

    • ベストアンサー
    • Java
  • シェルからjavaを起動するバッチの圧縮について

    Linuxのシェルの中でjavaのクラスを起動します。その時に、引数(mainメソッドのstring args[])を渡します。 この場合、classファイルをjarにしたら引数を渡すことは可能ですか? classファイルはたくさんあるので、もし、jarファイルが無理なら他に可能な圧縮方法はあるでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • javaの実行環境

    javaの勉強をしようと思い、以下のhelloworldコードを書いてみました。 public class HelloWorld { public static void main(String[] args) { System.out.print("Hello World\n"); } } それを、以下のようにlinux環境(ubuntu 10.10)でコンパイル実行しようとしたのですが、 javac HelloWorld.java java HelloWorld.class Exception in thread "main" java.lang.NoClassDefFoundError: ・・・ と怒られてしまいました。そこで色々調べて jar cvmf manifest.mf test HelloWorld.class とjarファイルを作成して実行したところ、適切に"Hello World"が表示されました。 (manifest.mfの中身は"Main-Class: HelloWorld"1行だけです。) その後、このjarファイルをwindows環境に持っていって実行したのですが、 Exception in thread "main" java.lang.NoClassDefFoundError: ・・・ と怒られてしまいました。 linux環境で、"echo $CLASSPATH"を実行しても何も表示されず、CLASSPATHはどこにも通っていないようです。 また、windows環境のDOS画面にてSETを実行し、環境変数を表示させてもCLASSPATHはありませんでした。(javaはインストール済みです。) で、質問です。 1)なぜjarにすると実行でき、classファイルのままでは実行出来なかったのでしょうか? 2)windows環境で、CLASSPATHを設定したほうが良いのでしょうか?設定する場合は、prgramfiles\java\binで良いのでしょうか? 以上、長くなり申し訳ないのですが、よろしくお願いします。

    • ベストアンサー
    • Java
  • jarダブルクリックで実行できません

    自作のjarファイルだけがダブルクリックで実行できません。長い時間はまっております。お助けください。 javaアプリを配布するためにexeを作ろうと、まずjarファイルを作ってみました。 どんな状況かと申しますと ・他の方が作られたjarファイルはダブルクリックで実行可能です。 ・自作のjarファイルはダブルクリックで実行できません。 「could not find the main class: ○○ Program will exit」 ・自作のjarファイルはコマンドプロンプトの 「java -jar ○○.jar」で実行されます。 そこでお聞きしたいのが下記URLのゲームに関してです。 http://www.ipl.co.jp/item/JavaShootingGame.html 問題点を探るために、まず公開されているソースをコンパイルし、jarを生成しました。 マニフェストファイルには「Main-Class: Game」を改行付きで加え自作しました。 上記の自作jarのようにダブルクリックで実行できず、 コマンドで実行できます。 次に、公開されているjarを「xvf」コマンドで解凍するとdatファイルと 色々書かれたMANIFEST、 classファイルがでてきました。 ためしに、datを削除し、MANIFESTを自作のものに上書きしました。 これで上記と同条件のはずですが、これでつくったjarファイルは なんとダブルクリックで実行できます。 Classファイルを逆コンパイルしてソースを比べる。 Eclipseで生成する。 マニフェストにClass-Pathをあらゆるところに通してみる。 以上失敗しました。 この2週間こればかりで、正直気がめいりそうです。 対処法も尽きてしまいました。 どうかお助けください。

    • ベストアンサー
    • Java
  • jarを起動するとCould not find the main classと表示されます

    なかなかJavaの学習が進みません。助けてください。 Eclipse+VisualEditorでswtを利用したプロジェクトを作成しました。ウィンドウが表示されるだけの単純なものです。 Eclipse上では実行できます。 エクスポートメニューからJarファイル作成を選び、マニフェスト仕様のエントリーポイントのクラスにmainを含むクラスを指定し、jarファイルを作成しましたがダブルクリックで実行すると表題のエラーが出てしまいます。 過去の質問を参考にコマンドラインからもコンパイルして実行してみましたが、うまくいきませんでした。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=985334 アドバイスよろしくお願いします。

  • Exception in thread "main" java.…でも。

    Javaの初心者です。 仕事で他の方が作ったプログラムをいじることになりました。 あるclassファイルを実行しようとしたところ、javaコマンドで実行しようとしたところ、タイトルにあるように、Exception in thread "main" java.lang.NoClassDefFoundError:というエラーメッセジーが出ました。 いろいろ調べた結果、「:」以降に出てくる名前のクラスが見つからず、大半の場合は、CLASSPATHの指定がされていなかったり、まちがっていることが分かりました。 ただ、今回、表示されたのは、こんなクラス名なんです。 org/apache/bcel/generic/ATHROW bcel-5.1.jarというファイルはあるのですが、これをどこかに置いたら解決するものなのでしょうか? ためしに、実行しようとしたclassファイルと同じディレクトリに置いてましたが、何の効果もありませんでした。 もしお分かりになる方がいらっしゃいましたら、よろしくお願い致します。

    • ベストアンサー
    • Java
  • Javaが、、、

    こんにちわ。 SQL教科書に添付されていた教材のバッチを実行すると、 Java Virtual Machine Launcher Could not find the main class.Program will exit! と表示され、動きません。さらに対象となる実行ファイルを じかに動かそうと思い、実行させると、 Java Virtual Machine Launcher C:\squat-1.0.0\squat.jar と表示されこれまた動きません。 どなたかお分かりの方よろしくお願いします。

  • java.lang.outofmemoryerror java heap space

    java のクラスファイルをjarにして、実行する時、大きいなファイルを読むと、java.lang.outofmemoryerror java heap spaceのエラーが出できます。 どう解決すればいいですか。

    • ベストアンサー
    • Java

専門家に質問してみよう