gpt4 book ai didi

c++ - 先进的碰撞检测?

转载 作者:行者123 更新时间:2023-11-28 05:51:50 24 4
gpt4 key购买 nike

您好,我目前正在制作一款类似于塞尔达传说的角色扮演游戏。我的游戏中有一个功能,当玩家用剑攻击敌人时,敌人会被击退 n 个单位。我有一个有时按预期工作的碰撞检测,有时敌人穿过墙并卡在另一边,然后其他时候敌人可以直接穿过墙。如果可能的话,我认为让敌人在与墙壁碰撞时向玩家移动是解决这个问题的一种可能方法,但我不知道如何实现。这是我当前的碰撞代码:

// Enemy Collides with Wall
counter1 = 0;
for (iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++)
{
counter2 = 0;
for (iter15 = wallArray.begin(); iter15 != wallArray.end(); iter15++)
{
if (enemyArray[counter1].rect.getGlobalBounds().intersects(wallArray[counter2].rect.getGlobalBounds()))
{
enemyArray[counter1].isCollided = true;
//Hit Wall
if ((enemyArray[counter1].direction == 1 || enemyArray[counter1].rect.getPosition().y >= wallArray[counter2].rect.getPosition().y)) //up
{
enemyArray[counter1].canMoveUp = false;
enemyArray[counter1].canMoveLeft = false;
enemyArray[counter1].canMoveRight = false;
enemyArray[counter1].rect.move(0, 7);
}
else if ((enemyArray[counter1].direction == 2 || enemyArray[counter1].rect.getPosition().y <= wallArray[counter2].rect.getPosition().y)) //Down
{
enemyArray[counter1].canMoveDown = false;
enemyArray[counter1].canMoveRight = false;
enemyArray[counter1].canMoveLeft = false;
enemyArray[counter1].rect.move(0, -7);
}
else if ((enemyArray[counter1].direction == 3 || enemyArray[counter1].rect.getPosition().x >= wallArray[counter2].rect.getPosition().x)) //Left
{
enemyArray[counter1].canMoveLeft = false;
enemyArray[counter1].canMoveUp = false;
enemyArray[counter1].canMoveDown = false;
enemyArray[counter1].rect.move(7, 0);
}
else if ((enemyArray[counter1].direction == 4 || enemyArray[counter1].rect.getPosition().x <= wallArray[counter2].rect.getPosition().x)) //Right
{
enemyArray[counter1].canMoveRight = false;
enemyArray[counter1].canMoveUp = false;
enemyArray[counter1].canMoveDown = false;
enemyArray[counter1].rect.move(-7, 0);
}
}
counter2++;
}
counter1++;
}



//Knock Back enemy away from sword && sword2
counterKnockBack++;
counter2 = 0;
for (iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++)
{
if (enemyArray[counter2].knockback == true)
{
if (enemyArray[counter2].isCollided == false)
{
if ((Player1.rect.getPosition().y > enemyArray[counter2].rect.getPosition().y))
{
enemyArray[counter2].rect.move(0, -3); //up
}
else if ((Player1.rect.getPosition().y < enemyArray[counter2].rect.getPosition().y))
{
enemyArray[counter2].rect.move(0, 3); //down
}
if ((Player1.rect.getPosition().x > enemyArray[counter2].rect.getPosition().x))
{
enemyArray[counter2].rect.move(-3, 0); //left
}
else if ((Player1.rect.getPosition().x < enemyArray[counter2].rect.getPosition().x))
{
enemyArray[counter2].rect.move(3, 0); //right
}
if (counterKnockBack >= 20)
{
enemyArray[counter2].knockback = false;
}
}
}
counter2++;
}

//turn off collided counter
counterCollided++;
counter2 = 0;
for (iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++)
{
if (enemyArray[counter2].isCollided == true)
{
if (counterCollided >= 30)
enemyArray[counter2].isCollided = false;
}
counter2++;
}

我不知道为什么敌人有时可以直接穿过墙而不会被击退。那么我该如何解决这个问题,有什么想法吗?

最佳答案

无需完整阅读代码,我就可以告诉您您的碰撞检测代码是错误的。主要是因为您直接移动对象,可能没有检查 rect::move 函数中的碰撞。

rect::move 函数可能会在不触发任何碰撞 react 代码的情况下移动物体穿过墙壁。考虑以下场景:

第一帧:
enter image description here
enemyArray[counterX].rect.move(3, 0);

第二帧:
enter image description here

敌方物体移动到墙后,不会触发碰撞检测代码。

我的建议是(尽管显而易见:阅读 some books ):为每个敌人存储其先前的位置并检查碰撞,不是在敌人和墙的矩形之间,而是在墙和两个敌人位置之间的矩形之间.类似的东西:
enter image description here

这当然只是您的碰撞检测代码容易出错的一种可能情况。

关于c++ - 先进的碰撞检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35081790/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com