#2
投稿記事
by あんどーなつ » 8年前
疑問1は本の内容なので(この掲示板の人たちはdixqさんのHPで勉強しているみたいですね)、私のほうで回答いたします。
6章のゲームでは、十字キーで前進、後退、左を向く、右を向くという動作ができます。
左右の矢印で方向転換をすると、g_stagedata.directionが0~3まで変化します。
g_viewとg_mvという配列がDraw3DMap関数で呼び出されていますが、例えば主人公が(3, 3)の位置にいて、EASTを向いている場合は、
g_stagedata.x = 3
g_stagedata.y = 3
g_stagedata.direction = 1
となり、Draw3DMap関数内でy, xは、
(y, x) = (3, 0), (3, 2), (3, 1), (2, 0), (2, 2), (2, 1), (1, 0), (1, 2), (1, 1), (0, 0), (0, 2), (0, 1)
の順でカウントされます。これらについて、hy, hxが計算されますが、
(hy, hx) = プレイヤーの座標 + g_view[方向][横方向index] + g_mv[方向] * 奥行き方向index
という計算を行っています。横方向indexとはsortxのことであり、奥行き方向indexとはyのことを指します。
つまり、
g_viewは、各方向(g_stagedata.direction)について横方向の座標を指し示すもの、
g_mvは、各方向(g_stagedata.direction)について奥行き方向の座標を指し示すもの、
となります。EASTを向いている場合、プレイヤー(3, 3)の座標は(3, 3), プレイヤーの右隣は(3, 4), プレイヤーの左隣は(3, 2)となりますね。
なので、g_view[1] = {{0, -1}, {0, 0}, {0, 1}}となっている必要があります。
同様にg_mv[1] = {1, 0}となります。
これらをNORTH, SOUTH, WESTにも適用すると、gamemain.cppの先頭にあるg_view, g_mvの定義の形となる、ということです。