私の問題はおそらく皆さんにとって非常に単純です。私はプログラミングが初めてなので、そうです。
画面の中央に円を配置したいです。次に、プレーヤーが円に近づくと、来た方向に対して押しのけられるようにしたいと思います。クリア
赤い円は別の方向から来るプレイヤーで、緑の円は障害物です。矢印は、プレイヤーが x、y 軸でのみ移動するためにプレイヤーを押すべき方向を示しています。
お時間をいただきありがとうございました
私の問題はおそらく皆さんにとって非常に単純です。私はプログラミングが初めてなので、そうです。
画面の中央に円を配置したいです。次に、プレーヤーが円に近づくと、来た方向に対して押しのけられるようにしたいと思います。クリア
赤い円は別の方向から来るプレイヤーで、緑の円は障害物です。矢印は、プレイヤーが x、y 軸でのみ移動するためにプレイヤーを押すべき方向を示しています。
お時間をいただきありがとうございました
プレイヤーの座標 (赤い円の中心) をデカルトのような画面システムから、中心の障害物 (緑の円) のオリゴで極座標に変換します。
その目的のために複素数を選択することが解決策になる可能性があります: complex(x,y) == polar(r,th)
. オブジェクトの半径が指定され、許容範囲の半径 ('close') も指定されます。プレイヤーの座標を反復処理し、大きさ (origo から赤い円の中心までの距離) を比較します。距離が半径 + 許容範囲の合計よりも大きい場合、それらは近いとは見なされません。それ以外の場合は、大きさが調整されます。出力座標を画面に逆変換すると、結果が得られます。
void PushAway( std::vector< std::complex< double > > & player_coords )
{
const double r_o = 3.0; // obstacle radius
const double r_p = 1.0; // player radius
const double r_t = 0.1; // 'close'
const double push = 10.0; // pushing amount
for( uint idx = 0; idx < player_coords.size(); ++idx )
{
std::complex< double > & pc = player_coords[idx];
double magn = std::abs( pc );
// too close ?
if( magn < r_o + r_t + r_p )
{
// push away in appropriate direction
pc = std::polar( push + magn, std::arg( pc ) );
}
}
}