Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.0] Problem z kamerą

Ostatnio zmodyfikowano 2012-12-13 17:01
Autor Wiadomość
krzyk
Temat założony przez niniejszego użytkownika
[SFML 2.0] Problem z kamerą
» 2012-12-13 16:53:04
Mam problem z kamerą,kiedy zaczyna zbliżać się do celu zaczyna skakać a chciałbym żeby szła cały czas gładko.
Ktoś zna jakieś  rozwiązanie?
C/C++
#include <SFML/Graphics.hpp>
#include <iostream>


sf::Vector2f getVector( const sf::Vector2f & v1, const sf::Vector2f & v2 )
{
    return sf::Vector2f( v1.x - v2.x, v1.y - v2.y );
}

class CCamera
{
protected:
    sf::Vector2f targetpos;
    sf::Vector2f lastpos;
    float step;
   
public:
    CCamera()
        : lastpos( sf::Vector2f( 0.0, 0.0 ) )
        , targetpos( sf::Vector2f( 0.0, 0.0 ) )
        , step( 0.01f )
    {
    }
   
    ~CCamera()
    {
    }
   
    void setTargetPosition( const sf::Vector2f & pos )
    {
        targetpos = pos;
    }
   
    void draw( sf::RenderWindow & window )
    {
        sf::Vector2f vect = getVector( targetpos, lastpos );
       
        lastpos += sf::Vector2f( vect.x * step, vect.y * step );
       
        sf::View view = window.getDefaultView();
        view.setCenter( lastpos );
        window.setView( view );
        //cout << lastpos.x << " " << lastpos.y << endl;
       
    }
   
};

int main()
{
    sf::RenderWindow window( sf::VideoMode( 640, 480 ), "test" );
    //window.setFramerateLimit(60);
   
    sf::CircleShape player( 10.0, 5 );
    player.setFillColor( sf::Color::Yellow );
    player.setOrigin( sf::Vector2f( player.getRadius(), player.getRadius() ) );
    player.setPosition( window.getSize().x * 0.5f, window.getSize().y * 0.5f );
   
    CCamera camera;
   
    sf::RectangleShape rects[ 100 ];
    for( int y = 0; y < 10; ++y ) {
        for( int x = 0; x < 10; ++x ) {
            rects[ x + y * 10 ].setSize( sf::Vector2f( 10.0, 10.0 ) );
            rects[ x + y * 10 ].setPosition( x * 60, y * 60 );
            rects[ x + y * 10 ].setFillColor( sf::Color::Green );
        }
    }
   
    float dirH = 0, dirV = 0;
    const float dstep = 1.0;
    while( window.isOpen() )
    {
        sf::Event event;
        while( window.pollEvent( event ) )
        {
            if( event.type == sf::Event::Closed )
                 window.close();
           
        }
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
             dirH = dstep;
        else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
             dirH = - dstep;
        else
             dirH = 0;
       
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
             dirV = - dstep;
        else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) )
             dirV = dstep;
        else
             dirV = 0;
       
       
        window.clear();
       
        for( int q = 0; q < 100; q++ )
             window.draw( rects[ q ] );
       
       
        player.setPosition( player.getPosition().x + dirH, player.getPosition().y + dirV );
       
        camera.setTargetPosition( player.getPosition() );
        camera.draw( window );
       
        window.draw( player );
        window.display();
    }
    return 0;
}

P-70892
DejaVu
» 2012-12-13 17:01:51
Jeżeli przybliżasz kamerę to powinieneś również zmniejszać 'skok' przybliżenia.
P-70895
« 1 »
  Strona 1 z 1