Обнаружение столкновения между сущностями, преследующими игрока - PullRequest
0 голосов
/ 27 декабря 2011

Я пытался заставить столкновение работать с моей маленькой игрой сверху вниз.У меня есть куча сущностей, которые преследуют игрока.Если у меня не будет столкновения, они, очевидно, все окажутся в одном месте.Я знаю, как проверить, не произошло ли столкновение, но я не могу понять, как на него реагировать.У меня получилось немного поработать, просто возиться с ним пару часов, но это не очень хорошо.

if ( check_collision( enemies[e1]->xPos, enemies[e1]->yPos, SIZE_ENEMY, SIZE_ENEMY, enemies[e2]->xPos, enemies[e2]->yPos, SIZE_ENEMY, SIZE_ENEMY ) == true )
{
      //the distance that is intersecting
    float dx, dy;

    if ( enemies[e1]->xPos > enemies[e2]->xPos )
        dx = enemies[e2]->xPos + SIZE_ENEMY - enemies[e1]->xPos;

    if ( enemies[e2]->xPos > enemies[e1]->xPos )
        dx = enemies[e1]->xPos + SIZE_ENEMY - enemies[e2]->xPos;

    if ( enemies[e1]->yPos > enemies[e2]->yPos )
        dy = enemies[e2]->yPos + SIZE_ENEMY - enemies[e1]->yPos;

    if ( enemies[e2]->yPos > enemies[e1]->yPos )
        dy = enemies[e1]->yPos + SIZE_ENEMY - enemies[e2]->yPos;

    if ( dx < dy )
    {
        enemies[e1]->xPos += (dx / 2);
        enemies[e2]->xPos -= (dx / 2);
    }

    if ( dy < dx )
    {
        enemies[e1]->yPos += (dy / 2);
        enemies[e2]->yPos -= (dy / 2);
    }

}

Возможно, я просто полностью сделал это неправильно, или я мог просто пропуститьНесколько вещей, поэтому любая помощь приветствуется.

1 Ответ

0 голосов
/ 27 декабря 2011

При расчете следующей позиции объекта проверьте, не будет ли столкновения с другим объектом. Если это так - просто не перемещайте эту сущность вообще.

Другой подход заключается в расчете расстояния и вектора от одного объекта к другому. Расстояние рассчитывается по теореме Пифагора: d = (x1-x2)^2 + (y1-y2)^2. Если d <<code>2*SIZE_ENEMY, то они перекрываются, и вы должны переместить одну из них на вектор (x2-x1, y2-y1) как минимум на dd = 2*SIZE_ENEMY - d:

newx2 = x2 + (x2-x1) * дд / (2 * SIZE_ENEMY)

newy2 = y2 + (y2-y1) * дд / (2 * SIZE_ENEMY)

Надеюсь, я не ошибся в формулах:)

...