CDW マップを複数画面にする Part3


2022年 2月 11日
 
 
 最後にキー入力の座標計算をする。

 座標の計算そのものは HEXの x座標 mkx lxを足すだけでできた。

訂正 : 以下の式が必要でした。

 if mkx>=(hxb+schk) : mkx-=(hxb+schk)

 赤枠の部分です。

 つまりこの場合、横の HEX数 hxb=37、海の余白 schk=2で、全長さ 39ですけど、マップの左端座標は 0なので 1週すると 0が 39になります。

 ですので mkx(マウス座標)に lx(スクロール座標)を足した座標が 39オーバーなら 39引きます。

 これでも動いてるように見えたのは、マップデータが 1次元配列だったために 39のズレが、トータルで y座標が 1個ズレるような感じの事になったからです。
 
 

 カーソルの座標は mx,my

 そこから HEXの座標 mkx,mkyを算出する。

 見ての通り mkx+=lxで mkxに lx(スクロール座標)を足してる、変更はそれだけだった(訂正しました)

 y座標はスクロールせず固定なので変更無し。

 最終的に算出する HEXの座標は mknになる、いつもながら縦横を 1次元配列で扱っているため。
 
 
 さて問題なのは、むしろキー入力の処理。

 何が問題かと言うと「押して放す操作」と「押したままドラッグしてスクロールさせる操作」を判定しないといけない。

 でも、これは前に 1MAP防衛シューティングの時にやったので、今回はそのソースを元にして割りと簡単にできた。

 プログラムは 1度思考錯誤して作成すると割と使いまわすだけで済む、なんかプログラム用語では「同じ車輪を 2度発明するな」とかなんとかいう言葉があった。
 
 
 考え方としては「押してる」状態の処理と「押してない」状態の処理を分けて処理する事。

 状態(モード)を kf(キーフラグ)で管理する事。

 kfフラグにより、押した kf=1、そこから放した kf=2のように処理できる(このソースでは kf=2はスクロールモードになってる)

 kf=0 の時押した座標を元にして、kf=1の処理で移動距離が 8ドット以上の時に kf=2にしてスクロール処理している。

 lx=keplx+(kepx-mx)/20 でスクロールする HEX数(lx)を算出している。

 /20と言うのは移動量で、HEXの幅が30ドットなので、この数字を /30にすれば、なぞったドットと等速でスクロールする、/20は少し早めのスクロールになる。
 
 
 
 次に問題なのは CPUが自動操作している状態でのスクロール操作。

 当然 CPUが行動している状態でもマップ画面をスクロールして確認したい。

 戦闘状態の時はスクロールしないとして、それ以外の時のスクロールをしたい。
 
 
 まずキー入力を一元化する。

 押して放す、つまりタップ操作は必要無いので、これだけで LXを算出すれば済む。

 一元化したのは 8ドットずらしたらスクロールのような値を一元管理するため、と言っても先のものと合わせて今の所 2ヶ所だけ。
 
 
 とりあえずターンエンド時のダイス増の時に受け付けるようにした。

 これはターンエンドの画面表示ルーチンだけど、ここにスクロールのキー操作を入れた。

 なぜかと言うと await 1000/50 つまり FPS 20 で時間を待っているので、一番キー入力を受け付ける時間があるため。

 当然何かの処理中にキー入力をすると言うのは、ややこし過ぎる。
 
 
 実機にて確認。

 きちんと動いている。

 これでスクロールの実装はできた。

コメントを残す

メールアドレスが公開されることはありません。