
進捗動画#16を投稿しました。
今回はマップの読み込み機能を拡張しました。
↓↓動画はこちらから↓↓
https://youtu.be/KT1FOfpGIL0
最初→https://sns.freegame-contest.com/2644/
前回→https://sns.freegame-contest.com/2968/
次回→(作成中)

起動時のマップ読み込み
まずプレイヤーを中心とした5×5エリアが読み込まれます。
エリアはワールド全体を区切ったもので、読み込みの単位です。

並列処理
その後はゲームプレイと同時進行でマップ読み込みを行います。
並列処理とはマルチタスクのことです。
プログラムは通常、上から1行ずつ順番に処理しますが、
並列処理を活用することで複数の処理を同時に進められます。
本作は2Dシューティングのためリアルタイム性が大事だと考えています。
なのでマップの読み込み処理を挟んでしまうことで、
画面が止まってしないよう工夫が必要なのです。

エリアデータ管理
ワールド全てのエリアをロードするとメモリが大変なことになるので、
ゲーム内で直近で必要になるエリアのみをロードしてます。
エリアデータは一列で順番に並べて管理しています。
マップを描画するためにアクセスされたデータは列の先頭に移動します。
なのでアクセスされてないエリアは次第に列の後ろへ来ます。
エリアデータ数が一定数を超えると、後ろのデータを順次消去します。

次回読み込みエリア
プレイヤーの向きに応じて、あらかじめ読み込み順番が決まっています。
何か賢い処理方法はないかと考えましたが、最終的に力技に落ち着きました。

エリア読み込みタイミング
ゲーム中では、プレイヤーを中心とした5×5エリアが
読み込まれているようにしています。
なのでプレイヤーがエリアを移動したら
新たに5×5に含まれるエリアが読み込まれます。
読み込みが完了したらマップ読み込みを停止して、処理負担を軽減します。

排他処理
エリアデータは一列で並んでおり、削除やアクセス、生成で順番が変わります。
これらの処理はゲームプレイとマップ読み込みの両方で発生します。
なのでタイミングが悪いと、削除後のデータにアクセスしようとしたり、
並び順が変わって別のデータにアクセスしてしまったりしてエラーになります。
そこで排他処理を導入しました。
データへのアクセスが発生した時、アクセス終了まで鍵をかけ、
別のところからのアクセスをブロックします。
同時に操作できないようにして、エラーが起きないようにします。

動作確認
最後にちょっと動作確認。
今はマップに陸と海しかないので、最も近い海へ向かってドライブしました。
3分間、エリアを読み込みながら滞りなく車を進められ
無事に海に到着しました。

次回
実はこの動画(コラム)を作っている頃、
既に今回作ったシステムは、ほぼほぼ作り直しとなりました。
地形タイルの境界線の処理を追加したら、
画面がガクガクになってしまったのが原因です。
なので次回内容は未定。
これを書いている今の私にも分かりませぬ……。
コメント
コメント ( 0 )
トラックバックは利用できません。
この記事へのコメントはありません。