C++ C++;基于重叠矩形的碰撞检测
我目前正在尝试复制蛙人,并且正在努力进行与水和原木相关的碰撞检测 如果青蛙跳到原木上,我可以让它和原木一起跳,如果青蛙与水相撞,我也可以让它重生,但我不能两者兼得。当我尝试的时候,水的碰撞比其他任何事情都重要 这可能是因为水是一个大长方形,上面的原木是较小的长方形,但原木的大小和运动使青蛙坐在原木上C++ C++;基于重叠矩形的碰撞检测,c++,visual-studio,sfml,C++,Visual Studio,Sfml,我目前正在尝试复制蛙人,并且正在努力进行与水和原木相关的碰撞检测 如果青蛙跳到原木上,我可以让它和原木一起跳,如果青蛙与水相撞,我也可以让它重生,但我不能两者兼得。当我尝试的时候,水的碰撞比其他任何事情都重要 这可能是因为水是一个大长方形,上面的原木是较小的长方形,但原木的大小和运动使青蛙坐在原木上 for (size_t i = 0; i < viLogS.size(); i++) { if (viLogS[i].getGlobalBounds()
for (size_t i = 0; i < viLogS.size(); i++)
{
if (viLogS[i].getGlobalBounds().intersects(player.getGlobalBounds()))
{
player.move(-2, 0); //if frog and log intersect move frog along same axis and speed as log
}
else if (waterzone.waterRectangle.getGlobalBounds().intersects(player.getGlobalBounds()))
{
player.FrogRespawn();
}
}
for(size_t i=0;i > p>你没有显示如何计算碰撞,但最有可能的是,如果青蛙与这两个碰撞(这是一个选项),你总是认为它只与日志碰撞。至少你在发布的一小段代码中是这么说的。你的逻辑有点缺陷。确定如果if语句的第一部分激发,那么第二部分将没有机会激活。但是,您可以为每个日志运行该代码段。除非你的青蛙与每一根木头相交,否则它每次都会重生
您需要的是:
if (waterzone.waterRectangle.getGlobalBounds().intersects(player.getGlobalBounds()))
{
bool safe = false;
for (size_t i = 0; i < viLogS.size(); i++)
{
if (viLogS[i].getGlobalBounds().intersects(player.getGlobalBounds()))
{
player.move(-2, 0); //if frog and log intersect move frog along same axis and speed as log
safe = true;
}
}
if (!safe)
{
player.FrogRespawn();
}
}
if(waterzone.waterRectangle.getGlobalBounds().intersects(player.getGlobalBounds()))
{
bool-safe=false;
对于(size_t i=0;i
这会检查你是否在水域(我假设你也有陆地危险区域,如果没有,这可以简化),如果你只与一根圆木相交,那么你被宣布为安全。如果没有,则飞溅。我想问题在于它是一个循环。也许试着把它分成两个循环,因为任何你不相交的日志都会自动给出else case->water collision。至少在我看来是这样。我赞同贝科的评论,你的问题似乎是,如果你至少有两块原木,青蛙就需要与这两块原木碰撞,才能不重生。你应该(例如)只检查循环中的日志是否发生冲突,如果青蛙没有与任何日志发生冲突,则更新一个布尔变量,该布尔变量为真,如果该布尔变量为真,并且青蛙与水发生碰撞,则重新启动。是的,你是对的,我可以在第一个日志上跳转,但一旦第二个日志生成,它就会跳转到water collision语句。intersect
方法是否返回对相交矩形的引用(在这种情况下,它总是返回true,对于空矩形也返回true,您必须对此进行检查),或者是一个谓词,从这个意义上说,如果它相交,则表示true
或false
。矩形类是否有一个布尔类型,映射允许您检查是否为空?