#5
by かずま » 5年前
box と teki の値を見ましたか?
見ましたか? この質問には絶対に答えてください。
Visual Studio を使って、デバッグしているのだったら、
init_box() 実行後にブレークポインタで止めて、簡単に見ることができます。
int box[4][7][2] は
コード:
(182,237) (255,237) (328,237) (400,237) (472,237) (545,237) (618,237)
(157,286) (238,286) (319,286) (400,286) (481,286) (562,286) (643,286)
(130,340) (220,340) (310,340) (400,340) (490,340) (580,340) (670,340)
(100,400) (200,400) (300,400) (400,400) (500,400) (600,400) (700,400)
int teki[5][5][2] は
コード:
( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0)
( 0, 0) (185,195) (262,195) (339,195) ( 0, 0)
( 0, 0) (163,247) (249,247) (334,247) ( 0, 0)
( 0, 0) (140,304) (235,304) (330,304) ( 0, 0)
( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0)
WinMain の最初で、SetGraphMode(780, 680, 32); を実行しているから、
画面サイズは 780 x 680 です。
box と teki は、この画面の中に描画するステージの位置や敵の位置です。
[4][7] や [5][5] の意味は分かりますよね。
[2] はその位置の x座標と y座標の 2つです。
だから、DrawLine や DrawGraph で使っているのです。
ステージは、3 x 6 のマスですよね。
したがって、横線 3本、縦線 7本を書かないといけません。
1つのマスを 100 x 100 だとすると、
コード:
(100,220) (200,220) (300,220) (400,220) (500,220) (600,220) (700,220)
(100,280) (200,280) (300,280) (400,280) (500,280) (600,280) (700,280)
(100,340) (200,340) (300,340) (400,340) (500,340) (600,340) (700,340)
(100,400) (200,400) (300,400) (400,400) (500,400) (600,400) (700,400)
これは、2D の場合です。
3D だと、斜めから見ますから、縦の長さが小さくなります。
1つのマスを 100 x 60 にしてみましょう。
一番下を基準にしたので、上の 3つの位置の y座標が 60ずつ小さくなります。
奥に行くほど、横の長さも小さくなります。
一番下のマスを長方形ではなく、上底90、下底100、高さ60 の台形にします。
ひとマス上に行くと横幅(width)が 90% になるようにするわけです。
ひとマス上の台形は高さ(height)も 90% にします。
これが w = w * 9 / 10, h = h * 9 / 10; の意味です。
box[ i][j][0] = w + 400, box[ i][j][1] = h - 200;
の 400 と -200 は、(400,400) を基準にしたからです。
-200 は h の初期値を 600 にしたからです。
敵はマスの真ん中に立ちますよね。
一つのマスの左上と右下の中点の座標になります。
コード:
teki[i][j][0] = (box[i - 1][j - 1][0] + box[i][j][0]) / 2 - 25;
teki[i][j][1] = (box[i - 1][j - 1][1] + box[i][j][1]) / 2 - 66;
足して 2で割って中点です。[0], [1] は x座標と y座標。
その中点で DrawGraph すると、画像が中点に立ちません。
画像のサイズは、LoadDivGraph で分かるように 49 x 66。
左に 25、上に 66 ずらすことによって、画像はマスの真ん中に立ちます。
フローチャートなんか書いていません。
正方形や台形や三角形の図を書いて考えました。
box と teki の値を見ましたか?
見ましたか? この質問には絶対に答えてください。
Visual Studio を使って、デバッグしているのだったら、
init_box() 実行後にブレークポインタで止めて、簡単に見ることができます。
int box[4][7][2] は
[code]
(182,237) (255,237) (328,237) (400,237) (472,237) (545,237) (618,237)
(157,286) (238,286) (319,286) (400,286) (481,286) (562,286) (643,286)
(130,340) (220,340) (310,340) (400,340) (490,340) (580,340) (670,340)
(100,400) (200,400) (300,400) (400,400) (500,400) (600,400) (700,400)
[/code]
int teki[5][5][2] は
[code]
( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0)
( 0, 0) (185,195) (262,195) (339,195) ( 0, 0)
( 0, 0) (163,247) (249,247) (334,247) ( 0, 0)
( 0, 0) (140,304) (235,304) (330,304) ( 0, 0)
( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0) ( 0, 0)
[/code]
WinMain の最初で、SetGraphMode(780, 680, 32); を実行しているから、
画面サイズは 780 x 680 です。
box と teki は、この画面の中に描画するステージの位置や敵の位置です。
[4][7] や [5][5] の意味は分かりますよね。
[2] はその位置の x座標と y座標の 2つです。
だから、DrawLine や DrawGraph で使っているのです。
ステージは、3 x 6 のマスですよね。
したがって、横線 3本、縦線 7本を書かないといけません。
1つのマスを 100 x 100 だとすると、
[code]
(100,220) (200,220) (300,220) (400,220) (500,220) (600,220) (700,220)
(100,280) (200,280) (300,280) (400,280) (500,280) (600,280) (700,280)
(100,340) (200,340) (300,340) (400,340) (500,340) (600,340) (700,340)
(100,400) (200,400) (300,400) (400,400) (500,400) (600,400) (700,400)
[/code]
これは、2D の場合です。
3D だと、斜めから見ますから、縦の長さが小さくなります。
1つのマスを 100 x 60 にしてみましょう。
一番下を基準にしたので、上の 3つの位置の y座標が 60ずつ小さくなります。
奥に行くほど、横の長さも小さくなります。
一番下のマスを長方形ではなく、上底90、下底100、高さ60 の台形にします。
ひとマス上に行くと横幅(width)が 90% になるようにするわけです。
ひとマス上の台形は高さ(height)も 90% にします。
これが w = w * 9 / 10, h = h * 9 / 10; の意味です。
box[ i][j][0] = w + 400, box[ i][j][1] = h - 200;
の 400 と -200 は、(400,400) を基準にしたからです。
-200 は h の初期値を 600 にしたからです。
敵はマスの真ん中に立ちますよね。
一つのマスの左上と右下の中点の座標になります。
[code]
teki[i][j][0] = (box[i - 1][j - 1][0] + box[i][j][0]) / 2 - 25;
teki[i][j][1] = (box[i - 1][j - 1][1] + box[i][j][1]) / 2 - 66;
[/code]
足して 2で割って中点です。[0], [1] は x座標と y座標。
その中点で DrawGraph すると、画像が中点に立ちません。
画像のサイズは、LoadDivGraph で分かるように 49 x 66。
左に 25、上に 66 ずらすことによって、画像はマスの真ん中に立ちます。
フローチャートなんか書いていません。
正方形や台形や三角形の図を書いて考えました。