在SFML2.4中使用碰撞检测来增加游戏分数的问题 我正在制作一个FLAPYY BED游戏,只是想知道如何使用SFML 2.4和C++来制作游戏。我有一个计分系统,每次鸟精灵与一根看不见的管子相交时,计分系统都会增加1分。然而,分数不是增加1,而是达到57分和60分左右。我们非常感谢任何能让这项工作顺利进行的想法 int main() { int score = 0; float PipeInvisi = 200.0; while(window.isOpen()) { if (state == State::PLAYING) { // Setup the Invisible Pipe for Movement if (!PipeInvisbleActive) { // How fast is the Pipe spriteInvisi.setPosition(905, 0); PipeInvisbleActive = true; } else { spriteInvisi.setPosition(spriteInvisi.getPosition().x - (PipeInvisi * dt.asSeconds()), spriteInvisi.getPosition().y); // Has the pipe reached the right hand edge of the screen? if (spriteInvisi.getPosition().x < -165) { // Set it up ready to be a whole new cloud next frame PipeInvisbleActive = false; } } // Has the Bird hit the invisible pipe Rect<float> Birdie = spriteBird.getGlobalBounds(); Rect<float> Paipu5 = spriteInvisi.getGlobalBounds(); if (Birdie.intersects(Paipu5)) { // Update the score text score++; std::stringstream ss; ss << "Score = " << score; scoreText.setString(ss.str()); clock.restart(); } } } } intmain() { 智力得分=0; 浮子管道i=200.0; while(window.isOpen()) { 如果(状态==状态::播放) { //设置用于移动的不可见管道 如果(!PipeInvisibleActive) { //管子有多快 spriteInvisi.setPosition(905,0); pipeInvisibleActive=true; } 其他的 { spriteInvisi.setPosition(spriteInvisi.getPosition().x-(PipeInvisi*dt.asSeconds()),spriteInvisi.getPosition().y); //管道到达屏幕的右边缘了吗? if(spriteInvisi.getPosition().x

在SFML2.4中使用碰撞检测来增加游戏分数的问题 我正在制作一个FLAPYY BED游戏,只是想知道如何使用SFML 2.4和C++来制作游戏。我有一个计分系统,每次鸟精灵与一根看不见的管子相交时,计分系统都会增加1分。然而,分数不是增加1,而是达到57分和60分左右。我们非常感谢任何能让这项工作顺利进行的想法 int main() { int score = 0; float PipeInvisi = 200.0; while(window.isOpen()) { if (state == State::PLAYING) { // Setup the Invisible Pipe for Movement if (!PipeInvisbleActive) { // How fast is the Pipe spriteInvisi.setPosition(905, 0); PipeInvisbleActive = true; } else { spriteInvisi.setPosition(spriteInvisi.getPosition().x - (PipeInvisi * dt.asSeconds()), spriteInvisi.getPosition().y); // Has the pipe reached the right hand edge of the screen? if (spriteInvisi.getPosition().x < -165) { // Set it up ready to be a whole new cloud next frame PipeInvisbleActive = false; } } // Has the Bird hit the invisible pipe Rect<float> Birdie = spriteBird.getGlobalBounds(); Rect<float> Paipu5 = spriteInvisi.getGlobalBounds(); if (Birdie.intersects(Paipu5)) { // Update the score text score++; std::stringstream ss; ss << "Score = " << score; scoreText.setString(ss.str()); clock.restart(); } } } } intmain() { 智力得分=0; 浮子管道i=200.0; while(window.isOpen()) { 如果(状态==状态::播放) { //设置用于移动的不可见管道 如果(!PipeInvisibleActive) { //管子有多快 spriteInvisi.setPosition(905,0); pipeInvisibleActive=true; } 其他的 { spriteInvisi.setPosition(spriteInvisi.getPosition().x-(PipeInvisi*dt.asSeconds()),spriteInvisi.getPosition().y); //管道到达屏幕的右边缘了吗? if(spriteInvisi.getPosition().x,c++,collision-detection,sfml,C++,Collision Detection,Sfml,假设您的问题源于恒定的交叉点,您可以引入一个简单的标志来标记交叉点 bool isBirdIntersectingPipe=false; 然后在游戏循环中,您可以像这样检测交叉点的开始 if(birdRect.intersects(pipeRect))//与此帧相交。 { 如果(!isBirdIntersectingPipe)//上一帧没有交点,那么这是开始。 { ++得分; isBirdIntersectingPipe=真; } //仍然相交,所以什么也不做。 } else//此帧没有交点。

假设您的问题源于恒定的交叉点,您可以引入一个简单的标志来标记交叉点

bool isBirdIntersectingPipe=false;
然后在游戏循环中,您可以像这样检测交叉点的开始

if(birdRect.intersects(pipeRect))//与此帧相交。
{
如果(!isBirdIntersectingPipe)//上一帧没有交点,那么这是开始。
{
++得分;
isBirdIntersectingPipe=真;
}
//仍然相交,所以什么也不做。
}
else//此帧没有交点。
{
isBirdIntersectingPipe=假;
}

理想情况下,您应该有一个专门的碰撞或物理系统来跟踪场景中的所有对象,但在这种情况下,这样一个简单的解决方案就足够了。

假设您的问题源于不断的交叉,您可以引入一个简单的标志来标记交叉点

bool isBirdIntersectingPipe=false;
然后在游戏循环中,您可以像这样检测交叉点的开始

if(birdRect.intersects(pipeRect))//与此帧相交。
{
如果(!isBirdIntersectingPipe)//上一帧没有交点,那么这是开始。
{
++得分;
isBirdIntersectingPipe=真;
}
//仍然相交,所以什么也不做。
}
else//此帧没有交点。
{
isBirdIntersectingPipe=假;
}

理想情况下,你应该有一个专门的碰撞甚至物理系统来跟踪场景中的所有对象,但在这种情况下,像这样一个简单的解决方案就足够了。

请举个例子。目前很难从你的代码中得出任何结论,但如果我不得不猜测的话,你可能会在每一帧增加计数器对象相交,不仅仅是在它们开始相交的时候。我也这么认为。你有没有示例代码或资源来说明如何在它们相交的时候才递增?请举个例子。目前很难从你的代码中得出任何结论,但如果我不得不猜测,你有可能在每一帧递增计数器e对象相交,不仅仅是在它们开始相交的时候。我也这么认为。你有没有示例代码或资源来说明如何只在它们相交的那一刻增加?这正是我所寻找的。谢谢你为我节省了几个小时并教给我一些新的东西。效果很好。这正是我所寻找的。谢谢为我节省了几个小时,教了我一些新东西。效果很好。