【问题标题】:SFML mouse position and collision loading from fileSFML 鼠标位置和文件中的碰撞加载
【发布时间】:2012-12-31 16:14:38
【问题描述】:

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

当前代码:

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";
        }

下一个问题是加载碰撞。

代码:

for(int i = 0; i < CollisionVector.size(); i++)
    {
        //Loop through the height of the MapVector
        for(int j = 0; j < CollisionVector[i].size(); j++)
        {
            sf::RectangleShape rect;
            //If the stored number is 1
            if(CollisionVector[i][j] == 1)
            {
                rect.setFillColor(sf::Color(255, 0, 255));
                rect.setSize(sf::Vector2f(BLOCKSIZE, BLOCKSIZE));
                //Set the position of the rectangle
                rect.setPosition(j * BLOCKSIZE, i * BLOCKSIZE);
            }
            //Draw the rectangle
            Window.draw(rect);
        }
    }

如果我添加它,我会得到一个空白屏幕。我希望矩形是透明的,但我将它更改为粉红色以防万一这是问题(不是)

屏幕滚动代码:

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));
}

【问题讨论】:

    标签: c++ position mouse collision sfml


    【解决方案1】:

    对于第一个:由于您通过更改 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 的示例?在我放置绘图功能的任何地方,我都会得到一个白屏。
    • 第一个有效,但它不像以前那样网格锁定矩形。
    • 然后加上括号外的偏移量。
    • 好吧,我基本上得到了它的工作,除了在我滚动之后,当我的鼠标移过 y 轴上矩形的中间时它移动紫色矩形,当我的鼠标移过中间时移动矩形x 轴上的矩形数
    猜你喜欢
    • 2014-03-17
    • 1970-01-01
    • 2013-08-22
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多