シューティングゲームの作成 -Java プログラム版- 日付:2 月 1 日 所属:経営情報学部経営情報学科 学籍番号 名前:5107059 1 小山史弥 目次 第1章 はじめに…………………………………………………………………………… p.3 第2章 関連研究…………………………………………………………………………… p.5 第1節 Java プログラムについて.…………………………………………………. p.5 第2節 シューティングゲームについて…………………………………………… p.5 第3節 シューティングゲームのジャンル………………………………………… p.7 第3章 作成物の紹介……………………………………………………………………… p.12 第1節 アニマルシューティングの作成…………………………………………… p.11 第2節 アニマルシューティングゲームの概要…………………………………… p.12 第3節 アニマルシューティングゲームの詳細…………………………………… p.13 第4章 作成したゲームの特徴…………………………………………………………… p.19 第1節 当り判定……………………………………………………………………… p.19 第2節 キャラクタの動き…………………………………………………………… p.20 第5章 アプレット・アプリケーション両対応に工夫した点………………………… p.22 第6章 終りに(まとめ)………………………………………………………………… p.23 参考文献 謝辞 2 第1章 はじめに 近年、ゲーム機器は技術の発展に伴い多くのゲームが開発されている。昔のゲームは家 に友人を招き、皆で遊ぶのが当たり前であったが、近年ではゲーム機器のスペックが格段 に上がり、小型のゲーム機が多く販売されている。それに伴い、家の中だけではなく公園 や、飲食店など場所を選ばずゲームをすることができるようになった。また、電車の中で もゲームを行う者も多く見られることから、ゲームをする年齢層の幅はとても広いと言え る。ゲーム機だけでなく、現在では、パーソナルコンピュータを使いプログラムを組み込 むことで、誰でもゲームを作成し遊ぶことができる。また、現在では個人が無料で自作の プログラムなどをインターネット上で公開していることから、他人が作成したゲームで容 易に遊ぶことができる。このようなことから、ゲーム全体のレベルは上昇したが、シュー ティングゲーム(以下 STG)は以前に比べ衰退傾向であるとインターネット上で噂が流れ ている。なぜインターネット上で噂が流れているかというと、ゲームのアイディアが出尽 くし STG 自体がパターン化したこと、コアユーザであれば 100 円で長時間プレイするユー ザが増えゲームセンタの回転率が悪くなり集客率がとれなくなってきているからである。 このようなことから、ゲームセンタや娯楽施設などでは昔に比べ STG の設置台数を減らし ているのが現状である。それに加え 1990 年代は NEO-GEO やスーパーファミリーコンピ ュータのような昔のゲーム機器よりも高スペックなゲーム機器の発売によってユーザはゲ ームセンタや娯楽施設に行くよりも家に友人を招き大勢で遊ぶようになったのも要因の一 つである。また、ゲームセンタや娯楽施設などでは STG だけでなく音楽ゲームや格闘ゲー ム、パズルゲームといった別ジャンルのゲームが増加した。そして、STG 以外のジャンル ではゲーム自体に変化が加えられてきたが、STG は昔に比べグラフィック面だけの進歩で あり、革新的なシステム進歩などはまったくなかったことから、新規ユーザを獲得するこ とが難しくなった。また、STG 離れの原因としてもう 1 つ上げられるのはゲームの難易度 の上昇である。これにより、初心者ユーザは難しすぎて STG をプレイしなくなり広範囲な ユーザ層の獲得はできない悪循環が生まれ、いわゆるコアユーザだけに特化したゲームと なった。2000 年以降、パーソナルコンピュータの一般普及率が上がり、フリーゲームや同 人ゲームといった自作ゲームなどが普及した。また、従来の単調な STG ではなくキャラク タや物語を入れることにより、STG 自体に変化が生まれている。そして、ストーリ性の高 い同人ゲームなどの STG をアーケードゲームに移植することにより、少しずつ以前の活気 を取り戻している。 本論文では、参考書に掲載されている Java プログラムを使ったゲームプログラムを作成 する。今回、Java プログラムを用い STG を作成する多くあるプログラミング言語の中か ら、Java 選んだ理由として、Java 言語は初心者にも扱いやすい言語であるということ、 STG はミニゲームを作成するにあたって Java は他の言語よりも容易に作成することがで き、STG はサンプルが多く存在するからである。今回作成する STG は、3 ステージで構成 3 されており、各ステージの「敵」や「ボス」を倒すことでステージクリアという構成であ る。 第 2 章では STG や Java の関連研究について説明し、第 3 章では作成物の紹介と利用する プログラムについて説明し、第 4 章では実際に作成したプログラムの詳細を説明し、第 5 章ではゲームを作りにあたって工夫した点について説明し、第 6 章でこれからの課題やま とめ述べる。 4 第2章 関連研究 本章では STG のプログラムを作成することにあたって Java プログラムについての詳細 や STG 以外にどのようなゲームを作り出すことができるのかを説明し、STG についての特 徴、現在と昔の変化、STG のジャンルについて説明する。 第1節 Java プログラムについて Java とは米 Sun Microsystems Inc が開発したオブジェクト指向のプログラミング言語 である。特徴は「オブジェクト指向」を採用していた事である。オブジェクト指向を採用 することで、同様なプログラムを何度も作る必要がなくプログラムの「再利用性」が向上 する。Java が注目された理由は、この技術がグローバルな世界で育ってきたということで ある。米 Sun Microsystems Inc はインターネットと Java で作られたプログラムを使って、 さまざまな可能性を提示してきた。Java 言語の特徴は各種 OS 上に Java 仮想マシンを搭 載することができる。さらにアプレットすることで、Web アプリケーションの一部として ブラウザ上で動作することが可能となる。汎用性と機動性に優れ、最近では携帯電話等の 組み込み機器のプログラム実装にも利用されている。 第2節 シューティングゲームについて 1978 年に発売された「スペースインベーダ」は当時社会現象にまでなり、STG では最初 に、普及したゲームである。この「スペースインベーダ」をはじめ同系統の STG の特徴を 受け継ぎ、発展させたのが現在の STG である。 STG の最大の特徴は操作が簡単という事である。つまり、今まで、ゲームで遊んだこと のない人でも気軽に遊ぶことができる。また、 「単に攻撃を避けながら敵を倒し点数を競う」 という分かりやすいシステムのため、年代を問わず幅広い年齢層がプレイすることができ る。このシステムは、1978 年に発売されたアーケードゲームのスペースインベーダから始 まっており、現在もシステムはあまり変化していない。また、STG は様々な視点から見る ことでゲーム独自の世界観を作り出しユーザに楽しんでもらう工夫がされている。大きく 分けて以下 5 つのゲーム視点が存在する。 トップビュータイプ:トップビューは日本では 1978 年の頃から使用しているタイプ 画面を真上から見た状態で使用されている。 サイドビュータイプ:サイドビューはトップビュータイプの後に発表されたタイプ で 1983 年以降発表され画面を横向きでみている状態である。横向きの状態であるか ら敵だけではなくステージの地形にも注意する必要がある。 一人称視点:1974 年頃から発表され、海外で発表された視点である。視点は主人公 の目線で動いて自身もゲームの中の主人公になっている錯覚になる。 5 カメラ視点:1980 年代から発表された視点で、主人公を真後ろから見た視点で画面 の奥行きを楽しむことができるが距離が掴みにくいといった欠点もある。 三人称視点:1990 年頃から発表され一人称視点とは違い主人公の斜め上から見た視 点で主人公が常に見える位置から見ることができる。ゲームによって一人称視点と 三人称視点を自由に変えることができる。 このように多彩な視点を設けることで、リアル感や立体的にみさせる工夫をしており、1 本 1 本のゲームが別の視点などを持たせることで、ゲーム自体に特徴を持たせている。 図 1 単発の攻撃方法 図 2 斜めからの攻撃方法 出所)http://ascii.jp/elem/000/000/084/84246/ 出所) http://www.yidio.com/-area---1-pce/id/2775025903 6 図 4 爆弾を使った攻撃方法 図 3 レーザーでの攻撃方法 出所) 出所) http://search.zoome.jp/combine_tag?q=TAITO http://www.satakore.com/sega-saturngame,,T-20402G,,Strikers-1945-II-JPN 上記でも説明したように、見せ方などの工夫も多くみられるが、STG の基本的な部分で も昔と現在のものでは大きく変化している。例えば、攻撃方法である。STG の発表当時、 自機の主な攻撃方法は機体が向いている方向に前方方向に単発でしか発射するだけだった が(図 1 参照)、現在は直進するだけではなく機体が向いている方向に斜めや後方に発射し、 さらに連続発射することができる(図 2 参照)。また、パワーアップアイテムを入手する事 で自機から敵機に向かって追尾レーザーを発射する事ができ、 (図 3 参照)爆弾を使うこと で画面全体に攻撃をし、さらに敵機の攻撃が激しい場合に爆弾を使うと敵機の弾を消去す ることができ(図 4 参照)、発表当時に比べ進化していることがわかる。 第3節 シューティングゲームのジャンル STG は時代ごとに様々な種類があり次のような 6 つジャンルがある。 (1) 固定画面型 (2) スクロールシューティング (3) フライトシューティング (4) FPS (5) TPS (6) 弾幕系 以下この 6 ジャンルを順に説明する。 7 (1) 固定画面型 図 5 固定画面型 出所)http://dankai-j.jugem.jp/ 図 5 は 1978 年の STG 初期の形態である。画面の視点はトップビュータイプであり、 この時代は、小型化はできず主に娯楽施設や喫茶店などに設置されていた。この固定画 面型の特徴は画面が一切スクロールせず、自機も左右移動のみであり、移動の制限が大 きい。また、移動が制限されている理由は、自機の向きを固定することにより操作方法 を単純化するためである。他には自機が左右移動なのに敵機だけが自由に移動してしま うとプレイヤが不利になってしまう。逆の立場でも同様であり、プレイヤも面白く感じ ることができないからである。 (1) スクロールシューティング 図 7 横スクロール 図 6 縦スクロール 出所) 出所) http://spitfire.client.jp/shooting/chronology/chronology_ http://famicon.s348.xrea.com/entries/19860425_gradius/ 1983.html 図 6 と図 7 は 1980 年代以降から普及したジャンルである。このスクロール型の特徴は固 定画面型と違い画面が動いているため、従来よりもリアリティが増した。他にもステージ 8 ごとに画面の風景が変化する演出がスクロール型から始まった。移動方法は、固定画面型 ではできなかった上下の動きもできるようになったところで、様々な方向から来る敵機の 攻撃を避けることが可能となる。図 6 での視点は図 7 と同様でトップビュータイプである がスクロール効果によって固定画面型とは違い飛行機が動いている感覚になる。図 7 は他 の固定画面型やと縦スクロールとは違いサイドビュー視点となるため、横から見た視点で あるため、固定画面型や縦スクロールには表現することができなかった障害物や敵機の上 下からの攻撃からも回避することも考えなければならない。 (2) フライトシューティング フライトシューティングとは、STG の中でも自由度が非常に高いジャンルである。プレ 図 8 フライトシューティング 出所)http://www.iphone-quality.com/apps/fast/# イヤは戦闘機などの 3D ポリゴンを使用し、上下 360 度自由に空間移動が可能なゲームで ある。視点は一人称視点やカメラ視点のどの複数の視点を選択することができる。この視 点により、より実機に近い操作をすることが可能となった。360 度自由に空間移動できるた め、操作方法が難しく、敵機からの攻撃も様々な角度からあり、操作性がとても難しいジ ャンルである。 (3) FPS (First Person Shooting) 図 9 FPS(First Person Shooting) 出所)http://norich20.blog46.fc2.com/blog-entry-55.html 9 図 10 カメラ視点 図 11 一人称視点 出所)http://001love.blog64.fc2.com/page-1.html 出所)http://www.iphone-quality.com/apps/fast/# FPS は一人称視点でキャラクタの姿が見えない状態で主人公の視点が 3D となり画面に 映る。それにより自身が本当に体験しているかのような臨場感がある。この FPS は STG の中でも一人称視点のみであるため、オンラインゲームの要素が強く、近年 FPS のオンラ インゲームが多く発売されている。また、この FPS は主人公になりきって操作することが できるため、オンラインゲームなどのチーム戦などが多い傾向にある。また、チーム戦が メインのため、今までの STG のジャンルとは違うスタイルになり、人気が非常に高い。こ のような理由からオンラインとして人気が出たと推測される。このジャンルの難しいとこ ろは敵の攻撃の当り判定だ。図 10 だと飛行機の範囲、図 11 だと画面全体が当り判定にな っている。視点が一人称視点とカメラ視点では当り判定の判別が難しい。カメラ視点だと 画面全体とキャラクタの大きさが確認でき回避しやすいのだが、一人称視点だと画面がコ ックピットからの視点となるため、当り判定が画面全体となるため判別しにくい。 このジャンルの特徴は長時間で FPS をプレイし続けると FPS 症候群という病気が発生す る可能性が出てくる。症状は FPS を何時間でもプレイし続けることで現実での行動に大き な影響が出てきてゲームの中と同じような動きをしてしまう。初期の状態だと改善の余地 があるのだが、重症になるにつれてだんだんと悪い方向へ進んでしまう。最終的には現実 の世界とゲームの世界が混雑してしまい区別がつかなくなってしまい、治る確率が非常に 少なくなってしまう[1]。 TPS (Third Person Shooting Game) 図 12 TPS (Third Person )Shooting Game) 出所)http://yamyan.blog24.fc2.com/category83-3.html 10 TPS は三人称視点で主人公を操作するゲームタイプである。TPS の特徴は FPS と違いキ ャラクタの動作が分かりやすいため操作が楽である。FPS と同じ所は主人公が人間で、銃 器を使って敵と戦い、ジャンプといった多彩なアクションが多いだが、FPS とは異なる点 が多々存在する。それは、TPS の場合主人公の姿が見え、ただ撃つだけでなく射撃から着 弾まで予測をしなければならないといった技術が必要である。他にも、FPS は複数人数で 行うに対し TPS は 1 人でじっくり遊ぶタイプが多く、今までの STG には無い機能もある。 それは、敵を倒し事で主人公が成長していくといった RPG の要素もこの TPS にはある。 弾幕系 STG 図 13 弾幕系 STG 出所) http://huyuoru.yukishigure.com/naka-2.htm 弾幕系 STG は 1997 年以降発表された。メーカーで発表されている作品はいくつかある が、多くの作品は自作の同人ゲームやフリーゲームといったインディーズとして発表され ている。弾幕系の特徴は敵機が発射する無数の弾を回避しながら敵機を倒す所にある。そ の他に今までの STG に比べ敵機の出現数は少なくなっているが、敵機が放つ弾は今までの 倍以上の数が飛んでくる。また弾のスピードは従来の STG に比べ少し遅く設定されている ため大量の弾が連続で発射されると画面上に幾何学模様他になることもある(図 13 参照)。 11 第3章 第1節 作成物の紹介 アニマルシューティングの作成 ネズミやニワトリ、カエルなどが敵キャラクタとして出現するアニマルシューティング ゲームを作成した。本ゲームは縦スクロールシューティングゲームの一種であり、倒した 敵の数でスコアが決まる。本ゲームは Java プログラミングで作成した。ステージは 3 つ用 意し、ボスキャラを倒すとゲーム終了となる。操作は基本キーボードを利用し、攻撃や移 動を行う。 図 14 ステージ画面 第2節 図 15 ニワトリとネズミ出現 図 16 カエル出現 アニマルシューティングゲームプログラムの概要 アニマルシューティングゲームのプログラム構成をクラス図として図 14 に示す。main メソッドのあるクラスは Stg クラスであり、また Stg クラスの親クラスである Game2D ク ラスの init()メソッドには MainLoop クラスを生成する処理が含まれる。MainLoop クラス は Thread クラスを継承し、run()メソッドの中で終了ボタンが押されるまで無限ループす る処理がある。これによってゲームが常時動き続ける事が出来る。 もうひとつの中心となるクラスは GameObject クラスである。このクラスはすべての敵 オブジェクトを管理する目的で作成された。すなわち、様々な種類の敵は GameObjects ク ラスから継承された GameObject クラスで生成され、さらに敵の中のそれぞれの特徴に応 じて Enemy1 や Enemy2、Bigenemy1、EnemyTangue 等のさまざまなクラスが用意され ている。今後新しい敵キャラクタを作成するには、GameObject から継承し、さらに似た敵 キャラクタクラスを継承した新しいクラスをつくることで容易に実現できる。 12 図 17 アニマルシュミレーションゲームのクラス図 第3節 アニマルシューティングゲームプログラムの詳細 本節ではプログラムの一部について説明する。説明するクラスは Sprite クラス、 MainLoop クラス、Stg クラス、敵キャラクタの一つの BigEnemy1 クラス、主人公キャラ クタの Own クラスをそれぞれ紹介する。 (1) Sprite クラス 1: Public boolean addgrp(int no,String file) { 2: if(getClass().getResource(file) == null) { 3: information(“Error : Do not find [“ + file + “].”, null); 4: return false; 5: } 6: try { 7: grp.put(new Tnteger(no), 8: Toolkit.getDefaultToolkit() 9: 10: .getImage(getClass().getResouce(file))); } catch (Exception e) { 11: information(“Warning : Do not create image data.”, e); 12: return false; 13 : } 14 : tracker.addImage((Image)(grp.get(new Integer(no))), 1); 15 : 16 : return true; } 図 18 Sprite クラスの画像を読み込むコード 13 図 20 スプライト失敗例 図 19 スプライト成功例 Sprite クラスでは、複数の画像を重なりを考え、画像を奥から順に並べ画像を自由に移動 する事が出来る条がシステムの事である。スプライトの概念はセル画によるアニメーショ ンの画像構成手法をコンピュータ画面上で実現するものである。スプライト描画はためた 部品を透明なプレーン上に配置し、すべて重ね合わせることでゲーム画面が構成される(図 16 参照)。キャラクタを移動させる場合にはプレーンを動かし、キャラクタを消去する場合 プレーンを抜き取り、キャラクタを変更する場合プレーンの画像を入れ替え、アニメーシ ョンの様に動かしたい場合プレーンの画像を入れ替えることで画面を変更させることが出 来る。 プログラムでは図 15 の tracker.addImage((Image)(grp.get(new Integer(no))), 1);の 1 行で実 現する。tracher 変数は java.awt.MediaTracker から生成されたオブジェクトであり、 addImage()メソッドを実行することで複数のイメージファイルのスプライト処理を実行す ることができる。 (2) MainLoop クラス MainLoop クラスでは、Thresd クラスを継承し run()メソッドの中に while の無限ルー プを作成する(図 18 参照)。この無限ループがシューティングゲームが動作し続ける要の ループとなる。また、無限ル-ぷの中では、Game2DMain クラスの MainLoop()メソッド を呼び出す。これは敵キャラクタやゲームの状況を判定するためのメソッドである。さら に repaint()メソッドは画面の再描画であり、画面の行使を行う。本ループは CPU の最大 限の資源を活用してループし続け、他の処理ができないプログラムとなってしまう。 14 1: public void run() { 2: long processTime = 0; 3: while(!threadStoped) { 4: try { 5: procssTime = System.currentTimeMillis(); 6: gm.mainLoop(): 7: repaint(); 8: processTime = System.currentTimeMillis() – processTime; 9: if(SPEED – processTime < 0) 10: infomation(“Warning : Processing delay in MainLoop.”, 11: null); 12: else 13: sleep(SPEED – processTime); 14: while(threadSuspended && !threadStoperd) 15: yield(); 図 21 Game2DMain クラスと MainLoop クラス内のメソッドについて (3) Stg クラス Stg クラスは本ゲームの main()メソッドを持つクラスである。すなわち、本ゲームはこ のクラスにより開始される。ただし、java アプリケーションとしての本来の main クラス は Stg クラスの内部クラスである StgMain クラスで詳細な初期設定や GUI の初期設定を 実行する。その初期設定としてシーケンスデータの読み込み処理を図 20 に示し、本処理に おいて読み込まれたシーケンスデータで生成された画面を図 21 に示す。 1: sprite.setPlaneView(2002,false); 2: dos,addGOOwn(“Own”, CANVAS_SIZE_W / 2 - 16,300,1000); 3: mode = 1; 4: openSequence(“stage” + mode + “.txt”); 5: str = “Stage: “ + mode; 6: sprite.setPlaneString(2002,str); 7: sprite.setPlanePos(2002, 100, 200); 8: sprite.setPlaneColoe(2002,255, 255, 255); 9: mainLoopCount = 0; 10: break; 図 22 シーケンスデータから**.txt を読み込むためコード 15 図 23 シーケンスデータで読み込まれたステージ画面 シーケンスデータはテキストファイルで作成されており、ステージに応じた画面の構造 や敵キャラの位置や種類が定義されている。これらを読み高初期設定を行い、ゲーム開始 状態へ展開するのが Stg クラスの役割である。 (4) BigEnemy1 クラス 図 24 敵機の特徴 敵キャラクタは様々な種類があるが、その内の BigEnemy1 クラスを紹介する。このクラ スはボスのひとつであり、MiddleEnemy1 から継承された。つまり、中ボスから継承され たラストボスの一つである(図 27 参照)。BigEnemy1 クラスのコードの一部を図 28 に示 す。 16 1: class BigEnemy1 extends MidleEnemy1 { 2: public void move() { 3: if(attribute != ENEMY) 4: beDestroyed(4, 3); 5: else { 6: advent(128, 50); 7: 8: if((int)(Math.random() * 10) == 0) { 9: gos.addGO("EnemyMissile", sprite.getPlanePosX(plnNo) + 55, 10: sprite.getPlanePosY(plnNo) + 56, targetPlnNo); 11: gos.addGO("EnemyMissile", sprite.getPlanePosX(plnNo) + 65, 12: sprite.getPlanePosY(plnNo) + 56, targetPlnNo); 13: } 14: } 15: 16 : } } 図 25「BigEnemy1 の移動処理」 Big1 Enemy1 の移動は基本的にランダム関数によって方向が決定されている。つまり、 右か左、または上か下はランダムに決められている。ただし、ダメージが一定上大きくな ると beDestroyed()メソッドにて敵キャラクタが消滅する。また、ダメージに応じて移動速 度も変化する。 図 26 自機の特徴(左) 図 27 自機の特徴(右) 17 図 28 自機の特徴(中心) 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: case KeyEvent.VK_DOWN: if(d && sprite.getPlanePosY(plnNo) < 400 - 32 - 8) { sprite.setPlaneMov(plnNo, 0, 8); d = false; } break; case KeyEvent.VK_UP: if(u && sprite.getPlanePosY(plnNo) > 8) { sprite.setPlaneMov(plnNo, 0, -8); u = false; } break; case KeyEvent.VK_RIGHT: if(r && sprite.getPlanePosX(plnNo) < 300 - 32 - 8) { sprite.setPlaneMov(plnNo, 8, 0); r = false; } break; case KeyEvent.VK_LEFT: if(l && sprite.getPlanePosX(plnNo) > 8) { sprite.setPlaneMov(plnNo, -8, 0); l = false; } break; case KeyEvent.VK_SPACE: if(s) { gos.addGO("OwnBow", sprite.getPlanePosX(plnNo), sprite.getPlanePosY(plnNo) - 16, 0); s = false; } break; } 図 29 入力出力装置を使った自機の操作 (5) Own クラス 主人公キャラクタクラスである。敵キャラクタクラスとの大きな違いは、ゲームユーザ が実際にキャラクタの移動や攻撃などの操作ができることである。図 23 に示したプログラ ムが Own クラスの moveInputs()メソッドの一部である。ゲームユーザのキーボード操作 の押されたキーによって、キャラクタの動作がそれぞれ変化する。例えば、左矢印キーが 押されたならば、キャラクタの x 軸方向の座標位置が減算される。その結果、図 24 に示す ようにキャラクタが右へ移動する。さらに、ゲームユーザがスペースキーを押すと gos_addGO()メソッドが呼び出され、OwnBow クラスへと引き継がれる。OwnBow クラス では実際に攻撃を行うクラスであり、主人公のキャラクタから攻撃の黄色い線が発射され る。 18 第4章 第1節 作成したゲームの特徴 当り判定 当り判定はキャラクタごとに占有領域があり、それを表現するために GameObject クラ ス内にある int 変数を使った「hitX、hitY、hitW、hitH」を用意し高さ、幅、座標を設定 する。図 29 に Own クラスの 4 つの値をセットした例を示す。キャラクタの画像が生じさ れる際に sprite.setPlaneGrp と sprite.setPlanePos に記録させ、基準の位置からずれた位 置をまた基準にし、幅と高さの領域を修正する。この当り判定は味方機か敵機化をするこ とができ、味方機と敵機共に味方機が発射する弾についてはあまり考えることはないので、 処理することは味方機と敵機の衝突または弾による衝突についてと敵機と味方機と衝突し た場合である。もしくは味方機が発射した衝突の場合を処理する。 衝突と判断されるのは各キャラクタにある占有領域が重なっているかどうかは GameObject クラスの hitcheckOwnBow()メソッドで判断される。 1: class Own extends GameObject { 2: int count = 0, explosion = -1; 3: int last = 5; 4: 5: public Own(int plnNo, Sprite sprite, Queue keyQ, int x, int y, 6: GameObjects gos, int targetPlnNo) { 7: super(plnNo, sprite, keyQ, x, y, gos, targetPlnNo); 8: attribute = NO_HIT; 9: sprite.setPlaneGrp(plnNo, 0, 12); 10: sprite.setPlanePos(plnNo, x, y); 11: hitX = 10; hitY = 12; 12: 13: hitW = 12; hitH = 21; } 図 30 自機を表現する Own クラスのソースコード 図 31 hitcheckOwnBow による衝突判定 図 32 hitcheckOwnBow による衝突判定 19 1: if(Math.abs(sprite.getPlanePosX(ownGo.plnNo) 2: + ownGo.hitX + ownGo.hitW / 2 3: - sprite.getPlanePosX(go.plnNo) - go.hitX - go.hitW / 2) 4: < (ownGo.hitW + go.hitW) / 2 5: && Math.abs(sprite.getPlanePosY(ownGo.plnNo) 6: + ownGo.hitY + ownGo.hitH / 2 7: - sprite.getPlanePosY(go.plnNo) - go.hitY - go.hitH / 2) 8: < (ownGo.hitH + go.hitH) / 2) { 図 33 2つの矩刑領域の重なりのソースコード もしもお互いの優先領域が重なった場合は衝突と判断され味方機は破壊される(図 31 参照)。 図 32 のソースコードは 2 行目から 4 行目までは味方機が X 軸方向に対して衝突する条件を 満たす。また同様に 6 行目から 8 行目までは味方機と敵機が Y 軸方向に対して衝突する条 件を満たしている。最後に真ん中 5 行目にある条件は互いに重なっている条件を満たして いる。最後に衝突の判定を終えてもまだすることがある。検出されると状況に応じて処理 を行う。キャラクタはダメージを与え、衝突された場合は各キャラクタにそれぞれの move メソッドの通りの処理を行う。 第2節 1: キャラクタの動き public void move() { 2: if(attribute != ENEMY) { 3: if(count == 0) 4: for(int j = 0; j < tonguesLength; j++) 5: gos.delGO(tongues[j]); 6: 7: beDestroyed(4, 3); } else { 8: advent(128, 50); 9: if(tongues == null) { 10: tongues = new int[tonguesLength]; 11: for(int j = 0; j < tonguesLength; j++) 12: tongues[j] = gos.addGO("EnemyTongue", 13: sprite.getPlanePosX(plnNo) + 48, 14: j * 12 + sprite.getPlanePosY(plnNo) + 80, plnNo); 15: } 16: if(tongueCount / 40 % 2 == 0) { 17: for(int i = 0; i < tonguesLength; i++) 18: sprite.setPlanePos(tongues[i], 19: (int)(Math.sin(i * 12. + tongueCount) * 27.) 20: + sprite.getPlanePosX(plnNo) + 48, 21: 22: i * 12 + sprite.getPlanePosY(plnNo) + 80); } else { 23: int j = tongueCount % 40; 24: if(j == 10) { 25: tongueTargetX = sprite.getPlanePosX(targetPlnNo) + 16; 26: tongueTargetY = sprite.getPlanePosY(targetPlnNo) + 16; 27: } 図 34 BigEnemy3 クラス内の EnemyTongue の move メソッド 20 味方機はプレイヤの操作によって動きが決まるが敵機や弾といった味方機以外のキャラ クタは自動で動く move メソッドに基づいて動く。例えば、ボスキャラクタの一つであるカ エルの動きを図 33 に示す。 このキャラクタは元々別々のキャラクタで、本体のカエルだけだと今までとあまり変わ らないが、もう 1 つの gif データである(舌)が加わることで 1 体の敵が完成する。この敵 はオブジェクトが複数集まって表現している。この 2 つのクラスは GameObjects クラスの 中に納まっており BIgEnemy3 クラス(カエル)のオブジェクトは敵が弾を発射するのと同 様に EnemyTongue クラス(舌)を弾代わりにして発射している。(舌)は plnNO を配列 tongues に記録させた後弾を発射した場合は主人公キャラクタがいる位置に届くまで(舌) の部品を生成し常にプレイヤを狙っている。図 35 の通り(舌)のクラスは、行動するため の move メソッドの中身が空のため、(舌)単体では行動することができない。その代り、 カエルのクラスの中に(舌)を動かす move メソッドを組み込んでいるからカエルと合体し た形となり(舌)も行動することができる。 21 第4章 考察 本ゲームでは、Stg クラスと StgMain クラスに分けた所が大きな特徴である。つまり、 Java アプリケーションとして main()メソッドから起動もするし、ブラウザ上でアプレット 図 35 アプレットとアプリケーション両対応 として動作も可能である。もし、2 種類のソフトを作成するとほぼ 2 倍の労力を必要とする が Stg クラスの継承元である Game2D クラスが Applet クラスを継承しているので、main() メソッドを利用した Java アプリケーション以外にもアプレットとして起動も可能となる [2](図 35 参照)。 22 第5章 まとめ 今回の Java 言語を用いてミニゲーム形式の STG を作成し、ゲームの Java プログラミン グ構造についての知識を獲得した。本ゲームのクラス設計は Java アプレットと Java アプ リケーションが汎用的に起動できるように設計されており、さらに多くの敵キャラクタは 継承を中心とした設計を行い、様々な敵キャラクタのそれぞれの特性を容易に実装できる ように工夫されている事が分かった。 今後は STG の動向を観察しながら、魅力の高い STG プログラムをつくることを目指す。 参考文献 [1] 「FPS 症候群について語ろうよ(まとめ) 」 http://www22.atwiki.jp/fps-syndrome/pages/8.html [2] 第 2 版 Java ゲームプログラミング 発行所: ソフトバンク アルゴリズムとフレームワーク 著者: 長久勝 クリエイティブ株式会社 謝辞 同ゼミでともに励んだ奥野貴弘氏に感謝します。同ゼミでともに励んだ管貴将氏に 感謝します。同ゼミでともに励んだ小藪瑠璃氏に感謝します。同ゼミでともに柴田洋 佑氏に感謝します。同ゼミでともに励んだ杉木亜友美氏に感謝します。同ゼミでとも に励んだ筒井亮氏に感謝します。同ゼミでともに励んだ西井裕亮氏に感謝します。同 ゼミでともに励んだ西川裕平氏に感謝します。同ゼミでともに励んだ福本昌生氏に感 謝します。同ゼミでともに励んだ増田大輝氏に感謝します。同ゼミでともに励んだ三 好正広氏に感謝します。同ゼミでともに励んだ室屋貴則氏に感謝します。同ゼミでと もに励んだ山岡大介氏に感謝します。卒業論文のチーム分けのとき何時元のゼミへ戻 るかわからないのにチームに誘ってくれた小宮陽介氏に感謝します。共に深夜遅くま で励ましアドバイスをくれた澤竹潤一郎氏に感謝します。卒業論文の書き方について アドバイスをしてもらい研究室のノートパソコンを準備してくれた仙田友久氏に感謝 します。卒論マラソンの時研究室で缶詰状態のとき、夜食として牛丼(大盛り)を差 し入れてくれた尾花将輝氏に感謝します。卒論マラソンの時期日まで間に合わないこ とがわかったとき、本人も忙しいのに先生の代わりに卒論の添削やアドバイスをして くれた金光大貴氏に感謝します。そして最後に3回生の相手や御自身の仕事をしなけ ればならないのに、添削やアドバイスをして頂いた花川典子教授に心から感謝いたし ます。 23
© Copyright 2024 Paperzz