#5
by かずま » 6年前
すみません。質問の意味を「現状では、特殊エリアの辺からは突入
できるが、それをできないようにして、特殊エリアの角からしか
突入できないようにしたい。」だと勘違いしていました。
やりたいことは、「特殊エリアの角からは突入するときは、プレイ
ヤーの辺の半分以上の辺が特殊エリアと重なっていないといけない」
ということですね。
言葉で説明するのが面倒なので、次のコードを参考にしてください。
コード:
#include "DxLib.h"
enum {
FX = 240, FY = 96, AX = 32, AY = 32, PX = 80, PY = 192,
W = 16, H = 16, W2 = W/2, H2 = H/2
};
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
const unsigned int GREEN = GetColor(0, 196, 0);
const unsigned int BROWN = GetColor(208, 66, 0);
const unsigned int BLUE = GetColor(0, 114, 255);
const RECT f = { FX, FY, FX+W*12, FY+H*15 }; // field
const RECT a = { FX+AX, FY+AY, FX+AX+W*7, FY+AY+W*9 }; // special area
RECT p = { FX+PX, FY+PY, FX+PX+W, FY+PY+W }; // player
char key[256];
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {
GetHitKeyStateAll(key);
if (key[KEY_INPUT_LEFT]) {
if (p.left > f.left && (p.left != a.right + 1 ||
(p.bottom > a.top + H2 || p.bottom < a.top) &&
(p.top < a.bottom - H2 || p.top > a.bottom)))
p.left--, p.right--;
}
else if (key[KEY_INPUT_RIGHT]) {
if (p.right < f.right && (p.right != a.left - 1 ||
(p.bottom > a.top + H2 || p.bottom < a.top) &&
(p.top < a.bottom - H2 || p.top > a.bottom)))
p.left++, p.right++;
}
else if (key[KEY_INPUT_UP]) {
if (p.top > f.top && (p.top != a.bottom + 1 ||
(p.right > a.left + H2 || p.right < a.left) &&
(p.left < a.right - H2 || p.left > a.right)))
p.top--, p.bottom--;
}
else if (key[KEY_INPUT_DOWN]) {
if (p.bottom < f.bottom && (p.bottom != a.top - 1 ||
(p.right > a.left + 8 || p.right < a.left) &&
(p.left < a.right - 8 || p.left > a.right)))
p.top++, p.bottom++;
}
DrawBox(f.left, f.top, f.right, f.bottom, GREEN, TRUE);
DrawBox(a.left, a.top, a.right, a.bottom, BROWN, TRUE);
DrawBox(p.left, p.top, p.right, p.bottom, BLUE, TRUE);
}
DxLib_End();
return 0;
}
すみません。質問の意味を「現状では、特殊エリアの辺からは突入
できるが、それをできないようにして、特殊エリアの角からしか
突入できないようにしたい。」だと勘違いしていました。
やりたいことは、「特殊エリアの角からは突入するときは、プレイ
ヤーの辺の半分以上の辺が特殊エリアと重なっていないといけない」
ということですね。
言葉で説明するのが面倒なので、次のコードを参考にしてください。
[code]
#include "DxLib.h"
enum {
FX = 240, FY = 96, AX = 32, AY = 32, PX = 80, PY = 192,
W = 16, H = 16, W2 = W/2, H2 = H/2
};
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
const unsigned int GREEN = GetColor(0, 196, 0);
const unsigned int BROWN = GetColor(208, 66, 0);
const unsigned int BLUE = GetColor(0, 114, 255);
const RECT f = { FX, FY, FX+W*12, FY+H*15 }; // field
const RECT a = { FX+AX, FY+AY, FX+AX+W*7, FY+AY+W*9 }; // special area
RECT p = { FX+PX, FY+PY, FX+PX+W, FY+PY+W }; // player
char key[256];
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {
GetHitKeyStateAll(key);
if (key[KEY_INPUT_LEFT]) {
if (p.left > f.left && (p.left != a.right + 1 ||
(p.bottom > a.top + H2 || p.bottom < a.top) &&
(p.top < a.bottom - H2 || p.top > a.bottom)))
p.left--, p.right--;
}
else if (key[KEY_INPUT_RIGHT]) {
if (p.right < f.right && (p.right != a.left - 1 ||
(p.bottom > a.top + H2 || p.bottom < a.top) &&
(p.top < a.bottom - H2 || p.top > a.bottom)))
p.left++, p.right++;
}
else if (key[KEY_INPUT_UP]) {
if (p.top > f.top && (p.top != a.bottom + 1 ||
(p.right > a.left + H2 || p.right < a.left) &&
(p.left < a.right - H2 || p.left > a.right)))
p.top--, p.bottom--;
}
else if (key[KEY_INPUT_DOWN]) {
if (p.bottom < f.bottom && (p.bottom != a.top - 1 ||
(p.right > a.left + 8 || p.right < a.left) &&
(p.left < a.right - 8 || p.left > a.right)))
p.top++, p.bottom++;
}
DrawBox(f.left, f.top, f.right, f.bottom, GREEN, TRUE);
DrawBox(a.left, a.top, a.right, a.bottom, BROWN, TRUE);
DrawBox(p.left, p.top, p.right, p.bottom, BLUE, TRUE);
}
DxLib_End();
return 0;
}
[/code]