おめが?日記

2006-11-09

o_mega2006-11-09

[]RECT WINDERを改造してみようとして、うおっ!? 09:47

せっかくなので、D言語の練習を兼ねてRECT WINDERを改造してみる。ゲーヘルのD言語ゲーム開発入門を見つつ、環境整備。以前、SDLにトライしたときみたくパス設定で苦しむも、何とかできた。以前はmakeが書けずに挫折したが、今回は具体例がDOSバッヂで助かったぜ…。



うお!?

あ、ありのままに今起こったことを話すぜ…。

『スペックの違うPC*1でゲームを動かしたら、ゲームスピードが倍速近い速度になってて別物にだった!』



な、何を言ってるかわからねー(自分でも)ので、ソースを見る。

hell.dの240行目辺り

void Hell_wait(int ms)

{

  SDL_Delay(ms);

  /* 中略 */

}

rect.dの1637行目辺り

while(true)

{

  loop();

  Hell_update();

  Hell_wait(16); // 60fps

}

ちょw id:kenmoさんw それはマズいぜ…。

[]変にテンションあがって来た! 20:17

RectWinderプレイ動画より

凄すぎ!こんなプレイは想定外です!!

発狂モードが発狂モードじゃないよー。


じゃあこんな動画はどうかな?

一応念のため言っておくけど、ちゃんとオリジナル版だからね。動画のフレームがあがったのは録画設定変更と、高スペックのノートPCで動かしたから*2。ズルとかしてないよ!

改造版ねちねち作ってたら、なんだか変にテンションあがってオリジナル版攻略しただけだからね!


まずは、キッカリ1000点クリアプレイ。ボスだけダメージを与えて倒す。ザコには一切手を出さない。

D

リング弾攻撃を上手く吸収してやれば大ダメージが可能。あとは、他の敵がいない形態に適当量の打ち返しをキメれば、発狂モードに突入することなく比較的簡単にできる。

が、別に浮上してくる問題もある。これの倍率バグだ。何回か3000点クリアを達成してしまった。倍率バグを回避するために、上手く吸収量を調整してリング弾からピッタリの弾数を打ち返すか、その後のワインダー/回転砲塔のときに単発打ち返しを決めるか、神に祈る必要がある。ワインダー/回転砲塔とも側面から打ち返すぐらいしか手がないが難易度が非常に高い。結局この動画では「神に祈ってリング弾返しをブチ込むパターン」を取った。


次、上が達成できたのでトライしてみた0点クリアプレイ。ボスの弾幕を全部回避。いわゆる自爆待ち。

D

上の時に作成した回避パターンを適度組んでやれば、発狂の序盤ぐらいは何とかなることが判明。それをベースに進む。

次に判明した重要なポイントは「中型は自爆してもアイテムを出す」こと。通常の方法では回避不能でも、被弾で画面内の弾を消去 ⇒ アイテムを取る ⇒ リカバー といった流れが可能だ。通常モードでは中型の数が少なく、確実にリカバーできる訳ではなかったが、発狂中は中型がモリモリ沸いて自爆する。おかげで十分な量のアイテムが、攻撃なしに入手可能なのだ。

この動画では発狂ワインダーを上記のリカバーで通っている。このパターンでなくともボス上方で切り替えしていれば問題ないんだけどね。


時間掛かったけど何とかなるもんだ。パターン作成協力Removey.s。

思ってた以上に自由度はあった。例の弱体化/リカバリーも序盤では効果がほぼ無かったが、発狂モードなら十分意味があった。

取っ掛かりは難ありでしたが、良ゲーでした。ご馳走様。


…実際のところ、ドコまでが想定範囲内だったのかな〜。気になる。



…あと遣り残したこと「ボスに体当たりをキメてクリア」ぐらいかなぁ。うへへ。お、落ち着くんだ俺。

[][][]RECT WINDER REDuce 20:46


一連のバカプレイを研究したりしながら、別の調整バージョンを調整してたりした。画像の「NT」ってヤツね。

NTは「打ち返し」をより前面に押し出す方向に調整して、その過程でいくつかの要素を切り落としたり、大味にしたりした。それをRemovey.sや他の友達と遊んでみると、確かに遊びやすくはなった。けれども、相応にいろいろと変わりすぎてしまって、「オリジナルを遊びやすくする」方針からはズレてしまった。

そこで、改めてオリジナルを見直してみると…、一番ネックなのは「弾幕ゲーなのに判定が大きくて避けれないこと」なんじゃないかというところに行き着いた。他は、まあ、強い癖で受け入れることが出来るんじゃないか。

ということで、単に判定が小さいバージョンを作ってみた。


RECT WINDER REDuce

http://nagoya.cool.ne.jp/o_mega/0611/rectwinder_RED_1109.zip

差分ファイルなので、オリジナルRWのフォルダへコピーが必要。


変更点は

・自機のあたり判定を 16x16dot から 2x2dot へ縮小

例の倍率バグの解消

fpsが60で安定しないバグの解消

だけです。どうでしょうか?

*1Pen4 1G + GeForce2MXのデスクトップ機(低速)、昨日の動画撮影に使用。今日動かしたのはMCeleron1.4G + 855GMのノート

*2:多分、これが想定されたゲームスピードなのかな? fps60安定化した後もプレイ感覚は変わらなかった。

kenmokenmo 2006/11/09 12:04 (〃・ω・〃)
あ……、普通は40fpsぐらいなのでしょうか(違

o_megao_mega 2006/11/09 16:05 いやいやいやいやw
フレームレートがPC性能で変化しちゃうんですよ。難易度調整の根底がぁー

hogerattahogeratta 2006/11/10 00:30 僕はソースを読んだわけではないのですが、おめがさんのエントリを読んで、どこが問題になっているのか概ね検討がついているので、おめがさんに代わって説明をさせていただきますと、
-kenmoさんは単純にDelay(16)をかましている
-確かに、1フレームあたり16msならば、1000/16で殆ど60FPSとなる筈である
-しかし、kenmoさんが見落としていると思われるのは、Delayをかます以前の処理である
-具体的には、Delayをかます以前に状態の更新と描画をする処理が入るわけだが、仮に、それらの処理に4ms消費されていた場合、1フレームあたりに16+4=20ms消費されるわけであり、結果として、1000/20=50FPSとなってしまい、想定していた60FPSと違った結果になってしまう
-そして、ゲームの速度がPCのスペックごとに変化してしまうので、難易度調整の根底がぁー
という話だと、僕は考えています。
既に分かっていて冗談飛ばしてるならすんません。

o_megao_mega 2006/11/10 15:22 >hogeretta
ずばりその通りです。

o_megao_mega 2006/11/10 17:34 >REDuce版
fps安定はわりとやっつけの安定化版ですね。
ちゃんとするなら、ABAさんのコードみたくフレームスキップやより長いスパンでの安定化処理が必要なんですが、今回のコードはHSPのAWAIT相当の簡単な処理にしました。