Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SFML鼠标位置和从文件加载的冲突_C++_Position_Mouse_Collision_Sfml - Fatal编程技术网

C++ SFML鼠标位置和从文件加载的冲突

C++ SFML鼠标位置和从文件加载的冲突,c++,position,mouse,collision,sfml,C++,Position,Mouse,Collision,Sfml,好吧,我有两个问题。首先,我制作了一个正方形,它被锁定在与瓷砖大小相同的网格上。这将用于更换瓷砖。除了开始滚动外,它工作正常。我知道为什么。这是因为鼠标的位置是相对于窗口的,而不是相对于地图的。我想知道是否有一种方法,即使在我滚动的时候,我也可以对方块进行编码以跟随我的鼠标 当前代码: if (Event.type == sf::Event::MouseMoved) { rect.setFillColor(sf::Color(255, 0, 255));

好吧,我有两个问题。首先,我制作了一个正方形,它被锁定在与瓷砖大小相同的网格上。这将用于更换瓷砖。除了开始滚动外,它工作正常。我知道为什么。这是因为鼠标的位置是相对于窗口的,而不是相对于地图的。我想知道是否有一种方法,即使在我滚动的时候,我也可以对方块进行编码以跟随我的鼠标

当前代码:

if (Event.type == sf::Event::MouseMoved)
        {

            rect.setFillColor(sf::Color(255, 0, 255));
            rect.setSize(sf::Vector2f(BLOCKSIZE, BLOCKSIZE));
            int x_offset = (Window.getView().getCenter().x - Window.getSize().x /2);
            int y_offset = (Window.getView().getCenter().y - Window.getSize().y /2);

            rect.setPosition(((sf::Mouse::getPosition(Window).x/32 *32) + (x_offset/32 *32)), ((sf::Mouse::getPosition(Window).y/32 * 32) + (y_offset/32 * 32)));
             std::cout << "Mouse position: x:" << ((sf::Mouse::getPosition(Window).x/32 *32) + (x_offset/32 *32)) << " y:" << ((sf::Mouse::getPosition(Window).y/32 * 32) + (y_offset/32 * 32)) << ")\n\n";
        }
if(Event.type==sf::Event::MouseMoved)
{
rect.setFillColor(sf::Color(255,0255));
rect.setSize(sf::Vector2f(BLOCKSIZE,BLOCKSIZE));
int x_offset=(Window.getView().getCenter().x-Window.getSize().x/2);
int y_offset=(Window.getView().getCenter().y-Window.getSize().y/2);
rect.setPosition((sf::Mouse::getPosition(Window.x/32*32)+(x_offset/32*32)),((sf::Mouse::getPosition(Window.y/32*32)+(y_offset/32*32));

std::cout对于第一个:由于您通过更改
sf::View
来滚动,因此计算视图偏移并将其添加到您的坐标中:

[...]
float x_offset = Window.getView().getCenter().x - Window.getSize().x * .5f;
float y_offset = Window.getView().getCenter().y - Window.getSize().y * .5f;

rect.setPosition(sf::Mouse::getPosition(Window).x/32 * 32 + x_offset, 
            sf::Mouse::getPosition(Window).y/32 * 32 + y_offset;

对于第二个…嗯,我现在什么都没有。我已经检查了SFML,一个
sf::RectangleShape
默认初始化为大小为(0,0)所以这不是问题所在。可能问题出在周围的代码中?

编辑了带有滚动代码的OP,你能发布一个如何修复2的示例吗?无论我在哪里放置draw函数,我都会看到一个白色屏幕。第一个可以工作,但它不会像以前那样网格锁定矩形。然后在Paranthes之外添加偏移量。好的,我基本上可以工作了ng除非在我滚动之后,当我的鼠标移动到y轴上的矩形中间时,它会移动紫色矩形;当我的鼠标移动到x轴上的矩形中间时,它会移动矩形
void Camera::Update(float x, float y)
{
    cameraX = x - (ScreenWidth / 2);
    cameraY = y - (ScreenHeight / 2);

    if (cameraX < 0)
        cameraX = 0.0;
    if (cameraY < 0)
        cameraY = 0.0;

    CameraPosition.reset(sf::FloatRect(cameraX, cameraY, ScreenWidth, ScreenHeight));
    CameraPosition.setViewport(sf::FloatRect(0,0,1,1));
}
[...]
float x_offset = Window.getView().getCenter().x - Window.getSize().x * .5f;
float y_offset = Window.getView().getCenter().y - Window.getSize().y * .5f;

rect.setPosition(sf::Mouse::getPosition(Window).x/32 * 32 + x_offset, 
            sf::Mouse::getPosition(Window).y/32 * 32 + y_offset;