在与物体发生碰撞时,如何修正间隙?(使用AABB碰撞检测)
所以我在尝试做一个平台跳跃游戏,但我不知道该怎么修复这个奇怪的问题。我走不到墙边,因为墙那里已经有碰撞检测了。我知道为什么会这样(是因为我在减去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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。