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

[SFML 2.0] Przemieszczanie obiektu za pomocą klawiszy

Ostatnio zmodyfikowano 2013-05-08 08:17
Autor Wiadomość
Elderion
Temat założony przez niniejszego użytkownika
[SFML 2.0] Przemieszczanie obiektu za pomocą klawiszy
» 2013-05-04 13:35:17
Czemu jak klikam D/A to sprite się nie porusza?



C/C++
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "LOL" );
   
    sf::Texture tekstura;
    tekstura.loadFromFile( "rysunek.png" );
   
    sf::Sprite obrazek;
    obrazek.setTexture( tekstura );
   
    if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) )
    {
        obrazek.move( 400, 300 );
    }
   
    if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) )
    {
        obrazek.move( 200, 300 );
    }
   
    while( oknoAplikacji.isOpen() )
    {
        sf::Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) )
        {
            if( zdarzenie.type == sf::Event::Closed )
                 oknoAplikacji.close();
           
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
                 oknoAplikacji.close();
           
        }
        oknoAplikacji.clear( sf::Color::Black );
       
        obrazek.setPosition( 300, 300 );
       
        oknoAplikacji.draw( obrazek );
        oknoAplikacji.display();
    }
    return 0;
}
P-81988
Berux
» 2013-05-04 13:38:23
Oba if'y odpowiadające za poruszanie umieść w pętli przeznaczonej dla zdarzeń.
P-81989
Elderion
Temat założony przez niniejszego użytkownika
...
» 2013-05-04 13:43:38
Tutaj nie działa.

C/C++
while( oknoAplikacji.isOpen() )
{
    if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) )
    {
        obrazek.move( 400, 300 );
    }
   
    if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) )
    {
        obrazek.move( 200, 300 );
    }
   
    sf::Event zdarzenie;
    while( oknoAplikacji.pollEvent( zdarzenie ) )
    {
        if( zdarzenie.type == sf::Event::Closed )
             oknoAplikacji.close();
       
        if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
             oknoAplikacji.close();
       
    }



Tutaj też nie:


C/C++
while( oknoAplikacji.isOpen() )
{
   
   
    sf::Event zdarzenie;
    while( oknoAplikacji.pollEvent( zdarzenie ) )
    {
        if( zdarzenie.type == sf::Event::Closed )
             oknoAplikacji.close();
       
        if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Escape )
             oknoAplikacji.close();
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) )
        {
            obrazek.move( 400, 300 );
        }
       
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) )
        {
            obrazek.move( 200, 300 );
        }
       
    }




ps. Nie wiem czy to ta pętla :P
P-81990
RazzorFlame
» 2013-05-04 14:11:27
Taa twoja logika jest wręcz onieśmielająca:
C/C++
obrazek.setPosition( 300, 300 );
Przesuwanie powinno być w 1 pętli, event tworzony przed pętlami a to całkowicie wywal. Jak ty chcesz przesuwać sprajta jak cały czas ustawiasz jego pozycje na stałą?

Edit:
A wartości w funkcji move są troche (w kij) za duże. Chcesz przesuwać sprajta o 400 w osi X i 300 w osi Y podczas gdy całe okno jest jedynie 2x większe? Będziesz widział go tylko w 2 pozycjach. metoda move to nie setPosition! Ona przesuwa a nie ustawia pozycje
P-81993
Elderion
Temat założony przez niniejszego użytkownika
Jeszcze coś
» 2013-05-05 10:21:43
Nie wiem czy ten kod jest dobry, ale nie mogę go przetestować bo się zawiesza. Czemu się zawiesza?


C/C++
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow okno( sf::VideoMode( 800, 700 ), "GRA" );
   
   
   
    sf::Texture ludzio;
    ludzio.loadFromFile( "ludzio.png" );
   
    sf::Sprite ludzik;
    ludzik.setTexture( ludzio );
   
   
    while( okno.isOpen() )
    {
        sf::Event zamknij;
        while( okno.pollEvent( zamknij ) )
        {
            if( zamknij.type == sf::Event::Closed )
                 okno.close();
           
        }
       
        sf::Event ruszanie;
        while( okno.isOpen() )
        {
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) )
            {
                ludzik.move( 10, 0 );
            }
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) )
            {
                ludzik.move( - 10, 0 );
            }
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) )
            {
                ludzik.move( 0, 10 );
            }
           
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) )
            {
                ludzik.move( 0, - 10 );
            }
        }
       
        okno.clear();
        okno.draw( ludzik );
        okno.display();
    }
    return 0;
}
P-82071
RazzorFlame
» 2013-05-05 11:02:17
O boże. Po pierwsze nie twórz 2 eventów. Po drugie nie twórz ich w pętli. Po trzecie masz 1 pętle okno.isOpen() i w niej drugą pętle okno.isOpen().
Ahh poprawny kod powinien wyglądać w ten sposób:
C/C++
while( okno.isOpen )
{
    //pętla gdzie obsłużysz eventy
    //logika/poruszanie sprajtem
    //wyswietlanie sprajtow
    //wyswietlanie zawartosci okna
}
Kiedy troche więcej się nauczysz to zastosuj do tej pętli timer lub pętle stałokrokową.
P-82072
pekfos
» 2013-05-05 11:23:00
Po pierwsze nie twórz 2 eventów.
Co to ma do rzeczy?

Po drugie nie twórz ich w pętli.
Jak wyżej? Jak chce sobie mieć taki kod, to chyba nie będziesz go na siłę nawracać..
P-82080
RazzorFlame
» 2013-05-06 07:43:25
@UP to chyba jasne nie? Może to tak zabrzmiało ale miałem dobre intencje i nie chodziło mi na siłe tylko jeśli już mam doradzać to chyba moge o tym wspomnieć? Jeśli się nauczy tworzyć zmienne w pętli to potem może je notorycznie stawiać a program będzie mulił. Lepiej już chyba go teraz uprzedzić nie?
P-82173
« 1 » 2
  Strona 1 z 2 Następna strona