View RSS Feed

zabsv

SFML View

Rate this Entry
Det här blir ett kort inlägg. Har ju roat mig med att lära mig SFML ett tag nu (det tar sin tid när man bara har en timme lite då och då). I alla fall kom turen till sf::View idag och jag tycker den var lite lurig att få grepp om.
Den är egentligen inte särskit svår, men ibland får man tänka pixlar och ibland procent, och ibland ska man utgå från centrum, ibland från top-left.

En view låter dig välja en del av ett RenderWindow och zooma, scrolla och/eller rotera på ett enkelt sätt. Den gör det också enkelt att dela skärmen i flera delar och att t.ex. lägga upp en minimap. Det finns en ganska bra tutorial på SMFL's wiki och en dokumentation som är bra när man väl förstått hur man ska tänka på SFML.dev.org

Jag slängde ihop en liten test (med kommentarer så jag kommer ihåg hur det fungerar) och tänkte att den kanske kan vara användbar för någon annan glad nybörjare som försöker få grep om sf::View, så här kommer den

Kod:
#include 
#include 
#include 

#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600

int main()
{
    /// Skapa ett fönster
    sf::RenderWindow App(sf::VideoMode(SCREEN_WIDTH, SCREEN_HEIGHT), "SFML View");
    App.setVerticalSyncEnabled(true);
    sf::Image imgMap, imgMini;
    if(!(imgMap.loadFromFile("1500x1200.png")&&imgMini.loadFromFile("300x240.png"))){
        std::cerr << "Hittade inte bilderna" << std::endl;
        return 0;
    }
    const int MAP_WIDTH(imgMap.getSize().x);
    const int MAP_HEIGHT(imgMap.getSize().y);
    const int MINI_WIDTH(imgMini.getSize().x);
    const int MINI_HEIGHT(imgMini.getSize().y);
    // Textures
    sf::Texture txMap, txMini;
    txMap.loadFromImage(imgMap);
    txMini.loadFromImage(imgMini);
    // Sprites
    sf::Sprite sprMap, sprMini;
    sprMap.setTexture(txMap);
    sprMini.setTexture(txMini);
    /// Skapa Views - Jag har lagt in några olika exempel som kommentarer.
    /// Visa imgMap centrerad och skalad så den fyller hela view:n
    //sf::View view(sf::Vector2f(MAP_WIDTH/2,MAP_HEIGHT/2), sf::Vector2f(MAP_WIDTH, MAP_HEIGHT));
    /// Visa imgMap centrerad i naturlig skala
    //sf::View view(sf::Vector2f(MAP_WIDTH/2, MAP_HEIGHT/2), sf::Vector2f(SCREEN_WIDTH, SCREEN_HEIGHT));
    /// Visa imgMap på de vänstra 75% av skärmen. Fortfaranden centrerad och ingen zoom(naturlig skala).
    /// Område för view kan definieras antingen genom att ange centerpunkt (i bilden som ska visas) och storlek.
    //sf::View view(sf::Vector2f(MAP_WIDTH/2, MAP_HEIGHT/2), sf::Vector2f(SCREEN_WIDTH*0.75, SCREEN_HEIGHT));
    /// Eller genom att ange en rektangel som definierar punkten för övre vänstra hörnet (i bilden som ska visas) och storleken.
    sf::View view(sf::FloatRect((MAP_WIDTH-(SCREEN_WIDTH*0.75))/2, (MAP_HEIGHT-SCREEN_HEIGHT)/2, SCREEN_WIDTH*0.75, SCREEN_HEIGHT));
    /// Viewport anger viewens placering på skärmen (egentligen i RenderWindow)
    view.setViewport(sf::FloatRect(0.0, 0.0, 0.75, 1.0));
    /// Skapa en miniMap i övre högra hörnet.
    sf::View miniView(sf::Vector2f(MINI_WIDTH/2, MINI_HEIGHT/2), sf::Vector2f(MINI_WIDTH, MINI_HEIGHT));
    /// OBS att övre vänstra hörnet anges som en faktor mellan 0 och 1 av renderWindow.
    /// Här placeras den alltså med övre vänstra hörnet på POSITION 0.75, 0 och har en STORLEK på 0.25, 0.25
    miniView.setViewport(sf::FloatRect(0.75, 0.0, 0.25, 0.25));

	float zoom(1), rotate(0);
    while (App.isOpen())
    {
        sf::Event Event;
        while (App.pollEvent(Event)){
            if (Event.type == sf::Event::Closed)
                App.close();
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)){
            App.close();
        }
        /// Busenkelt att scrolla åt olika håll.
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::A)){
            view.move(-10.0, 0.0);
        }else if(sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
            view.move(10.0, 0.0);
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::W)){
            view.move(0.0, -10.0);
        }else if(sf::Keyboard::isKeyPressed(sf::Keyboard::S)){
            view.move(0.0, 10.0);
        }
        /// Zoomen anger hur mycket den ska zooma in eller ut från föregående zooming.
        /// en zoom på 1 innebär alltså att den behåller sin nuvarande zoomnivå.
        /// Zoom på under ett zoomar ut, och zoom på över 1 zoomar in.
        /// Negativa zoomvärden kan ge underliga effekter.
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::X)){
            zoom=0.99;
        }else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Z)){
            zoom=1.01;
        }else if(sf::Keyboard::isKeyPressed(sf::Keyboard::C)){
            /// För att sätta zoomen till naturlig storlek måste man göra såhär.
            view.setSize(sf::Vector2f(SCREEN_WIDTH*0.75,SCREEN_HEIGHT));
        }else{
            zoom=1;
        }
        /// Rotation är däremot i förhållande till 0. Så där måste värdet sparas för att rotationen ska behållas.
        /// Och för att ta bort rotationen sätter man den helt enkelt till noll.
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::J)){
            rotate-=1;
        }else if(sf::Keyboard::isKeyPressed(sf::Keyboard::K)){
            rotate+=1;
        }else if(sf::Keyboard::isKeyPressed(sf::Keyboard::L)){
            rotate=0;
        }
        view.zoom(zoom);
        view.setRotation(rotate);
        // Clear screen
        App.clear();

        //Draw the sprite
        App.setView(view);
        App.draw(sprMap);
        App.setView(miniView);
        App.draw(sprMini);

        App.display();
    }

    return EXIT_SUCCESS;
}
Ser ut sähär när man startar:

Namn:  Skärmbild från 2012-12-07 19:31:07.jpg
Visningar: 123
Storlek:  9,5 KB
Använd WSAD för att scrolla runt, Z och X för att zooma in/ut och C för att nollställa zoomen. Sist men inte minst finns JKL för att rotera/nolla rotation.
Ha så kul

Komplett paket med källkod och bilder här. Har bara kört det under Ubuntu, men det är inga konstigheter så alla system som SFML har stöd för borde kunna köra koden.

Submit "SFML View" to Digg Submit "SFML View" to del.icio.us Submit "SFML View" to StumbleUpon Submit "SFML View" to Google

Taggar: c++, sfml Lägg till/redigera taggar
Kategorier
Uncategorized

Comments