【ナミア】プレイヤーキャラを移動させる【開發日誌】

どうも、萬朶櫻(@wanduoying)、186朶目の記事です。

以前、プレイヤーと敵の動きを實裝しました。

【ローグライクゲー】キャラクターを移動させる【制作日記】

しかし、あの記述ではキャラクターが壁の中にめり込んだり、キャラクター同士が重なつたりします。

どうにかせねばなりません。

壁へのめり込み等を防ぐ考へ方

意圖としてはかうです。

動くときに移動先の座標が誰も居ない空間なら進める。何かがあるなら進めない。

その「移動先の座標が誰も居ない空間」かどうかの判別には、dungeonGeneratorのmap[,]とmapChara[,]を利用することにしました。

dungeonGeneratorについてはこのマップ生成の記事で作りました。

【ローグライクゲー】配列からマップを生成する2【制作日記】

具體的にはこのやうにします。

ワールド座標と、map[,]とmapChara[,]上での座標を一致させてゐるので、それぞれの配列の要素を參照し、「無」かつ「床」であれば進める。といつた具合です。

單純な事ですが、實裝するのに苦勞しました。

dungeonGeneratorのmapChara[,]の座標とワールド座標を一致させる

playerPosXとplayerPosZに、生成時の座標を代入しただけです。

ただし、playerPosX(int型)に座標(float型)を代入できないので、playerPosXFloatとplayerPosZFloatでワンクッション置いてゐます。

ともあれ、これによりplayerPosXがワールド座標のX座標に。とplayerPosZがワールド座標のZ座標に一致しました。

mapChara[playerPosX,playerPosZ]と書けば、プレイヤーのゐる所がmapChara上ではどんな要素か、と云ふ事がわかります。map[playerPosX,playerPosZ]でも同樣です。

實際の移動處理

プレイヤーの場合

5行目

  • dungeonGenerator.map[playerPosX – 1, playerPosZ] != 0 壁か床かの判斷
  • 2 <= dungeonGenerator.mapChara[playerPosX – 1, playerPosZ] 他キャラがゐるかどうか判斷

 

7~9行目は、これをやらないと實際にはプレイヤーが左に動いてゐるのに、mapChara[,]上でプレイヤーが動いてゐない、といふズレが生じるので必須です。

16行目は、進入不可なので向きだけの變更です。

プレイヤーの向きを定義する

この處理は現状で必要かどうか解らないんですが、將來的に必要になるかもしれないので入れてみました。

まづ最初にenumで8方向の向きを定義します。

  • 4行目 上、右上、右、右下、左下、左、左上、上 を定義
  • 5行目 どの向きでも良いが、とりあへず下で初期化

20行目、27行目で移動方向に應じて向きを變へる(この場合、左なのでLEFTにする)

 

プレイヤーについては、これで壁にめり込んだり敵と重ならないやうになりました。

プレイヤーのキー入力によつて動きが決定されるプレイヤーキャラとは違ひ、敵キャラ自動で處理せねばなりません。

これに少し苦勞してゐるので、また今度記事にしようと思ひます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA