弾幕避けゲームを作ってみました。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
御津凪

弾幕避けゲームを作ってみました。

#1

投稿記事 by 御津凪 » 16年前

こちらのサンプルプログラミングの館にて紹介させていただいているゲームをパワーアップさせました。

本当は自作のライブラリのサンプル兼実用チェックとして製作したものですが、
サンプルとは言いがたいほどに規模が大きくなってしまいました…。

これはひとまず遊べる形ということで、各環境でのテストプレイもかねて
遊んでいただけたらなと思います。(ゲームソースも公開してます)

まだスコアの記録等、いくつか未実装の部分がありますが、そこはきちんと完成させていくつもりです。
(このゲームは C++ + DirectX を使用して書かれています。)

ダウンロードページはhttp://mitsunagistudio.aki.gs/%e3%83%a9 ... istact-setから。
(ページ一番下の BGSTG090.exe です)

なお、起動前にフルスクリーンモードの選択は出来ますが、
起動中はフルスクリーンの切り替えが出来ませんので、注意してください。
(無理やりやるとゲームが出来なくなるので注意)

以上、感想や報告などをお待ちしております。

Tatu

Re:弾幕避けゲームを作ってみました。

#2

投稿記事 by Tatu » 16年前

このゲームで遊んでいたところ、リトライを何回もしたあとに画像のように
敵の弾、レーザーが出なくなりました。さらにリトライをくりかえしたとこ
ろ、敵が一切出なくなりました。そのあとは、リトライをしても、リタイア
しても、タイトルに戻っても敵は出ませんでした。もう一度ゲームを起動す
れば、また通常通りになりました。
つかっているOSはwindows vistaです。

御津凪

Re:弾幕避けゲームを作ってみました。

#3

投稿記事 by 御津凪 » 16年前

> Tatu さん

バグの報告、ありがとうございます。
こちらでも確認しようとしていますが、今現在確認が取れていません。

原因が分かり次第修正をしますので、お手数ですが、
それまでの間は再起動で対処をお願いします。

もし、そちらで再度確認できましたらその詳細内容(繰り返し回数等)を
出来るだけお教えください。
原因の究明に役立ちますので。
(恐らく)

Tatu

Re:弾幕避けゲームを作ってみました。

#4

投稿記事 by Tatu » 16年前

弾と敵の消失について調べてみました。

弾(レーザー含む)の消失について
最初の赤玉が弾を出し切ったときにリトライするようにしたとき
OVERでは6回、HARDでは8回、BESTでは12回で弾がでなくなった。
また、OVERで青玉が弾を7*4*3=84個出しているときにリトライするようにしたとき
24回目で弾が減り、25回目で0になった。(弾の最大数は2048個?)
一方、弾が出ていないときに何回リトライしても弾の数は減らなかった。
リトライするときに表示されていた弾の数だけ発射できる
弾の最大数が減っているようである。

敵の消失について
最初の赤玉が10個でたところでリトライするようにしたとき
13回で出なくなった。(敵の最大数を128体としているのだろうか?)
敵が出ていないときに何回リトライしても敵の数は減らなかった。

またリトライしたとき、最後の敵が画面から消えた時に
クリアとならないことがあった。

pooka

Re:弾幕避けゲームを作ってみました。

#5

投稿記事 by pooka » 16年前

遊んでみました。
まだSafe Levelしか遊んでませんがバグかなと思うことがあったのでご報告を。
最後の敵のときにボムを1回使用するとクリアとなりませんでした。
2回以上だとクリアとなり、またそれ以前にボムを1回使用していてもクリアとなりました。
あとゲーム開始時はPowerは5ですがリトライをすると3になっていました。
私が確認したのはこれぐらいですね。
まだ他のレベルをやっていないので今から遊んでみます(^o^)

追記:
クリアとならなかったのはリトライしてからで、ボムを使用していなくてもなりました。

kazuoni

Re:弾幕避けゲームを作ってみました。

#6

投稿記事 by kazuoni » 16年前

・・・完成度高くないですか?(笑)

弾幕ゲーム苦手な自分でもステップアップ的にできるので、
サクサク遊べました^^
まだやりこんでないので、バグは発見できてませんが・・・

ちょっと解析試みようとしましたが・・・
ちょっと規模が大きいですねw
時間ができたら、のんびり拝見させていただきます^^
更なる機能の追加、またはステージ性に大いに期待します!

制作お疲れ様でした!

ひよこ

