あたり判定の質問2
Rinifisu  2014/05/28(Wed) 08:32
不具合修正ありがとうございました。

CircleとRectのdrawFrameで出てくるフレームのみにあたり判定を加えたいのですが、どうすればできますか?

if (Circle(MBX, MBY, ALO2).drawFrame(5, 0, Palette::Purple).leftClicked) System::Exit();
// 円フレームをクリックすると終了させようとした

みたいに試していました。

画像の紫の円にあたり判定を加えたいです。



Reputeless  2014/05/28(Wed) 15:27
枠のあたり判定は提供していないので、工夫して求めます。
たいていは複数のあたり判定の組み合わせで解決します。

例えば円の枠と別の円とのあたり判定は
(外側の円に接触) && !(内側の円に含まれない) で求められます。

サンプル

# include <Siv3D.hpp>

bool IntersectCircleFrame(const Circle& circle, double thickness, const Circle& other)
{
return circle.stretched(thickness).intersects(other) && !circle.contains(other);
}

void Main()
{
const Circle circle(Window::Center(), 100);

while (System::Update())
{
const Circle player(Mouse::Pos(), 5);

const bool intersect = IntersectCircleFrame(circle, 20, player);

circle.drawFrame(0, 20, intersect ? Palette::Red : Palette::White);

player.draw();
}
}

このコードで使われている "contains" に対応した図形は多くないので、
必要な場合は自前で代替の実装をしてください。
Rinifisu  2014/05/29(Thu) 18:32
Circle Player(X, Y, Z);
Circle EnemyFrame(A, B, C);
Circle Enemy(A, B, C - N);

EnemyFrame.draw(N, 0);

if(EnemyFrame.intersects(Player) && !Enemy.contains(Player))
{

}

できました。
ありがとうございます。

- WEB PATIO -