在与物体发生碰撞时,如何修正间隙?(使用AABB碰撞检测)

编程语言 2026-07-10

所以我在尝试做一个平台跳跃游戏,但我不知道该怎么修复这个奇怪的问题。我走不到墙边,因为墙那里已经有碰撞检测了。我知道为什么会这样(是因为我在减去dx),但我不知道该怎么修复。

void MovePlayer()
{
    float dx = 0; 

    if(keys.right) dx += (plr.speed * g_deltaTime);
    if(keys.left) dx -= (plr.speed * g_deltaTime);


    plr.myCollider->position.x += dx;

    Collider *temp = collider_head.next;
    while(temp != NULL) {
        Collider *next = temp->next;
        if(temp != plr.myCollider && temp->type == COLLIDER_STATIC && isColliding(plr.myCollider, temp)) {
            plr.myCollider->position.x -= dx;


        }
        temp = next;
    }

    plr.y_velocity += GRAVITY * g_deltaTime;

    float dy = plr.y_velocity * g_deltaTime;
    plr.myCollider->position.y += dy;


    temp = collider_head.next;
    while(temp != NULL) {
        Collider *next = temp->next;
        if(temp != plr.myCollider && temp->type == COLLIDER_STATIC && isColliding(plr.myCollider, temp)) {
            plr.myCollider->position.y -= dy;
            if(plr.y_velocity > 0) {
                plr.grounded = TRUE;
            }

            plr.y_velocity = 0;
        }
        temp = next;
    }
    if(keys.up && plr.grounded) {
        plr.y_velocity = -110;
        plr.grounded = FALSE;
    }

    if(keys.up && plr.y_velocity < 0) {
        plr.y_velocity += -90.0f * g_deltaTime;
    }
}

解决方案

我照Eric说的做。不是把dx减去,而是把它设为墙的位置(更具体地说,是墙边的位置)。有一个+1和 -1,因为玩家会卡在墙里。(玩家碰撞体的宽度是12,高度是24)

  Collider *temp = collider_que.next;
  while(temp != &collider_que)
  {
    Collider *next = temp->next;
    if(temp != plr.myCollider && temp->type == 2 && isColliding(plr.myCollider, temp))
    {
      if(dx > 0)
      {
        plr.myCollider->position.x = temp->position.x - 1 - plr.myCollider->size.x;
      }else{
        plr.myCollider->position.x = temp->position.x + 1 + temp->size.x;
      }
    }
    temp = next;
  }
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章