Re:弾幕避けゲームを作ってみました。

#7

投稿記事 by ひよこ » 16年前

弾幕STGが大好きで作って参考にと思ったら、BESTモードでボスにやられてしまいました。
難しいですね・・・・
自分はまだ一回しかやってはいないのですがバグはなかったと思います。

Dixq (管理人)

Re:弾幕避けゲームを作ってみました。

#8

投稿記事 by Dixq (管理人) » 16年前

おぉ、これはすごい!
「自分で全部作った感」がより一層すごさをUPさせてますね!
素材も全て手づくりで、すごいな~と思いました。
キャラの動きもすごく滑らかですね^^

まだ一度しかプレイ出来ていないので、これからやらせていただこうと思います。
リンクは新しいものに張り替えておきますね。

今後にますます期待します^^

御津凪

Re:弾幕避けゲームを作ってみました。

#9

投稿記事 by 御津凪 » 16年前

> Tatu さん

発生の詳細を教えていただきありがとうございます。
確認したところ、弾などを管理しているリストのリセット部分で、
使用中カウンタが初期化されていませんでした。
結果、報告どおりの現象が出ていたようですね。

クリアにならない原因もそれに起因していました。
(全ての敵・弾の使用個数が0になったらクリアとなる条件のため)

おかげで早急に修正することが出来ました。ありがとうございます。
(ダウンロードページを更新しました)


> pooka さん
> あとゲーム開始時はPowerは5ですがリトライをすると3になっていました。

初期化時とリセット(リトライ)時が個別に固定値を指定していたのが原因ですね。
本当は渡された情報でリセットすればよかったのですが、今は応急処理ということで
リトライでも5になるように修正しました。

> kazuoni さん
> 完成度高くないですか?(笑)

作りこみすぎました。サンプルなのに…(笑)

> 弾幕ゲーム苦手な自分でもステップアップ的にできるので、
> サクサク遊べました^^

ありがとうございます。励みになりますm(__)m

> まだやりこんでないので、バグは発見できてませんが・・・

見つけたらどしどし報告してください。
サンプルにバグがあっては価値が半減しますし。

> ちょっと解析試みようとしましたが・・・
> ちょっと規模が大きいですねw

さっき総実行行数を調べたら1万行近くありました。
龍神録プログラミングの館のソースコード(60章)の約3倍という結果に・・・。

あと、書き忘れていましたが、このコードのフルビルドには Ruby (データコンバートに使用)と、
ライブラリが必要です。

> 更なる機能の追加、またはステージ性に大いに期待します!

実は本体をいじらずステージ部分だけ自作・追加できるようになっているので、
やろうと思えば自作出来ますよ。

このゲームは一通りの機能を実装し終えたらそこで一区切りしようと思っています。
次の製作に向けるので。


> ひよこ さん
> 難しいですね・・・・

確かに難しいです。
どれも即席弾幕モノなので、細かな難易度調整はしていませんし、
自分自身 OVER をクリアできてませんw

ただ、ランダム要素は全くないのでパターン避けが可能です。

遊べるのは1ステージだけですし、1つしかないので今はこの程度で良いだろうと思いました。


> 管理人さん
> おぉ、これはすごい!
> 「自分で全部作った感」がより一層すごさをUPさせてますね!
> 素材も全て手づくりで、すごいな~と思いました。

ありがとうございます。
サンプルという位置づけの元、手作りでないと自由が利かないだろうなと思って製作してきましたが、
規模はすでにサンプルを超えていますね^^;
ただ、ソース・データ一式公開しているので、サンプルとしての役割は果たしていると思います。

恐らく、ゲームとしてのサンプルのほかにも、さまざまな技術が入っているので、
もしかしたらそれらの実装の参考にもなるかもしれません。

> キャラの動きもすごく滑らかですね^^

これは本家を模写しただけで、比べると劣化してますけどね。
でもアニメーションするときれいに見えるから不思議。

チルチル

Re:弾幕避けゲームを作ってみました。

#10

投稿記事 by チルチル » 16年前

う~ん恐ろしいほどゲームに説得力がありますね・・
私も早くこのレベルの物が作りたいです

ところで御津凪さんのゲームではレーザーをどのように表示しているんですか?
私は画像をDrawModiGraphF関数で変形させて表示していますが
かなりギザギザしたものになってしまいます・・

一応バイリニア法は使っているのですが、他にギザギザを防ぐ方法はないでしょうか?

Tatu

