简单的碰撞问题,利用c++和sfml
Simple collision problem utilizing C++ and sfml
我编写了一个简单的程序,屏幕上有两个立方体,一个用户可以移动,另一个是静止的。我刚开始使用sfml,从来没有接触过碰撞,所以这对我来说是全新的。在我的代码中,我的目标是在用户将立方体转向静止的立方体时弹出一个警告窗口。然而,问题是,一旦我启动程序,警告窗口就会出现,即使它是在if循环中。下面是我的代码:
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <iostream>
using namespace std;
bool isCollision(int x, int y, int x2, int y2){ // borrowed function, all credits go to whom ever made it
if (abs(x2 - x) > 20 || abs(y2 - y) > 20)
return false;
else
return true;
}
int main()
{
sf::RenderWindow App(sf::VideoMode(800, 600, 32), "My SFML Window");
sf::RenderWindow Warning(sf::VideoMode(400, 225, 32), "WARNING!");
sf::Shape Rect = sf::Shape::Rectangle(0, 0, 20, 20, sf::Color::Red);
sf::Shape Rect2 = sf::Shape::Rectangle(50, 0, 70, 20, sf::Color::Blue);
while (App.IsOpened())
{
sf::Event event;
while (App.GetEvent(event)) // I now know the shorter way to handle events, just haven't edited it yet. No functional difference
{
if (event.Type == sf::Event::Closed)
App.Close();
if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Escape))
App.Close();
if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Right))
Rect.Move(5.0, 0);
if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Left))
Rect.Move(-5.0, 0);
if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Down))
Rect.Move(0, 5.0);
if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Up))
Rect.Move(0, -5.0);
}
int x = Rect.GetPosition().x;
int y = Rect.GetPosition().y;
int x2 = Rect2.GetPosition().x;
int y2 = Rect2.GetPosition().y;
isCollision(x, y, x2, y2);
if (isCollision(x, y, x2, y2) == true) // if loop that I am messing up somehow
}
Warning.Clear(sf::Color::White);
}
App.Clear();
App.Draw(Rect);
App.Draw(Rect2);
App.Display();
}
return EXIT_SUCCESS;
}
我从我正在观看的tut中获得了bool isCollision函数,但tut是在快板中完成的,所以我从中尽可能地抓取。(我使用他的函数的逻辑是,我们的立方体大小完全相同,它们的属性也相同(一个移动,一个静止)。我认为,问题一定在于如何调用函数。非常感谢大家的帮助
在c++中,由调用者收集返回值。
isCollision(x, y, x2, y2);
现在对上面函数的调用没有做任何有用的事情。您需要收集返回值,并将其作为if条件的标志。或者直接将函数调用放在if条件本身中。
if ( isCollision(x, y, x2, y2) ){
// Code here
}
我觉得你的函数不能正常返回,你应该这样试试。(仅供参考,2次退货是真正的坏做法)
bool isCollision(int x, int y, int x2, int y2){
bool exitVal; // maybe make it static if this is being called over and over
if (abs(x2 - x) > 20 || abs(y2 - y) > 20)
exitVal = false;
else
exitVal = true;
return exitVal;
}
D
在您的代码示例中:
isCollision(x, y, x2, y2);
if (isCollision(x, y, x2, y2) == true) // if loop that I am messing up somehow
}
Warning.Clear(sf::Color::White);
}
为什么要两次调用函数isCollision
?
你可以这样做:
bool is_coll = isCollision(x, y, x2, y2);
if(is_coll) {
//....
}
if
语句之后的brace }
看起来不匹配....
而且在isCollision
函数的实现中,abs(x2 - x)
我觉得abs()
可能是一个宏,所以检查宏是否定义正确?if()
语句中的两个宏调用真的会把事情搞砸。
我怀疑RenderWindow
构造函数创建并显示了窗口。
在发生碰撞之前,不应该创建它(或者至少延迟显示它)。
我将把它留给你们作为练习,让你们自己找出如何完成它。
试着用一种更简单的方法找出错误到底在哪里。Molbdnilo可能是对的,所以比起使用新窗口来检查你的碰撞代码是否正确,你可以做一些绝对有效的事情。我通常只输出带有cout:
的消息#include <iostream>
if (isCollision(x, y, x2, y2) == true)
{
cout << "squares r colliding!!!";
Warning.Clear(sf::Color::White);
}
确保你可以看到控制台(有时你需要使用调试模式)
也没有if循环;)
- SFML纹理像播放器
- 如何使用AngelScript注册SFML Vector2运算符
- 如何修复sfml c++代码编译错误
- SFML library: http request
- 落砂模拟碰撞检测C++和SFML
- 使用 SFML 和 C++ 将 Pixel 打印到屏幕上
- SFML RenderWindow打开窗口需要很长时间
- 矢量下标超出SFML游戏中的范围
- 获取 SFML 窗口的 HWND 和高可用性?
- 将 Vulkan 与 SFML 结合使用?
- SFML 文本未绘制在窗口上
- SFML 碰撞永远不会在我的系统中注册
- 使用对象数组对 SFML 进行动画处理
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 如何使用 SFML 在贪吃蛇游戏中定义游戏结束?
- 如何通过多类"Union variable" (sfml) 使用轮询事件
- 1d.exe找不到SFML文件?
- 当我尝试通过 mingw 使用 CMake 和 SFML 库编译项目时出错
- Declaration of IntRect SFML
- SFML:错误:")"标记之前的预期主表达式