- 「シューティングゲームの作り方/自作:自機のショットとビーム」のご紹介
- 「シューティングゲームの作り方/自作:自機のショットとビーム」のご紹介
- ショットとビームの仕組み
- 「シューティングゲームの作り方/自作」関連ページのご紹介
- シューティングゲーム・関連ページのご紹介
- 歴代名作シューティングゲームのご紹介|まとめ
- 歴代シューティングゲーム全ゲームタイトル一覧のご紹介|まとめ
- シューティングゲームの人気シリーズのご紹介
- シューティングゲーム関連ページのご紹介|まとめ
- シューティングゲーム解説ページのご紹介|まとめ
- シューティングゲーム・ハード関連(周辺機器)のご紹介|まとめ
- シューティングゲーム雑誌/書籍関連のご紹介|まとめ
- 【TPS名作・傑作・まとめ】TPS傑作・名作・全ゲームタイトルのご紹介│まとめ│~トゥームレイダー│バイオハザード│アンチャーテッドなど~
- 【名作RPG】RPGのご紹介│まとめ│
- 【TOP:SLG】おすすめ名作シミュレーションゲームのご紹介
- 【TOP】レースゲーム関連(おすすめ名作・評価ランキン)のご紹介
- TOP【おすすめスポーツゲーム】のご紹介~MLB,NBA,NFL,FIFAなど~
- 【TOP】パズルゲームのご紹介
- 【ゲームランキング】世界・国内で最も売れたゲームランキングのご紹介
- 名作ゲームのご紹介│まとめ│家庭用ゲーム・PC・アーケードなど
- 【機種別ゲームTOP】PC・家庭用・アーケードゲーム・周辺機器のご紹介
- ジャンル別ゲームタイトルのご紹介│まとめ│
- 【ゲームTOP】ゲーム関連ページのご紹介
- 【書籍・雑誌TOP】書籍・雑誌サイトマップ関連ページのご紹介
- 【ホビーTOP】ホビーサイトマップ関連ページのご紹介
「シューティングゲームの作り方/自作:自機のショットとビーム」のご紹介
「シューティングゲームの作り方/自作」関連サイトマップのご紹介
「シューティングゲームの作り方/自作」関連をご紹介します。
シューティングゲーム | ゲーム | 中古・新品通販の駿河屋
「シューティングゲームの作り方/自作:自機のショットとビーム」のご紹介
自機を動かすことができたら、制作をもう一歩進めましょう。次に何を作るのかはお好みしだいですが、今回はショットとビームが発射できるようにしたいと思います。
ケイブ作品で有名なショットとビームを組み合わせた「セミオート連射」
ショットとビームを組み合わせた攻撃方法で
- ボタンをリズミカルに叩くと途切れずにショットが出る
- ボタンを押しっぱなしにするとパワーがたまり、十分にたまるとビームが出る
というものが90年代のシューティングゲーム作品に登場します。
これはいわゆるセミオート連射の発展型です。セミオート連射では、ボタンを本気で連射しなくても、ある程度の速さで連射しているだけで、高速にショットを連射することができます。それに加えて、ボタンを押しっぱなしにしたときにビームを発射できるようにしたのが、この方式です。この方式を採用したゲームとしては、「首領蜂」や「怒首領蜂」をはじめとするケイブの作品が有名です。
ショットとビームを使い分け
この方式を採用した多くの作品では、ショットよりもビームの方が攻撃力が高くなっています。また、ビームを発射している間には自機の移動速度が遅くなります。そのため、以下のようにショットとビームを使い分けるのが一般的です。
ショットの特徴
攻撃力は弱めだが、自機の移動速度が速く、攻撃が広範囲に広がるため、小さくて軟らかいザコ敵などを一掃するために使います。
ビームの特徴
自機の移動速度が遅く、攻撃範囲は狭いが、攻撃力が高いため、弾幕を細かく避けながら大型のボスなどを削るために使います。
攻撃に特徴を持たせて使い分けが楽しくなるようなゲームデザイン
このようにショットとビームの特性を変えて、さらに自機の移動速度にも変化をつけることによって、攻撃を使い分ける楽しさが生まれます。ショットとビームにかぎらず、複数の攻撃手段を用意する時には、それぞれの攻撃に特徴を持たせて、使い分けが楽しくなるようなゲームデザインを心がけるとよいでしょう。
ショットとビームの仕組み
「パワー」「ゲージ」という変数を使って、ショットとビームの切り替えを制御する
ショットとビームは、「図.4-12〜14」のように実現します。「パワー」と「ゲージ」という2つの変数を使って、ショットとビームの切り替えを制御します。
▼「図.4-12:ショットの発射方法」
▼「図.4-13:ショットの停止方法」
▼「図.4-13:ビームの発射方法」
「パワー」ビームを出すかどうかを判定用
「パワー」はビームを出すかどうかを判定するために使います。ボタンを押し続けているとパワーは増加し、ボタンを離すとパワーは減少します。パワーが定数「BeamMinPower」よりも大きくなると、ビームが発射されます。
「ゲージ」はショットを連射用
「ゲージ」はショットを連射するために使います。ボタンを押すとゲージは定数「ShotMaxGauge」になり、ボタンを離すとゲージは減少します。ゲージが一定値以上(ここでは1以上)の間は、ショットが発射されます。
ショットとビームの動き
ボタンを一定以上の速さで連射していると、ゲージが1以上に保たれるため、ショットが連射できます。ボタンを押しっぱなしにすると、パワーがたまるまではショットが出ますが、パワーがたまるとビームに変わります。
ショット連射中にボタンを離すと、少し連射が続いてから停止します。一方、ビーム発射中にボタンを離すと、ビームは即座に停止します。
ショットとビームを加えたプログラムのクラス構成
「図.4-15ショットとビームを加えたプログラムのクラス構成」は、ショットとビームを加えたプログラムのクラス構成です。ショットとビームを実現するために、ショットクラス(Shotとビームクラス(CBeam)を新たに作成しました。そして、既存のクラスも拡張します。
ショットクラスとビームクラスは、移動物体クラス(CMover)の派生クラス
ショットクラスとビームクラスは、自機クラス(CMyShip)と同様に、移動物体クラス(CMover)の派生クラスです。これらのクラスは、ショットやビームを表示するために、メッシュクラス(CMesh)を利用します。
▼「図.4-15ショットとビームを加えたプログラムのクラス構成」
自機にショットやビームを撃たせる
ショットやビームの密度を調整
ショットやビームを撃つには、自機の移動処理にショットやビームの発射処理を追加します。
1フレームごとにショットやビームを発射すると、ショットやビームの密度が高くなりすぎることがあります。その場合は、4フレームに1発や2フレームに1発といった具合に、数フレームおきに発射することによって、密度を調整することができます。
▼名作STG「レイストーム」でもメイン/サブショットによって攻撃力の密度を調整しています。
「自機:攻撃力単位時間(ショット1発が出るまでの時間)」 | ||
自機 | ショット | 時間 |
R-GRAY1 | メイン | 3/60sec |
サブ | 6/60sec | |
R-GRAY2 | メイン | 1/60sec |
「プログラム4-11:自機のクラス(MyShip.h、MyShip.cpp)<」は、自機クラス(CMyShip)にショットおよびビームを撃つ処理を追加したものです。
▼プログラム4-11:自機のクラス(MyShip.h、MyShip.cpp)
//自機のクラス //ショットとビームに関する変数や関数を追加 classCMyShip:publicCMover{ protected: //ショットのゲージと待機時間 intShotGauge,ShotTime; //ビームのパワーと待機時間 intBeamPower,BeamTime; //ショット、ビームの発射 voidShot(); voidBeam(); //ビームの消去 voidDeleteBeam(); //...(m)... }; //コンストラクタ //ショットとビームに関する変数を初期化 CMyShip::CMyShip(floatx,floaty) CMover(Game->MyShipList,x,y,MYSHIP_Z),Roll(0), ShotGauge(0),ShotTime(0),BeamPower(0),BeamTime(0) {} //移動 boolCMyShip::Move() { //...(中略)... //ビームのパワーとショットのゲージ staticconstintBeamMinPower=15,ShotMaxGauge=15; //ショットとビームの待機時間 staticconstintMaxShotTime=4,MaxBeamTime=2; //ショットとビームの発射 if(is->Button[0]){ //パワーが足りないとき:ショットを発射 if(BeamPower<BeamMinPower) { BeamPower++; ShotGaugeShotMaxGauge; if(ShotTime==0)Shot(); } //パワーが足りているとき:ビームを発射 else{ ShotGauge=0; if(BeamTime==0)Beam(); //ビーム発射中はスピードを遅くする vx*=0.5f; vy*=0.5f; } } else{ //ボタンを離したときビームを消す DeleteBeam(); BeamPower=0; //ゲージが残っているとき:ショットを発射 if(ShotGauge>0){ if(ShotTime==0)Shot(); ShotGauge--; } } //ショットとビームの待機時間を更新 //待機時間は数フレームおきに発射するために使用 ShotTime=(ShotTime+1)%MaxShotTime; BeamTime=(BeamTime+1)%MaxBeamTime; //(中略)... }
ショットを飛ばす
ショットを飛ばすには、まず発射方向と速さを決めます。そしてsin関数やcos関数を用いて、速度のX成分とY成分を計算します。
ショットの移動や描画の処理
自機と同様に、ショットに関しても移動や描画の処理が必要です。移動はフレームごとに行います。計算した速度を座標に加算することによって、座標を更新します。また、ショットの発射音も再生すると迫力が増すでしょう。
画面外飛び出したショットを消す
ショットが画面外に飛び出してしまったら、ショットを消去しなければなりません。ショットの座標と画面端の座標を比べて、ショットが画面外に出たかどうかを判定します「図.4-16移動物体が画面外に出たかどうかを判定する」。
▼「図.4-16移動物体が画面外に出たかどうかを判定する」
ショットが画面から出たことを検出する方法
ショットの中心からX軸方向またはY軸方向の端までの長さを、ここではショットのサイズとします。サイズをショットよりも少し大きめにとっておき、「図.4-16移動物体が画面外に出たかどうかを判定する」のような条件式で座標を判定すれば、ショットが完全に画面から出たことを検出することができます。
▼この判定処理は、弾や敵といった他の移動物体にも適用できます。
3発のショットを同時に3方向へ発射
複数のショットを同時に発射すると、迫力が増します。あるいは、パワーアップした時にショットが複数になる、というゲームデザインもあるでしょう。今回は、3発のショットを同時に3方向へ発射してみます「図.4-17ショットの発射」。
▼「図.4-17ショットの発射」
以上の処理を終えたら、ショットを描画します。描画処理は基本的にフレームごとに行います。
「プログラム4-12:ショットのクラス(MyShip.h,MyShip.cpp)は、ショットのプログラムです。
▼「プログラム4-12:ショットのクラス(MyShip.h,MyShip.cpp)」
//ショットのクラス //移動物体クラス(CMover)から派生 classCShot:publicCMover{protected: //速度、回転角度 floatVX,VY,Yaw; public: //new演算子とdelete演算子 //ショットのタスクリスト(ShotList)を指定 void*operatornew(size_tt){ returnoperator_new(t,Game->ShotList); } voidoperatordelete(void*p){ operator_delete(p,Game->ShotList); } //コンストラクタ、移動、描画 CShot(floatx,floaty,floatdir); virtualboolMove(); virtualvoidDraw(); }; //コンストラクタ CShot::CShot(floatx,floaty,floatdir) : CMover(Game->ShotList,x,y,WEAPON_Z), Yaw(dir+0.25f) { //ショットの速さは一定値(2.4f) //方向は引数dirで指定 //例えば0は0度、0.5は180度、1.0は360度を表す //dirをcos関数やsin関数で使用する際にはラジアンに変換 VX=2.4f*cos(D3DX_PI*2*dir); VY=2.4f*sin(D3DX_PI*2*dir); } //移動 boolCShot::Move(){ X+=VX; Y+=VY; //ショットが画面外に出たかどうかを判定し、 //出た場合にはfalseを返す return Out(5); } //移動物体が画面外に出たかどうかの判定処理 //引数sizeには物体のサイズを与える boolCMover::Out(floatsize){ return X<-50-size||50+size<X|| Y<-50-size||50+size<Y; } //描画 voidCShot::Draw(){ Game->MeshShot->Draw( X,Z,-Y,1,1,1,0,Yaw,0,TO_ZYX,1,false); } //ショットの発射 voidCMyShip::Shot(){ //3方向にショットのタスクを生成 //第1および第2引数はショットの出現位置を表し、 //第3引数は発射角度を1.0=360度として表す new Shot(X,Y,0.70f); new CShot(X,Y,0.75f); newCShot(X,Y,0.80f); //ショットの発射音を再生 //Chapter2のCSoundクラスを使用 Game->SEShot->Play(); }
ショットを派手に見せる
ショットが3つ発射されているように見えてもタスクは1つ
ショットの3Dモデルは、実は3個のショット片を並べて構成されています「図.4-18:ショットの3Dモデル」。画面上はショットが3つ発射されているように見えても、使用されているタスクは1つです。多くのショット片を描くと画面がにぎやかになります。
▼「図.4-18:ショットの3Dモデル」
効率的なショット処理方法
1個のショット片で1個のショットを構成することもできるのですが、この方法ならばショットのタスク数が増えないので、見た目を派手にしつつも移動処理や描画処理を呼び出すコストを軽くすることができます。この手法は多くのシューティングゲームで使われています。
ビームを放つ
ショットとは違って、ビームは常に自機の正面へ直線状に発射されます。これは、折れ曲がらずに直線になっていた方が、ビームらしく見えるからです「図.4-19直線状のビームを発射する」。
▼「図.4-19直線状のビームを発射する」
▼ショットと同じ処理では自機の移動とともにビームが折れ曲がってしまいます.。そのため自機のX座標に一致させることでビームを直線状にします。
ビームを直線状にする方法
ビームを直線状にするには、常にビームのX座標を自機のX座標に合わせます。すると、ビームは自機の真正面へ一直線上に配置されます。
フレームごとにビームのY座標に速度を加算する
ビームは画面上方へ進んでいきます。これはフレームごとにビームのY座標に速度を加算することによって表現できます。ショットと同様に、画面外に出たときにはビームを消去します。移動を終えたら、ビームを描画します。
ビームの効果音の仕組み
ビームを発射するときには、効果音も再生するとよいでしょう。また、ボタンを離したときにはビームを止めます。
今回は、ビームを多数のビーム片から構成しています。各ビーム片は独立したタスクです。効果音はビーム片を生成する際に再生しています。ビーム発射中は次々とビーム片を生成するので、効果音が繰り返し再生されます。ビームを止めるときには、ビームのタスクをすべて消去します。
「プログラム4-13:ビームのクラス(MyShip.h、MyShip.cpp)」は、ビームのプログラムです。基本的な構成はショットのプログラムと同様です。
▼「プログラム4-13:ビームのクラス(MyShip.h、MyShip.cpp)」
//ビームのクラス //CMoverクラスから派生 classCBeam:publicCMover{ public: //自機を指す変数 //ビームのX座標を自機のX座標に合わせるために使用 CMyShip*MyShip; //new演算子とdelete演算子 //タスクリストにはBeamListを指定 void*operatornew(size_tt){ returnoperator_new(t,Game->BeamList); } voidoperatordelete(void*p){ operator_delete(p,Game->BeamList); } //コンストラクタ //引数のmyshipは、ビームを発射した自機を表す CBeam(CMyShip*myship,floaty); //移動、描画 virtualboolMove(); virtualvoidDraw(); }; //コンストラクタ CBeam::CBeam(CMyShip*myship,floaty) CMover(Game->BeamList,myship->X,Y,WEAPON_Z),MyShip(myship) {} //移動 boolCBeam::Move(){ //ビームのX座標を自機のX座標に合わせる if(MyShip){ X-MyShip->X; } //自機が消去されたときはビームも消去する else{ returnfalse; } //ビームの座標を更新して画面上方に移動させる Y-=6.0f; //ビームが画面外に出た場合にはfalseを返す returnOut(8); } //描画 voidCBeam::Draw(){ Game->MeshBeam->Draw( X,Z,-Y,1,1,1,0,0,0,TO_ZYX,1,false); } //ビームの発射 voidCMyShip::Beam(){ //ビームのタスクを生成 newCBeam(this,Y); //ビームの発射音を再生 Game->SEBeam->Play(); } //ビームの消去 //ボタンを離したときにビームを止めるために使用 voidCMyShip::DeleteBeam(){ for(CTaskIteri(Game->BeamList); i.HasNext();){ if(((CBeam*)i.Next())->MyShip==this)i.Remove(); } }
ショットとビームに関する初期化とデータのロード
ショットとビームの最後の仕上げです。ショットとビームを追加したので、ゲーム本体に処理を追加する必要があります。発射音に使うサウンドのロード、3Dモデルのロード、タスクリストの初期化を行います。
「プログラム4-14:ショットとビームに関する初期化とデータのロード(Main.h,Main.cpp)」は、ゲーム本体のプログラムに、ショットとビームに関する初期化とロードの処理を加えたものです。
▼「プログラム4-14:ショットとビームに関する初期化とデータのロード(Main.h,Main.cpp)」
//ゲーム本体のクラス classCShtGame:publicCGame{ protected: //...(中略)... //サウンドのロード CSound*NewSound(stringfile); public: //...(中略)(中略)... //3Dモデル(自機ショット・ビーム) CMesh*MeshSauce,*MeshShot,*MeshBeam; //サウンド(ショット・ビーム) CSound*SEShot,*SEBeam; //タスクリスト(自機ショット・ビーム) CTaskList*MyShipList,*ShotList,*BeamList; }; //コンストラクタ CShtGame::CShtGame() CGame("(MURASAME)",true,false,true) { //(中略)... //3Dモデルの初期化(自機・ショット・ビーム) LPDIRECT3DDEVICE9device-Graphics->GetDevice(); MeshSauce-NewMesh("sauce"); MeshShot-NewMesh("shot"); MeshBeam=NewMesh("beam"); //サウンドの初期化(ショット・ビーム) SEShotNewSound("shot"); SEBeam-NewSound("beam"); //タスクリストの初期化(自機・ショット・ビーム)MyShipList=newCTaskList(sizeof(CMyShip),10);ShotList=newCTaskList(sizeof(CShot),100); BeamList=newCTaskList(sizeof(CBeam),100); } //サウンドのロード //CSoundクラスを使用 CSound*CShtGame::NewSound(stringfile){ stringpath-ExePath+"..¥¥Sound¥¥"; CSound*p=newCSound(); p->LoadFromFile(path+file+".wav"); return p; }
自機プログラミングのまとめ
今回は、自機の動きに加えて、ショットとビームの発射について解説しました。まだ自機の処理だけで、弾も敵も出てきませんが、これから本格的なシューティングゲームに育てていきましょう。
▼ショットやビームに関する定数を変更すると、速度や角度を変えることができます。ショットの角度を変えたり、ビームの速度を変えたりと、いろいろ試してみてください。
「シューティングゲームの作り方/自作」関連サイトマップのご紹介
「シューティングゲームの作り方/自作」関連をご紹介します。
シューティングゲーム | ゲーム | 中古・新品通販の駿河屋
「シューティングゲームの作り方/自作」関連ページのご紹介
「シューティングゲームの作り方/自作」関連ページをご紹介します。
【STG】シューティングゲーム・サイトマップのご紹介
80年から2000年代のシューティングゲームについてご紹介します。
シューティングゲーム | ゲーム | 中古・新品通販の駿河屋
シューティングゲーム・関連ページのご紹介
シューティングゲーム・関連ページをご紹介します。
歴代名作シューティングゲームのご紹介|まとめ
歴代シューティングゲーム全ゲームタイトル一覧のご紹介|まとめ
シューティングゲームの人気シリーズのご紹介
シューティングゲーム関連ページのご紹介|まとめ
シューティングゲーム解説ページのご紹介|まとめ
シューティングゲーム・ハード関連(周辺機器)のご紹介|まとめ
シューティングゲーム雑誌/書籍関連のご紹介|まとめ
【ゲームジャンル別】サイトマップのご紹介
【ゲームジャンル別】サイトマップをご紹介します。
ゲームジャンル別サイトマップ | ||||
ゲームTOP > ランキング│傑作・名作│機種別│ジャンル別 |
||||
ゲームジャンル別TOP >関連ページ│名作│ランキング | ||||
【ジャンル別関連ページ】 アクション系(プラットフォーム│対戦アクション│FPS│TPS│STG│フライト)|AVG│RPG│SLG│レース│スポーツ│パズル│テーブル |
||||
【アクション】プラットフォーム│対戦アクション│FPS│TPS│STG│フライト 【アドベンチャー】AVG│ 【RPG】RPG│SRPG│ARPG 【SLG】SLG│ストラテジー│ターン制SLG│RTS 【レース】レース 【スポーツ系】スポーツ│プロレス 【パズル】 【テーブル】麻雀 |
||||
【ジャンル別】おすすめ評価ランキング アクション│AVG│RPG│SLG│レース│スポーツ│パズル│テーブル |
||||
【歴代傑作・神ゲー(2021~1996年)】99~94点│93~92点│91点│90点 ■【アクション系ゲーム】■ アクション│プラットフォーム│対戦アクション│FPS│TPS│フライト│ 【対戦アクション】一覧│98~80点│79~70点 【FPS】まとめ│90点以上│89~86点│85~83点│82~80点 【アドベンチャーゲーム】 ■【RPG系】■ RPG│SRPG│ARPG 【RPG】一覧│傑作(96~90点)│89~85点│84~82点│81~80点│ ■【シミュレーション系ゲーム】■ SLG│ストラテジー│ターン制SLG│RTS│街づくりSLG ■【レース】■ ■【スポーツ系ゲーム】■スポーツ│プロレス ■【パズル】 |
||||
シリーズ・テーマ | ||||
■■│コペンギンTOP > ゲーム│ホビー│書籍・マンガ│■■ |
||||
サイトマップ一覧 |
ゲームジャンル別・関連ページのご紹介
ゲームジャンル別・関連ページをご紹介します。
【TPS名作・傑作・まとめ】TPS傑作・名作・全ゲームタイトルのご紹介│まとめ│~トゥームレイダー│バイオハザード│アンチャーテッドなど~
【格ゲー・名作】アーケード・家庭用・格闘ゲームのご紹介~名作(173 本)・全タイトル(1462本)のご紹介
【名作STG】シューティングゲームのご紹介
【AVG】アドベンチャーゲームのご紹介│まとめ│
【名作RPG】RPGのご紹介│まとめ│
【TOP:SLG】おすすめ名作シミュレーションゲームのご紹介
【TOP】レースゲーム関連(おすすめ名作・評価ランキン)のご紹介
TOP【おすすめスポーツゲーム】のご紹介~MLB,NBA,NFL,FIFAなど~
【TOP】パズルゲームのご紹介
ゲームTOPサイトマップ
ゲームTOPのサイトマップをご紹介します。
【ゲームTOP】サイトマップ | ||||
ゲームTOP > ランキング│傑作・名作│機種別│ジャンル別 | ||||
■ランキングTOP > ハード│ソフト(売上(世界│国内)│海外評価) ■傑作・名作ゲームTOP > ■ゲーム機種別TOP > 据置│携帯│AC│PC│周辺機器 ■ジャンル別TOP > アクション系(プラットフォーム│対戦アクション│FPS│TPS│STG│フライト)|AVG│RPG│SLG│レース│スポーツ│パズル│テーブル |
||||
■■│コペンギンTOP > ゲーム│ホビー│書籍・マンガ│■■ |
||||
サイトマップ一覧 |
ゲーム関連ページのご紹介
ゲーム関連ページをご紹介します。
【ゲームランキング】世界・国内で最も売れたゲームランキングのご紹介
名作ゲームのご紹介│まとめ│家庭用ゲーム・PC・アーケードなど
【機種別ゲームTOP】PC・家庭用・アーケードゲーム・周辺機器のご紹介
ジャンル別ゲームタイトルのご紹介│まとめ│
コペンギン・サイトマップ
コペンギンのサイトマップをご紹介します。
【コペンギンTOP】サイトマップ | ||||
コペンギンTOP > ゲーム│ホビー│書籍・マンガ│ | ||||
■■│コペンギンTOP > ゲーム│ホビー│書籍・マンガ│■■ |
||||
サイトマップ一覧 |
懐かしの名作から最新作までの豊富な品揃え!通販ショップの駿河屋
コペンギンサイトマップ関連ページのご紹介
コペンギン関連ページをご紹介します。