Re:弾幕避けゲームを作ってみました。

#11

投稿記事 by Tatu » 16年前

リトライ時のバグが修正されていることを確認しました。

そして、全難易度でのノーミスクリアを達成しました。

Dixq (管理人)

Re:弾幕避けゲームを作ってみました。

#12

投稿記事 by Dixq (管理人) » 16年前

うは・・・Taruさんうますぎ^^;

私が下手すぎるのかな・・
私は自分で龍神録作っておきながら龍神録ノーミスクリアできません・・(笑

御津凪

Re:弾幕避けゲームを作ってみました。

#13

投稿記事 by 御津凪 » 16年前

> チルチルさん
> 私は画像をDrawModiGraphF関数で変形させて表示していますが
> かなりギザギザしたものになってしまいます・・

私の方は DirectX3D を直接使用して構成していますので、
見た目全て2D表示でも、内部的には全てポリゴン描画しています。
DXライブラリでも、D3Dを使用するように行えば、ギザギザは抑えられるかと思いますよ。
(実際使用したことがないので出来るかどうかわかりませんが)

> Tatu さん

修正の確認報告ありがとうございます。
また、ノーミスクリア達成おめでとうございます!

次期バージョンアップにはランク255のステージとか用意してみようかな。


> 管理人さん

大丈夫ですよ。
ゲームプログラマには自分で作っておいて(苦手分野とかで)自分がクリアできないなんてことは
よくあることですから。

そのためのデバッガさん達やテストプレイヤーさん達がいますし。

チルチル

Re:弾幕避けゲームを作ってみました。

#14

投稿記事 by チルチル » 16年前

あ~なるほどポリゴンですか
ちなみにD3Dって何ですか?

御津凪

Re:弾幕避けゲームを作ってみました。

#15

投稿記事 by 御津凪 » 16年前

D3D は Direct3D の略です。

junta

Re:弾幕避けゲームを作ってみました。

#16

投稿記事 by junta » 16年前

完成度が凄いですね!
このゲームを作れるように目標にしたいと思います!

win2000で、リトライしてたらレーザーが出なくなりました。
windows7にて動作確認

BEMANI

Re:弾幕避けゲームを作ってみました。

#17

投稿記事 by BEMANI » 16年前

>>御津凪さん
お久しぶりでございます。
プレイさせて頂きましたが、一番最初のレベルでも難しいと感じてしまいました。(クリアできなかったです;)
難しいですね; 最近のSTGをやる方は結構レベル高い気がします。
(単に下手くそなだけなんですが・・・)

ゲームの方ですが、フルスクリーン後、
Alt+Tabキーで違う画面に変えたあと、もう一度アプリに戻ると正常に描画されておりませんでした。
一応報告しておきます。


御質問宜しいでしょうか?
描画をかける時に使っている関数で、DrawPrimitiveUP ・ DrawIndexedPrimitive ・ DrawIndexedPrimitiveUP
がありましたが、なぜ使い分けているのでしょうか・・・

もうひとつ、テクスチャが256*256等のサイズになっていますが
やはり2のn乗サイズのテクスチャを使うと実行速度に差が出てきたりするのでしょうか。



自分で全てを作れるといいですね~。
音楽作れる時間があれば音楽も作りたいっす。
こちらも創作意欲が沸いてきたので今のうちに少しでも進めていきます。
ソースコードも超参考になりそうだったので、ゆっくりと拝見させて頂きますね~。
制作お疲れ様でした~。

御津凪

Re:弾幕避けゲームを作ってみました。

#18

投稿記事 by 御津凪 » 16年前

> BEMANI さん

お久しぶりです。

> Alt+Tabキーで違う画面に変えたあと、もう一度アプリに戻ると正常に描画されておりませんでした。

スクリーン切り替え時のデバイスリセットをすっぽかしたままなので、そうなります。
ライブラリ側からフルスクリーンの切り替えなどのそういった対応をしていなかったので、
次のバージョンには実装する必要がありますね。

> 描画をかける時に使っている関数で、DrawPrimitiveUP ・ DrawIndexedPrimitive ・ DrawIndexedPrimitiveUP
> がありましたが、なぜ使い分けているのでしょうか・・・

DrawIndexedPrimitive は実際には使ってないです。(一応用意しただけ)

このゲームでは、描画するものを一つのオブジェクト(あるいは塊)として、
単体で管理、表示するもの(背景など)は DrawPrimitiveUP を使い、
同じテクスチャ内で多くの描画物を管理、表示するものは DrawIndexedPrimitiveUP を使う、
として、描画を切り分けています。

特に敵や弾などの表示は DrawIndexedPrimitiveUP を一度呼び出すだけで済むようになっています。

> もうひとつ、テクスチャが256*256等のサイズになっていますが
> やはり2のn乗サイズのテクスチャを使うと実行速度に差が出てきたりするのでしょうか。

グラフィックデバイスは、基本 2 の n 乗サイズ、特に 256 * 256 が最も高速に処理されるそうです。
(DirectX のリファレンスに書かれています)
なので、出来るだけ 256 * 256 及び 2 の n 乗のサイズにしています。

ただ、そうしないと著しく速度が低下するというわけではないはずです。

> ソースコードも超参考になりそうだったので、ゆっくりと拝見させて頂きますね~。

はい。どうぞゆっくりみていってください。

BEMANI

Re:弾幕避けゲームを作ってみました。

#19

投稿記事 by BEMANI » 16年前

>>御津凪さん
>このゲームでは、描画するものを一つのオブジェクト(あるいは塊)として、
>単体で管理、表示するもの(背景など)は DrawPrimitiveUP を使い、
>同じテクスチャ内で多くの描画物を管理、表示するものは DrawIndexedPrimitiveUP を使う、
>として、描画を切り分けています。

現在、出来る限り実行速度を上げ、綺麗に描画させることを目標に取り組んでいますが、
そのように組むにはどうすればいいかわからず、
とりあえずDrawPrimitiveUPで一つのオブジェクトに対して一回呼び出す方式にしています。
・・・があまりいい方法ではないようですね;

現在、自分のゲーム?色々な方のPCで動作チェックしているのですが
描画方法が悪いのか、そもそもコード自体に無駄があるのか解らない状態で処理落ちがかかるPCをいくつか発見しました。
性能の低いマシン・高いマシンで比べ、何故か性能の高いマシンの方が遅かったり
PCの性能を見ている感じCPUのコア数や、メモリの容量等も特に関係ない感じで、残るはグラボの性能が違うという所でしょうか・・・

御津凪さんが描画方法を分けていたので何かあるのかな~と疑問を感じ質問した次第であります。
一つ描画方法と言う事で、出来る限り処理落ちしないように組み直す必要が出てきました。


>グラフィックデバイスは、基本 2 の n 乗サイズ、特に 256 * 256 が最も高速に処理されるそうです。
>(DirectX のリファレンスに書かれています)
それは初耳でした。
現在ほとんど2のn乗から逸れたサイズのテクスチャを使っていますが、それも処理落ちの原因になっているかもしれないです。
なぜか、GeForceのグラボを積んでるPCは処理落ちがほとんど確認されませんでした。
DirectXかなり難しいですね;


貴重な情報、御回答有難う御座います。
次の制作も期待しております^^

チルチル

Re:弾幕避けゲームを作ってみました。

#20

投稿記事 by チルチル » 16年前

なるほどDirect3Dですか

ところで使われている素材を見させていただきましたが
みんな白黒のようですね
ゲーム内ではちゃんとカラーになっていますが
これはどうやっているんでしょうか?

普通にブレンドしただけでは白い部分も色が付いてしまうんですよね・・

nayo

Re:弾幕避けゲームを作ってみました。

#21

投稿記事 by nayo » 16年前

>>チルチルさん

勝手な予測ですけどDirectXのSpriteを使われてるのではないですかね
α値、r値、g値、b値の設定ができるほか、描画深度も設定できるので便利です


プレイしてみましたが、スムーズな動きに感動しました
ステージのデータは.dllファイルで行っているのでしょうか
私はそういったファイルの扱い方を知らないので遠慮していたんですけど便利そうですね

チルチル

Re:弾幕避けゲームを作ってみました。

#22

投稿記事 by チルチル » 16年前

それは便利そうですね
ところでSpriteとは何でしょうか?
関数ですか?

御津凪

Re:弾幕避けゲームを作ってみました。

#23

投稿記事 by 御津凪 » 16年前

> nayo さん
> 勝手な予測ですけどDirectXのSpriteを使われてるのではないですかね

残念ながら DirectX の Sprite は使ってません。
アレを沢山使用すると遅くなるので、
すべてグラフィックデバイスの Draw 系関数で行っています。

> ステージのデータは.dllファイルで行っているのでしょうか

その通りです。
現在はステージ・敵・弾・レーザーの各動きしか DLL に用意されていませんが、
効果音や曲なども外部から読み込めるようにする予定です。


> チルチル さん
> ところでSpriteとは何でしょうか?
> 関数ですか?

ID3DXSprite という補助(インターフェイス)クラスです。
描画に関するめんどくさい処理を DirectX に任せてもらえる便利なものですが、
上記の通り、沢山使うと重くなります。

あと、カラーのブレンドですが、簡単に言うと加算ブレンドを使って黒部分に色づけしてます。

nayo

Re:弾幕避けゲームを作ってみました。

#24

投稿記事 by nayo » 16年前

なるほどDrawですか
しかし外部から何でも読み込めると便利そうでいいですね
アップデートなども一部だけ更新すれば良かったり

私も時間ができたら挑戦してみたいですね

チルチル

Re:弾幕避けゲームを作ってみました。

#25

投稿記事 by チルチル » 16年前

あ~なるほど加算ブレンドですか
その手があったのを忘れてました

チルチル

Re:弾幕避けゲームを作ってみました。

#26

投稿記事 by チルチル » 16年前

と思ったのですがうまくいきません・・
具体的にはどのような手順で色を付けているんでしょうか?

御津凪

Re:弾幕避けゲームを作ってみました。

#27

投稿記事 by 御津凪 » 16年前

DXライブラリでは 2Dは DirectDraw を使用して描画しているようなので、
DXライブラリを使ったことがないのでやれるかどうかわかりませんが、色づけは、

1.テクスチャ(元絵)に指定の色(を塗りつぶした同サイズの画像)を加算合成して黒色に色を付ける。
 ただし、元絵のα値を考慮しない(処理させないようにしない)と、透明だったところも色が付いてしまいます。
2.色の付けたテクスチャ(加工絵)を使用して描画する。

という形で出来るかと思います。
(1.の元絵のα値を考慮しない処理が出来るかどうかが問題)

このゲームは Direct3D の機能を利用して合成を行っていて、処理としては以下のようになっています。
(GObjectMgr.cpp から抜粋)
dev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );         // 描画元のブレンド係数 : (As, As, As, As)
dev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );     // 描画先のブレンド係数 : (1 - As, 1 - As, 1 - As, 1 - As)
dev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_ADDSIGNED ); // テクスチャの色の計算方法 : (Arg1 + Arg2 - 0.5)
(コメントにある括弧内の式はリファレンスから引用)
簡単に説明すると、3行目が 1. に当り、
1、2行目が 2. に当ります。

