あけましておめでとうございます。今年もよろしくお願いしますm(_ _)m
別に元日に年賀状が一枚も届かなかったからって泣いてなんかいません。
やっとこさ次の動画ができあがったので生温かい目で見てやってください。
ついにナムアニクラウドさんに教えていただいた黄金角の出番がやってきました。
見栄えがものすごくいいですね。しかも応用が利くので様々なところで使っていきたいです。
[nico]
http://www.nicovideo.jp/watch/sm16589731[/nico]
今回は本格的に道中を作り始めた、というところです。
時間がかかったところは、やはり目に見えない、「いかに楽に中身を作る環境を整えるか」というところです。
今回の場合なら、敵の出現がそれにあたります。
最初は敵1体出すのに5行ほど必要でしたが、いくらなんでもこれはヒドイということで色々考え、どうにか1行に収めることに成功しました。
ちなみに龍神録のようにcsvファイルを作って読みこむことはしません。
csvファイルだと編集した内容を適用するのにいちいちファイルを閉じないといけないからですし、
第一にファイルを作って読みこむ必要がないからです。
csvを使うことの利点は、エクセルなのでパッと見、数字の持つ意味が理解しやすいことにあると思います。
でもVCなら引数リストが見れるのでそんな必要はありません。
また、メモ帳を使ってそれを読み込む場合の利点としては、数字を変更した際にいちいちゲームを起動し直さなくていいということが挙げられますが、
VCでも同様のことができるので起動し直す必要がありません。(たくさんインクルードされてるヘッダファイルを変更するのは厳しいですが)
そんなわけで敵の出現パターンは直接コードに書いてるのですが、実際のところどうなのでしょうか?
一人でゲームを作る分にはこれでいいと思うのですが、ファイル読み込みには他にもメリットがあるのでしょうか?
ここからはプログラムしたことに対してあーだこーだ言ってます。
リザルト画面を作りました。最初の文字が出るところは龍神録っぽくしてみました。
そしてずっとやりたかったスコアボーナス。
TOAのグレードやスマブラDX(スマデラと呼ぶ自分は少数派なのか?)の評価制乱闘の発想で作りました。
これのまた時間のかかることかかること。
ちなみにボーナス数は今のところ138個です。大台突入。もう思いつかない。
何か考えていただけたら、実装が大変などの理由がない限り採用させていただきます。
本当はもっと欲しいんですよね。でもSTGだと強制スクロールだったり攻撃の種類が少なかったりでやることに制限があるのであんまり数が出ないというか。でもすでに結構出てる気がするというか。
ちなみにボーナス一覧はこちらです。
メモ帳だとインデントが揃ってるのに・・・(´・ω・`)
► スポイラーを表示
基本
被弾する ×0.99(乗算)
喰らいボム成功 ×1.01(乗算)
ミスをする ×0.98(乗算)
ボムを撃つ ×1.02(乗算)
相方が戦闘不能 ×0.80
ボスを撃破 ×1.20
難易度EASY ×0.80
難易度NORMAL ×1.00
難易度HARD ×1.50
難易度SAIaku ×2.00
難易度EXTRA ×1.30
難易度PHANTASM ×1.80
巧み
HPを半分以上残す ×1.05
HPを半分以上残す(相方)×1.05
HP最大 ×1.20
HP最大(相方) ×1.20
MP最大 ×1.08
MP最大(相方) ×1.08
BOMB最大 ×1.08
POWER最大 ×1.10
ショットの命中率がいい ×1.10 ショットの命中率が50%以上
スナイパー ×1.50 ショットの命中率が80%以上(上位)
ショットの命中率が悪い ×0.95 ショットの命中率が5%以下
ショットキーを連打 ×1.10 ショットキーが1F以上入力されているが60F以上入力されない
グレイズが多い ×1.10 平均して1秒に5回以上グレイズする
ハイパーグレイズ ×1.10 1秒に100回以上グレイズする
高速グレイズ ×1.30 8割以上を高速でグレイズ
アイテムボーダーカンスト×1.05 アイテム回収ラインが最大になる
状態異常にならない ×1.10
状態異常がカンスト ×0.90 状態異常レベルが99になる
状態異常を掛け持ち ×0.90 一度に2種類の状態異常になる
状態異常いっぱい ×0.80 一度に3種類以上の状態異常になる(上位)
不撓不屈 ×1.10 60秒以上状態異常になるが、一度も被弾しない
状態異常が長引く ×0.90 全体の30%の時間状態異常になる
被弾していない時間が長い×1.05+(0.0003×(時間ー3600)/60) 60秒以上被弾しない
回避時間が長い ×1.10+(0.001×(時間ー3600)/60?) 60秒以上避け続ける(魔法、ボムなどによる無敵も不可)(上位ではない)
撃墜王 ×1.10 敵のキル率が90%以上
ターミネーター ×1.70 全ての敵を倒す(上位)
敵を倒さない ×2.50
速攻 ×1.10 敵をすぐに倒す(70F~120+最大HP/1000F以内に倒すと100~0ポイントを加算し、敵の出現総数で割った数が50以上なら取得(要調整))
体当たりで倒す ×1.01(乗算) 雑魚を体当たりで倒す
体当たりでスペルを終了 ×1.30(乗算) 体当たりでスペルを終了させる
尻撃ちが多い ×1.10 ボスの頭上でショットを当てた回数が1000発以上
張り付きが多い ×1.10 ボスの真下でショットを当てた回数が2000発以上
弾の相殺が多い ×1.05 500発以上相殺する
相殺名人 ×1.10 1000発以上相殺する
かっこよく勝利 ×1.10 ボスにボムで止めをさす
全スペルボーナス取得 ×1.20 全スペル取得
全スペルボーナス取得失敗×0.90 全スペル取得失敗
行動
被弾しない ×2.00
被弾回数が多い ×0.95 10回以上被弾する
ノーミス ×1.50
連続でミス ×0.90 300F以内に2度ミスをする
ミスが多い ×0.90 10回以上ミスをする
落ち着きがない ×1.05 上下左右入力時間が全体の30%以上
あまり動かない ×1.10 上下左右入力時間が全体の3%
左側に長くいた ×1.10 画面左に全体の80%の時間いた(最初300Fは無視)
左側にずっといた ×1.50
右側に長くいた ×1.10 画面右に全体の80%の時間いた(最初300Fは無視)
右側にずっといた ×1.50
上側に長くいた ×1.30 画面上部に全体の60%の時間いた(最初300Fは無視)
上側にすごく長くいた ×1.80 画面上部に全体の80%の時間いた(最初300Fは無視)(上位)
上側にずっといた ×3.00 画面上部にずっといた(最初300Fは無視)(上位)
下側にずっといた ×1.20 画面下部にずっといた(最初の300Fは無視)
低速が長い ×1.05 80%以上低速
低速のみ ×1.10 ずっと低速(最初300Fは無視)
高速が長い ×1.10 80%以上高速
高速のみ ×1.20 ずっと高速
HPが最大の時間が長い ×1.02+0.0003×(時間ー3600)/60
MPが最大の時間が長い ×1.03+0.0004×(時間ー3600)/60
ボムの保有時間が長い ×1.05+0.0005×(時間ー3600)/60
ボムの保有時間が短い ×1.05 200フレーム以上ボムを持たない
自然回復量が多い ×1.10 リカバーHPによる回復で最大HPの7割を回復する
火事場の底力 ×1.50 最初から最後まで、HPが1でかつ被弾しない
根性 ×1.30 5回以上HPが1になる
満身創痍 ×1.30 二人のHPが1以下、二人のMPが2割以下、ボムがない、状態異常の状態で終了
上部回収が多い ×1.08 アイテムの80%を上部回収で取得する
上部回収のみ ×1.15 (上位)
体当たり回収が多い ×1.10 アイテムの80%を当たって回収。低速もダメ。ボム小は無視
体当たり回収のみ ×1.20 アイテムを全て当たって回収(上位)
守銭奴 ×1.10 出現した全てのお金を回収する
全アイテム回収 ×1.30 アイテムを全て入手する(上位)
アイテムを取らない ×2.00
幸運 ×1.50 レアアイテムを3つ入手する
ショットを撃たない ×2.00
魔法を撃たない ×1.50
ボムを撃たない ×1.30
ショットのみ ×2.00 魔法、ボムを使用しない(上位)
魔法のみ ×4.00 ショット、ボムを使用しない(上位)
ボムのみ ×6.00 ショット、魔法を使用しない(上位)
ドットイート ×15.0 ショット+魔法+ボム禁止(上位)
グレイズしない ×5.00
装備アイテムを使用しない×1.10 装備アイテム未実装
ゴッドフィンガー ×2.00 移動、低速、ショット、魔法、ボム、アイテム、チェンジ、ポーズのうち、一度に2つ以上の入力をしない
左右移動をあまりしない ×1.80 左右入力時間が全体の3%以下
左右移動をしない ×5.00 左右入力なし(上位)
上下移動をあまりしない ×1.10 上下入力時間が全体の3%以下
上下移動をしない ×3.00 上下入力なし(上位)
ナナメ移動しない ×1.60
移動しない ×30.0 (上位)
独壇場 ×1.05 片方のキャラが90%以上の時間戦闘する
チェンジしない ×1.30
チェンジが多い ×1.05 10回以上チェンジをする
一度に複数の敵を倒す ×1.00+0.01×(最大値ー1) 一つのショットの最大
一度に大量の敵を倒す ×1.00+0.02×(最大値ー5) 10体以上の場合(上位)
ジェノサイダー ×1.00+0.03×(最大値ー13) 30体以上の場合(上位)
相討ちになる ×1.10 ボスのスペルが終了すると同時にプレイヤーが喰らいボム受け付け中もしくは復活中になる
画面左右端シャトルラン ×1.001(乗算) 左右端を行き来する。(10回以上)会話中は無効
画面上下端シャトルラン ×1.003(乗算) 上下端を行き来する。(5回以上)会話中は無効
ポーズを多用した ×0.95 5回以上ポーズを使用する
ポーズを使いすぎた ×0.80 10回以上ポーズを使用する
ソーサラー ×1.10 魔法を100回以上使う
しかしMPが足りなかった×0.99(乗算) MPが足りないのに魔法を発動しようとする、もしくはボムがないのにボムを発動しようとする(ブザー)
丸腰 ×2.00 一切の装備をしない
属性統一 ×1.50 装備の属性が1種類のみ
出オチ ×1.05 戦闘開始後5秒以内にミスする
長期戦 ×1.20 10分以上戦闘する
死闘 ×1.50 20分以上戦闘する
その他
欠片を入手 ×1.20 「アレクサンドライトの欠片」を入手
欠片を落とす ×0.90 「アレクサンドライトの欠片」を消失する
欠片を落としそうになる ×1.05 「アレクサンドライトの欠片」を5回以上落とすが消失しない
HPがゾロ目 ×1.05
HPがゾロ目(相方) ×1.05
MPがゾロ目 ×1.05
MPがゾロ目(相方) ×1.05
二人のHPが同じ ×1.08
二人のMPが同じ ×1.10
スコアの下2桁がゾロ目 ×1.05
スコアの下3桁がゾロ目 ×1.15 (上位)
グレイズの下2桁がゾロ目×1.05
グレイズの下3桁がゾロ目×1.10 (上位)
スコアボーナス数が多い ×1.50 ここまでのスコアボーナス数が30以上
スコアボーナスが少ない ×4.00 ここまでのスコアボーナス数が5以下
スコアボーナスが高い ×1.20 ここまでのスコアボーナス倍率が5倍以上
スーパープレイ ×1.50 ここまでのスコアボーナス倍率が10倍以上(上位)
ゲーマー ×2.00 ここまでのスコアボーナス倍率が20倍以上(上位)
スコアボーナスが低い ×0.80 ここまでのスコアボーナス倍率が0.9倍以下
トータルスコアが1ケタ ×1.00
バグが色んなところに潜んでそうで怖いです。
アイテム全回収とアイテムを取らないのボーナスが両方とれておかしいなあ。
なんてことがあったので、ボーナス関係は要注意ですね。バグがあっても致命的ではありませんが・・・。
怖いのはもっと根本的な奴です。リプレイとか。
装備の仕様を大幅変更しました。
今までは、プレイヤーが持つショットの種類の情報は、「持ってる全装備の上から何番目か」というint型を持たせていました。
これだと全装備を並べ替える処理が大変になりそうなので、「別にプレイヤーに装備のデータ(Cequip型)持たせればよくね?」
となって変更することにしましたが、変更場所の多いこと多いこと。
やはり仕様変更は早めにやっとかないといけませんね。
今回3Dにまた一歩足を踏み入れました。ゲーム中ではアレキサンドライトの欠片として登場したアイテムです。
これは全面的に3Dで描画しています。(宝石と回ってる白いの)
今までの3Dは、2Dの画像を3D空間に描画するものですが、今回厚みのあるものに挑戦しました。
よくよく考えてみれば、3Dモデルだって2D画像の集まりなんですよね。
そんなわけで、あの宝石は3角形の集合で立体的に見せています。
これが苦労したのなんの。VERTEX3D型の変数、VECTOR normとCOLOR_U8 difとCOLOR_U8 spcの意味が全然わからんし、
他にもライトとかカメラとか意味不明な言語が飛び交ってて、調べながらコードをいじって試行錯誤していました。
そしてnormが光を反射する方向のようなものを意味していて、今までこれが全てのポリゴンで同じ値だったため、うまくいかなかったことがわかりました。
なるほど、こいつをいじればいいのか。というわけで3頂点の重心を出して、宝石の中心座標とのベクトルの差を取ればそれっぽくなるんじゃないの?
なりました。ヽ( ´¬`)ノ ワ~イ
しかしここで次の問題が。
光が当たらないところは真っ暗になって何も見えなくなってしまうのです。
ここでまた試行錯誤して突き止めたのがエミッシブカラーです。
こいつは自己発光色を設定できるらしいです。
光が当たってないと見えるのはおかしいですが、ゲーム中では見えないと困ります。発光させちまいましょう。
(アイテムはゲーム中で真っ暗でも見えるのが当然なので周囲の反射光を自己発光に置き換えただけです)
そんなわけで光が当たってない部分も無事見えて、あんな感じになりました。
これを応用すればいろいろなものが作れるんじゃないか・・・?
3Dにだんだん興味が湧いてきました。
いずれ3D弾幕も作るのではと思います。(一口に3Dと言っても色々ありますが)
次はお金どうしよう。
なんのことかというと、敵を倒した時に落とすお金です。
敵を出現させるときにいちいち金額を設定するなんてめんどくさくてありゃしないので、モンスター図鑑からデータをもらうことにします。
あ、ちなみにHPもモンスター固有の値です。
しかし、みんながバラバラとお金を落としては、画面がお金で埋め尽くされてしまいます。これは困ります。紛らわしいです。
そんなわけでよく出る敵の場合はキリのいい金額を落として数を減らすことにしました。
(1G,5G,10G,100G,1000G,10000Gとあるので、1~2枚で済むように金額を調整)
まだあります。
処理落ちがー処理落ちがぁーーー・・・・orz
ここにきて無視できないレベルになってきました。
なにがいけないかはわかっています。
ソートです。
stable_sort()で弾の描画順を入れ替えているのが原因です。こいつが重い。
で、この関数を呼ぶ条件なのですが、「敵が弾を撃ったフレーム」に1度呼ばれます。
つまり、たくさんの弾を同じフレームに大量に出す時よりも、毎フレームちびちびと出す時の方が処理が重くなるんです。
これは当然といえば当然です。例えば60Fに1回ソートするとした場合、60Fおきに弾の見え方が前後することがあるからです。
(stable_sortなので、一度ソートされたもの同士では前後しないはずですが)
ですので理想としては弾を撃ったフレームにソートできるのが望ましいです。でも重い。どうしよう。
しかしこうなっては5Fに1回などの条件を追加しなければいけないかもしれません。
5Fくらいならバレないかなぁ・・・?
弾を発射した瞬間は発射エフェクトで弾が見えないのでとりあえず前のソートから5F経ってない場合は5F待ってソートすることにします。
最後に、リプレイにスロー再生をつけてみたが果たして誰得なのだろうか。
・・・俺得なのは間違いない。
プレイヤーや弾の動きを検証したりするのに役立ちそうですね。
長々と読んでいただいてありがとうございます。
ゲームの仕様のアイデアはとにかくたくさんの意見が欲しいので何か思ったことがあれば教えていただければ幸いです。
ではでは。
ちなみに毎年恒例の高尾山おみくじは吉でした。
・・・普通だなー。