[image]https://dl1.getuploader.com/g/zipcodezi ... 83/011.jpg[/image]
プレイヤーは16×16です。
緑色のスペースがフィールドで、茶色のスペースが特殊エリアです。
特殊エリアには上下左右、どこからでも突入できるのですが
現状では画像の1や2のように、
プレイヤーの接触判定ぎりぎりでも重なっていれば、入れてしまいます。
それをできないようにしたいのですが非常に苦労しております。
●プレイヤーの半分以上が特殊エリアに重なる状況で進行した場合に
特殊エリアに入れるようにしたい。
●つまり、1や2の状況では特殊エリアに入れないようにしたい
●プレイヤーの接触判定のサイズは16×16から変更不可です。
●また、特殊エリアの接触判定サイズも1ブロック16×16で変更不可です。
良い考えが思いつきません。
お知恵を、アイデアをお貸し下さい。
ちなみに、逆に、ギリギリで特殊エリアに入ったら
プレイヤーの体を特殊エリアに全部入るように強制移動させようとも
考えましたが、断念しました。
ギリギリで入ったと認識する処理が思いつかなかったため。
どなたかお知恵をお貸し下さい
Re: どなたかお知恵をお貸し下さい
次のように考えればよいのではありませんか?
プレイヤーの正方形の 4点のうち、
1点だけが特殊エリアに入ることは許すが、
2点が同時に特殊エリアに入ることは許さない。
1点が入った後は、他の点が入ることを許し、
特殊エリアに重なった部分の面積がプレイヤー
の面積の半分を超えたかどうかを判定する。
もっと具体的に知りたい場合は、現在のプログラム
のソースコードを見せてください。
プレイヤーの正方形の 4点のうち、
1点だけが特殊エリアに入ることは許すが、
2点が同時に特殊エリアに入ることは許さない。
1点が入った後は、他の点が入ることを許し、
特殊エリアに重なった部分の面積がプレイヤー
の面積の半分を超えたかどうかを判定する。
もっと具体的に知りたい場合は、現在のプログラム
のソースコードを見せてください。
Re: どなたかお知恵をお貸し下さい
>プレイヤーの正方形の 4点のうち、
>1点だけが特殊エリアに入ることは許すが、
>2点が同時に特殊エリアに入ることは許さない。
すみません、例えばPが
特殊エリア正面の中心あたりから飛び込んだ場合
必ず2点が同時に入ることになりませんか?
Pの正方形の4点ってのは四つの角ですよね?
>1点が入った後は、他の点が入ることを許し、
>特殊エリアに重なった部分の面積がプレイヤー
>の面積の半分を超えたかどうかを判定する。
「重なった部分の面積がプレイヤーの面積の半分を超えたかどうか」
その判定をするための処理が思いつかないので
もう少しシンプルな方法はありませんか?
プログラミングって、行き着く先が同じでも
その処理方法には人により様々なんですよね?
かずまさんの今回の案は、私には難易度が高いです。
難易度を下げた違うアプローチでなにか方法ありませんか?
>1点だけが特殊エリアに入ることは許すが、
>2点が同時に特殊エリアに入ることは許さない。
すみません、例えばPが
特殊エリア正面の中心あたりから飛び込んだ場合
必ず2点が同時に入ることになりませんか?
Pの正方形の4点ってのは四つの角ですよね?
>1点が入った後は、他の点が入ることを許し、
>特殊エリアに重なった部分の面積がプレイヤー
>の面積の半分を超えたかどうかを判定する。
「重なった部分の面積がプレイヤーの面積の半分を超えたかどうか」
その判定をするための処理が思いつかないので
もう少しシンプルな方法はありませんか?
プログラミングって、行き着く先が同じでも
その処理方法には人により様々なんですよね?
かずまさんの今回の案は、私には難易度が高いです。
難易度を下げた違うアプローチでなにか方法ありませんか?
Re: どなたかお知恵をお貸し下さい
> プレイヤーの半分以上が特殊エリアに重なる状況で進行した場合に
> 特殊エリアに入れるようにしたい。
だったら,「半分以上が重なる」のか否かを判定すればよいのではないでしょうか.
(問題点が何なのかがわからん)
【「半分以上が重なる」=辺の中心位置がエリア内に入る】ということであれば
辺の中央座標に関する判定を行うことを考えればよいのでは.
> 特殊エリアに入れるようにしたい。
だったら,「半分以上が重なる」のか否かを判定すればよいのではないでしょうか.
(問題点が何なのかがわからん)
【「半分以上が重なる」=辺の中心位置がエリア内に入る】ということであれば
辺の中央座標に関する判定を行うことを考えればよいのでは.
Re: どなたかお知恵をお貸し下さい
すみません。質問の意味を「現状では、特殊エリアの辺からは突入
できるが、それをできないようにして、特殊エリアの角からしか
突入できないようにしたい。」だと勘違いしていました。
やりたいことは、「特殊エリアの角からは突入するときは、プレイ
ヤーの辺の半分以上の辺が特殊エリアと重なっていないといけない」
ということですね。
言葉で説明するのが面倒なので、次のコードを参考にしてください。
できるが、それをできないようにして、特殊エリアの角からしか
突入できないようにしたい。」だと勘違いしていました。
やりたいことは、「特殊エリアの角からは突入するときは、プレイ
ヤーの辺の半分以上の辺が特殊エリアと重なっていないといけない」
ということですね。
言葉で説明するのが面倒なので、次のコードを参考にしてください。
#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;
}
Re: どなたかお知恵をお貸し下さい
2つの H2 と 2つの 8 を W2 にしてください。かずま さんが書きました: ↑6年前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++; }