チルチル

Re:弾幕避けゲームを作ってみました。

#28

投稿記事 by チルチル » 16年前

>>(1.の元絵のα値を考慮しない処理が出来るかどうかが問題)

確かにこれが問題みたいですね・・
そもそもテクスチャ自体の背景も透過しないといけないし・・
なのでとりあえず同じ画像を2回描画して加算ブレンドしてみましたが
白っぽくなってしまって濃い色になりませんね・・
元絵の暗さが足りないって事じゃないですね・・

御津凪

Re:弾幕避けゲームを作ってみました。

#29

投稿記事 by 御津凪 » 16年前

DirectX では、色のブレンド処理の時、
0.0 ~ 1.0 の正規化されたベクトル値で計算します。

加算合成の場合、同じ画像を重ねて加算合成した時、
黒の箇所の合成は
0.0 + 0.0 = 0.0
で、変化なしですが、
少しでも色がつくと(0.2の場合)、
0.2 + 0.2 = 0.4
となり、合成結果は元の2倍の明るさになります。
(グレー(0.5)だと白(1.0)になる)

描画時に透明度を設定できれば、この加算量はある程度調整できます。


ともかく、DirectDraw を使っている DXライブラリでは、
Direct3D での処理を移植するのは難しいかもしれませんね。
もし出来たとしても処理が重そうです。

チルチル

Re:弾幕避けゲームを作ってみました。

#30

投稿記事 by チルチル » 16年前

なるほど黒に黒を重ねるから色が付きにくいんですね
って事は同じ画像じゃなくて明るさを反転させたものや明るさを増したものを重ねれば
色が付きやすくなるかもしれませんね

Tatu

スコア更新

#31

投稿記事 by Tatu » 16年前

使用ボムを減らせないかどうかやっているうちに、
ボムを撃っている時にも弾にかすれることを発見し、
スコアを大幅に更新することができました。

閉鎖

“C言語何でも質問掲示板” へ戻る