ゲームを作っていると、ステージを切り替えたりしたくなる事ありますよね。
それを実現するのがゲームきりかえノードンです。このノードン前のゲームの状況を受け渡す事が出来る様に引き継ぎたい値を渡す事ができるのですが、これが1つだけしか渡せないんですよ。
しかし、創意工夫で2つ以上の値を次のゲームに引き渡す方法があるので紹介したいと思います!
動画でも解説しています。よろしければチャンネル登録お願いします。
ゲームを切り替える時に2つ以上の値を前のゲームから引き渡す
ゲームを切り替える時に次のゲームに2つ以上の値を引き継ぐには、普通にやってもできません。しかし工夫次第で可能です。まずはゲームきりかえノードンの基本仕様を把握しておきます。
ゲームきりかえノードンは入力ポートから入った値をそのまま次のゲームに引き渡す
ゲームきりかえノードンは入力ポートからインプットされた値を出力ポートから出して次のゲームに引き渡します。前のゲームから値を1つだけ次のゲームに引き渡す事が可能な仕様になっています。
この仕組みを使う事で、前のゲームの状態を引き継ぐ事ができて、ゲームの展開を広げる事が可能になります。
例えば残機数だったり、レベルだったり。スコアだったりとアイデアが膨らみます。
しかし、ゲームによっては引き継ぎたい値が2つ以上なんて事もありますよね。むしろ1つだの方が少ないかも?と思うくらいです。
普通にやっても1つしか渡せないので不可能です。
次のゲームに2つ以上渡す工夫
2つ以上値を渡すを渡すには工夫が必要になります。
ゲームきりかえノードンは1つしか値を出力できません。
そこで、複数の値を1つの値にしてしまえば良い訳です。
例えばスコアと残機数を次のゲームに引き渡したいとします。
スコア | 10000 |
残機数 | 2 |
これらを次のゲームに渡したいとします。
1つの値にすると言っても、単純に足すと10002になってしまいます。このままだと次のゲームで10002の内、スコアがいくつで残機数がいくつか判断できません。
そこでそれぞれ干渉しない様に桁を変えてつの値にしてあげれば良い訳です。
例えばスコアを100倍して残機数と足してあげると1000002になります。こうすれば下2桁が残機数。上5桁がスコアとわかるので、次のゲームではスコア10000、残機数2と復元が可能になります。
ゲームきりかえの時に2つ以上の値を引き継ぐためのアルゴリズム
ゲームきりかえ用の値のフォーマットを決めます。
残機数 | 下1~2桁 |
スコア | 下3~7桁 |
この様に決定します。
スコアを100倍して残機数と足して1つの値にしてフォーマット通りにしてゲームきりかえノードンに値を渡すようにします。
次に切り替え先のゲームで値を復元します。
まず残機数を取り出します。引き継がれた値を100で割ったあまりが残機数になります。1000002を100で割ったあまりなので2が求まります。これが残機数になります。
そして、引き継がれた値から余りを引いた数を100で割った答えがスコアになります。
注意が必要なのが引き継がれた値をそのまま100で割ると10000.02になってしまう点です。切り捨てをしてあげれば良いのですが、どの道あまりの数値も使うのであまりから引いてしまう方法を取ります。
3つ以上の場合、この処理を繰り返してフォーマット通りの桁数を取り出すようにしていく事で2つ以上の値を次のゲームに渡す事が可能です。
はじめてゲームプログラミングでModを実現する方法
複数の値を次のゲームに引き渡すために、引き継ぎ用の値のフォーマットを決定して、所定の桁数から値を抜き出す方法を紹介しました。これを実現するために「あまり」を求める必要があります。
あまりを求める関数としてMod関数が有名です。
しかしはじめてゲームプログラミングでは「あまりをもとめる」ノードンが存在しません。自前でくみ上げる必要があります。
「あまり」をもとめる方法はいくつかあります。一番単純な方法は数値を除数(割る数)で除数より小さくなるまで引き続ける方法です。はじめてゲームプログラミングではカウンターノードンを変数の様に取り回しよく使うのが難しいので、この方法はあまり実用性がない方法になります。
そこで割り算の答えの小数点以下を切り捨てた数値を除算でかけて、余りが無い時の数値を求めます。もともとの数値から余りのない数値を引く事と余りがでてきます。
これでMod関数と同等の余りを求める方法を実現しています。
切り捨て(floor関数)について
小数点以下を切り捨てるノードンも存在しません。これも自分で組み上げる必要があります。
切り捨ての前に四捨五入の方法です。四捨五入は非常に簡単です。デジタルノードンの分割数を「2」にすると四捨五入になります。
切り捨てはデジタルノードンに渡す数値から-0.5引いてあげれば大丈夫です。ただ、0以下の数値になると負の方向に丸められるので、その場合はデジタルノードンの結果に1を足してあげる必要があります。
コメント