C++ 在sfml中包装地图可见性问题

C++ 在sfml中包装地图可见性问题,c++,view,sfml,C++,View,Sfml,我正在实现一个包含两部分的包装图,只有第一个视图是可见的,并且按照预期工作。 第二种观点是看不见的,我不知道为什么。如果向左看,会有一个黑色区域,而不是第二个视图。 在进行了多次更改/测试后,第二个视图似乎仅限于第一个视图的区域。 使用一张不超过屏幕大小的平铺地图,它就像一个符咒,不像这里。非常感谢您事先提供的帮助 #include <SFML/Graphics.hpp> #include <iostream> int main() { sf::RenderWi

我正在实现一个包含两部分的包装图,只有第一个视图是可见的,并且按照预期工作。 第二种观点是看不见的,我不知道为什么。如果向左看,会有一个黑色区域,而不是第二个视图。 在进行了多次更改/测试后,第二个视图似乎仅限于第一个视图的区域。 使用一张不超过屏幕大小的平铺地图,它就像一个符咒,不像这里。非常感谢您事先提供的帮助

#include <SFML/Graphics.hpp>
#include <iostream>

int main()
{
    sf::RenderWindow mMainWindow(sf::VideoMode(1000,600), "Map", sf::Style::Close);
    sf::View view(sf::Vector2f(500, 300), sf::Vector2f(1000, 600)); 
    sf::View view2(sf::Vector2f(500, 300), sf::Vector2f(1000, 600));

    sf::Image mapimage;
    mapimage.loadFromFile("world1.jpg");  //1000*600 px
    sf::Texture maptexture;
    maptexture.loadFromImage(mapimage);
    sf::Sprite mapsprite(maptexture);
    sf::Sprite mapsprite2(maptexture);
    mapsprite.setPosition(0, 0);
    mapsprite2.setPosition(1000, 0);

    sf::RectangleShape viewrect;
    viewrect.setSize(sf::Vector2f(2000, 600));
    viewrect.setPosition(0, 0);
    viewrect.setFillColor(sf::Color(250,0,0,40));

    sf::RectangleShape viewrect2;
    viewrect2.setSize(sf::Vector2f(2000, 600));
    viewrect2.setPosition(0, 0);
    viewrect2.setFillColor(sf::Color(0,0,250,40));

    float fview2 = 1;
    view2.setViewport(sf::FloatRect(fview2, 0, 1, 1));
    int mapmovementvar = 0;

    while (mMainWindow.isOpen())
    {
        sf::Event event;

        while (mMainWindow.pollEvent(event))
        {
            switch (event.type)
            {
            case sf::Event::Closed:
                mMainWindow.close();
                break;
            }
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
        {
            system("cls");
            view.move(-100, 0);
            fview2=fview2+0.1f;
            mapmovementvar--;

            if(mapmovementvar<0)
            {   
                mapmovementvar=19;
                fview2=-0.9f;
                view.reset(sf::FloatRect(1900, 0, 1000, 600));
                view2.reset(sf::FloatRect(-1000, 0, 1000, 600));
            }

            view2.setViewport(sf::FloatRect(fview2, 0, 1, 1));
            std::cout << "fview2 " << fview2 << std::endl;
            std::cout << "mapmovementvar " << mapmovementvar << std::endl;
        }

        mMainWindow.clear();

        mMainWindow.setView(view);
        mMainWindow.draw(mapsprite);
        mMainWindow.draw(mapsprite2);
        mMainWindow.draw(viewrect);

        mMainWindow.setView(view2);
        mMainWindow.draw(mapsprite);
        mMainWindow.draw(mapsprite2);
        mMainWindow.draw(viewrect2);

        mMainWindow.display();
    }
    return 0;
}
#包括
#包括
int main()
{
sf::RenderWindow mMainWindow(sf::VideoMode(1000600),“地图”,sf::Style::Close);
视图视图(sf::Vector2f(500300),sf::Vector2f(1000600));
视图2(sf::Vector2f(500300),sf::Vector2f(1000600));
sf::图像映射;
mapimage.loadFromFile(“world1.jpg”);//1000*600 px
sf::纹理贴图纹理;
maptexture.loadFromImage(mapimage);
sf::精灵贴图精灵(maptexture);
sf::精灵贴图Sprite2(贴图纹理);
mapsprite.setPosition(0,0);
mapsprite2.设置位置(1000,0);
sf::矩形形状viewrect;
设置大小(sf::Vector2f(2000600));
viewrect.setPosition(0,0);
setFillColor(sf::Color(250,0,0,40));
sf::矩形形状视图rect2;
设置大小(sf::Vector2f(2000600));
viewrect2.设置位置(0,0);
viewrect2.setFillColor(sf::Color(0,0250,40));
浮动fview2=1;
view2.setViewport(sf::FloatRect(fview2,0,1,1));
int-mapmovementvar=0;
while(mMainWindow.isOpen())
{
sf::事件;
while(mMainWindow.pollEvent(事件))
{
开关(事件类型)
{
案例sf::事件::已结束:
mMainWindow.close();
打破
}
}
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
系统(“cls”);
视图。移动(-100,0);
fview2=fview2+0.1f;
mapmovementvar--;

if(mapmovementvar我还没有解决您的视图问题,但我认为在您的案例中甚至不需要使用视图。请参阅下面的代码,我认为它实现了您想要的功能

初始化 正如你所看到的,如果你不一定需要图像对象来做其他的东西,你可以直接从文件中加载纹理。这里的视图是多余的,我认为这不是像你想要的那样使用视图的目的

#包括
#包括
int main()
{
浮动屏幕宽度=1000;
sf::RenderWindow mMainWindow(sf::VideoMode(屏幕宽度,600),“地图”,
sf::Style::Close);
//无需使用图像,您可以直接从文件加载纹理
sf::纹理贴图纹理;
maptexture.loadFromFile(“world1.jpg”);//1000*600 px
//你真的只需要一个雪碧,但这不是问题。
sf::精灵贴图精灵(maptexture);
//你根本不需要视图,只需要一个位置。
sf::矢量2f位置;
应用程序循环 这里什么都没变

while(mMainWindow.isOpen())
{
sf::事件;
while(mMainWindow.pollEvent(事件))
{
开关(事件类型)
{
案例sf::事件::已结束:
mMainWindow.close();
打破
违约:
打破
}
}
键盘输入处理 在处理输入时,只更改依赖于输入的内容。在这里,只更改位置。(和缩放的精灵比例,但这是额外的东西)

//您也可以使用所有方向进行测试,因为f*ck是一个方向。
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
位置x+=1.0f;
}
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
位置x-=1.0f;
}
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
位置y-=1.0f;
}
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
位置y+=1.0f;
}
//奖金缩放
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Equal))//+zoom
{
mapsprite.setScale(mapsprite.getScale().x+0.001f,
mapsprite.getScale().y+0.001f);
}
如果(sf::Keyboard::isKeyPressed(sf::Keyboard::Dash))//-缩放
{
mapsprite.setScale(mapsprite.getScale().x-0.001f,
mapsprite.getScale().y-0.001f);
}
调整位置 因为我们总是使用同一个贴图,所以我们只需要跟踪一个贴图矩形内的位置。因此,如果我们经过该矩形,我们只需调整位置以回到贴图内,然后在渲染之前执行此操作,这样我们就看不见更改的贴图位置

//这是所有神奇的事情,你将你的位置绕着宽度循环。
float width=mapsprite.getGlobalBounds().width;
如果(位置x 0)
{
位置x-=宽度;
}
标准::cout