1

我的问题对你们来说可能很简单,我只是编程新手,所以是的。

我想在屏幕的中心画一个圆圈,然后我希望当一个玩家靠近它时,他会相对于他来自的方向被推开,这是我画的一个小图清除图片

红色圆圈是来自不同方向的玩家,绿色圆圈是障碍物。箭头显示玩家应该被推向哪个方向 玩家仅在 x,y 轴上移动

非常感谢您的宝贵时间

4

1 回答 1

0

将玩家坐标(红色圆圈中心)从类似笛卡尔的屏幕系统转换为具有中心障碍物原点(绿色圆圈)的极坐标。

为此目的选择复数可能是一个解决方案: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 ) );
        }
    }
}
于 2015-10-14T14:53:54.977 回答