ページ 11

どなたかお知恵をお貸し下さい

Posted: 2018年11月20日(火) 19:05
by 山岡
[image]https://dl1.getuploader.com/g/zipcodezi ... 83/011.jpg[/image]
プレイヤーは16×16です。
緑色のスペースがフィールドで、茶色のスペースが特殊エリアです。
特殊エリアには上下左右、どこからでも突入できるのですが
現状では画像の1や2のように、
プレイヤーの接触判定ぎりぎりでも重なっていれば、入れてしまいます。
それをできないようにしたいのですが非常に苦労しております。

●プレイヤーの半分以上が特殊エリアに重なる状況で進行した場合に
 特殊エリアに入れるようにしたい。
●つまり、1や2の状況では特殊エリアに入れないようにしたい
●プレイヤーの接触判定のサイズは16×16から変更不可です。
●また、特殊エリアの接触判定サイズも1ブロック16×16で変更不可です。

良い考えが思いつきません。
お知恵を、アイデアをお貸し下さい。

ちなみに、逆に、ギリギリで特殊エリアに入ったら
プレイヤーの体を特殊エリアに全部入るように強制移動させようとも
考えましたが、断念しました。
ギリギリで入ったと認識する処理が思いつかなかったため。

Re: どなたかお知恵をお貸し下さい

Posted: 2018年11月20日(火) 22:14
by かずま
次のように考えればよいのではありませんか?

プレイヤーの正方形の 4点のうち、
1点だけが特殊エリアに入ることは許すが、
2点が同時に特殊エリアに入ることは許さない。

1点が入った後は、他の点が入ることを許し、
特殊エリアに重なった部分の面積がプレイヤー
の面積の半分を超えたかどうかを判定する。

もっと具体的に知りたい場合は、現在のプログラム
のソースコードを見せてください。

Re: どなたかお知恵をお貸し下さい

Posted: 2018年11月21日(水) 10:39
by 山岡
>プレイヤーの正方形の 4点のうち、
>1点だけが特殊エリアに入ることは許すが、
>2点が同時に特殊エリアに入ることは許さない。

すみません、例えばPが
特殊エリア正面の中心あたりから飛び込んだ場合
必ず2点が同時に入ることになりませんか?
Pの正方形の4点ってのは四つの角ですよね?

>1点が入った後は、他の点が入ることを許し、
>特殊エリアに重なった部分の面積がプレイヤー
>の面積の半分を超えたかどうかを判定する。

「重なった部分の面積がプレイヤーの面積の半分を超えたかどうか」
その判定をするための処理が思いつかないので
もう少しシンプルな方法はありませんか?

プログラミングって、行き着く先が同じでも
その処理方法には人により様々なんですよね?
かずまさんの今回の案は、私には難易度が高いです。
難易度を下げた違うアプローチでなにか方法ありませんか?

Re: どなたかお知恵をお貸し下さい

Posted: 2018年11月21日(水) 14:27
by usao
> プレイヤーの半分以上が特殊エリアに重なる状況で進行した場合に
> 特殊エリアに入れるようにしたい。

だったら,「半分以上が重なる」のか否かを判定すればよいのではないでしょうか.
(問題点が何なのかがわからん)

【「半分以上が重なる」=辺の中心位置がエリア内に入る】ということであれば
辺の中央座標に関する判定を行うことを考えればよいのでは.

Re: どなたかお知恵をお貸し下さい

Posted: 2018年11月21日(水) 15:47
by かずま
すみません。質問の意味を「現状では、特殊エリアの辺からは突入
できるが、それをできないようにして、特殊エリアの角からしか
突入できないようにしたい。」だと勘違いしていました。

やりたいことは、「特殊エリアの角からは突入するときは、プレイ
ヤーの辺の半分以上の辺が特殊エリアと重なっていないといけない」
ということですね。

言葉で説明するのが面倒なので、次のコードを参考にしてください。

コード:

#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: どなたかお知恵をお貸し下さい

Posted: 2018年11月21日(水) 15:58
by かずま
かずま さんが書きました:
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++;
		} 
2つの H2 と 2つの 8 を W2 にしてください。