移動アルゴリズムとの決着:未経験無職ゲーム制作日記4日目
こんばんは。さいとうです。
ようやくSRPGにおける移動のコードが書けそうです。
ここだけで一週間以上時間をかけたと思います。
需要があるかわかりませんが、JavaでのSRPGの移動アルゴリズムとコードを書いていきます。
1.アルゴリズムの説明
以前までのアルゴリズムは、イメージはできても僕の脳みそではJavaのコードでアウトプットできなかったので、他に何か方法がないか考えてみました。
過去に挑戦してあきらめたアルゴリズムについては、簡単にいうと「上→右→下→左」の順番に移動可能な範囲を虱潰していく方法でした。
詳しくは過去の日記を読んでいただけるとわかると思います。
そして新しく試した方法でうまくいきそうなのですが、その方法が移動力ごとに移動可能なマスかどうかを確認する方法でした。
キャラを中心に徐々に円形に広がるイメージです。
1マス目先が移動可能か確認、2マス先が移動可能か確認、3マス先が移動可能か確認…といった具合です。
Javaではx方面、y方面のどちらも1方向にしかベクトルを向けることができないので、確認範囲を4つに分割して、ループで回すことにしました。
これなら僕の足りない経験でも書けると思ったので、実際にコードに起こしていきます。
一応草案のメモも載せておきます。
/*
* 移動可能な範囲の探索
*
* キャラの現在位置が「x,y」、移動力がmovePowで
* 移動範囲が、| x ± a |、| y ± b |のとき
* movePow = a + b;
* となる。
*
* 1マス目移動時は
* (x±1,y)もしくは(x,y±1)となる
*
* 2マス目移動時は
* (x±2,y)もしくは(x±1,y±1)もしくは(x,y±2)となる
*
* iマス目移動時と、確認する条件の数(j)は
* i + 1 = j;
* といえる。
*/
2.コードに移す
public void checkMovable() {
//確認するマス目の値が移動力になるまで確認
for (int nextSquare = 1; nextSquare <= this.movePow; nextSquare++) {
//変数nextSquareマス目の移動時、確認する条件の数は(nextSquare+1)マス
for (int i = 0; i < (nextSquare + 1); i++) {
//左上を確認(条件:チェック範囲がxyともに0~20)
//x-(nextSquare-i),y-i
if ((this.x - (nextSquare - i)) >= 0 && (this.x - (nextSquare - i)) < 20
&& (this.y - i) >= 0 && (this.y - i) < 20) {
checkEntryCost(this.x - (nextSquare - i), this.y - i);
checkArea(this.x - (nextSquare - i), this.y - i, this.movePow - i);
}
//右上を確認 //x+(nextSquare-i),y-i;
//右下を確認 //x+(nextSquare-i),y+i;
//左下を確認 //x-(nextSquare-i),y+i;
}
}
}
こんな感じです。
まだ左上しかできていませんが、他の三方向も同じように書けばいいだけなのでもう出来上がったようなものです。
「checkEntryCost」メソッドと「checkArea」メソッドは前回までに作ったものをそのまま流用できました。
このコードを書きながらなんか見たことあるな、と思ったら過去に挫折を味わったループ文の課題でした。
*
**
***
****
とか
*
***
*****
*******
とかを多重ループで描画するという課題です。
上記の課題もそうですが、今までやってきたことの集大成な気がしてます。
継承とか、APIとか、ラムダ式とか全く使ってないですが(笑)
アイデアを形にするのがいかに難しく、いかに楽しいかわかった気がします。
プログラミングってやればやるだけハマっていきますね。
(とはいえ趣味の範囲ですが…)
3.最後に
便秘を解消したかのようなスッキリ感です。
出てこないときは本当に出てこないのに、出るときはすんなり出るもんですね。
今日はいい夢を見れそうです。
最後まで読んでいただきありがとうございます。
それではまた明日。