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

[SFML 2.0] SpriteSheet animation

Ostatnio zmodyfikowano 2014-05-08 19:06
Autor Wiadomość
Yoshimori
Temat założony przez niniejszego użytkownika
[SFML 2.0] SpriteSheet animation
» 2014-05-07 00:49:39
Witam mam problem gdyz chcialem sobie stworzyc animacje postaci. Wspomagam sie poradnikiem z youtube https://www.youtube.com/watch?v=ma5QWDYsmBg

Nie wiem co jest zle u mnie nie porusza sie wgl nic, tak jakby nie reagowal na naciskanie klawiszy, nawet grdy przepisuje wszystko tak samo jak on ma to i tak nie chce mi wyjsc to samo co u niego. Gdzie tkwi problem ??

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

int main()
{
    enum Direction { Down, Left, Right, Up, };
   
    sf::Vector2i source( 1, Down );
   
    sf::RenderWindow Window;
    Window.create( sf::VideoMode( 800, 600 ), "Glory Hunters" );
   
    int index = 0;
   
    Window.setKeyRepeatEnabled( false );
   
    sf::Texture pTexture;
    sf::Sprite playerImage;
   
    if( !pTexture.loadFromFile( "image.png" ) ) //, sf::IntRect(32, 0, 32, 32)))
         std::cout << "Nie mozna pobrac obrazka" << std::endl;
   
    playerImage.setTexture( pTexture );
   
    while( Window.isOpen() )
    {
        sf::Event Event;
        while( Window.pollEvent( Event ) )
        {
            if( Event.type == sf::Event::Closed )
                 Window.close();
           
            if( Event.type == sf::Event::KeyPressed && Event.key.code == sf::Keyboard::Escape )
                 Window.close();
           
            switch( Event.type )
            {
            case sf::Event::Closed:
                Window.close();
                break;
               
            case sf::Event::KeyPressed:
                if( Event.key.code == sf::Keyboard::Up )
                     source.y = Up;
                else if( Event.key.code == sf::Keyboard::Down )
                     source.y = Down;
                else if( Event.key.code == sf::Keyboard::Right )
                     source.y = Right;
                else if( Event.key.code == sf::Keyboard::Left )
                     source.y = Left;
               
                break;
               
               
            }
           
        }
       
       
        source.x++;
        if( source.x = 32 >= pTexture.getSize().x )
             source.x = 0;
       
        playerImage.setTextureRect( sf::IntRect( source.x = 32, source.y = 32, 32, 32 ) );
        Window.draw( playerImage );
        Window.display();
        Window.clear();
       
    }
}
P-109402
Chlorek
» 2014-05-07 01:11:33
Może jestem zbyt śpiący, ale nie rozumiem tego kodu. W ogóle nie czaję o co chodzi od tej linijki:
source.x++;

W ogóle wyrażenia typu: source.x = 32 gdy podajesz je jako argument funkcji... to nie działa w taki sposób, a nawet gdyby działało to tak jak myślisz i tak nie byłoby tak jak powinno by uzyskać efekt, który chcesz. To trochę jak z omylnie wpisywanym jednym znakiem = przy porównaniach i myśleniem czemu warunek się spełnia, gdy nie powinien.

Nie zdebuguję za ciebie całego kodu, ale od razu mówię, że wyrażenie source.x = 32 nie wynosi 32.
P-109406
colorgreen19
» 2014-05-07 13:39:23
Najpierw przepisz dokładnie kod jaki on ma w tym poradniu a dopiero jak go zrozumiesz poźniej modyfikuj. po każdej modyfikacji sprawdzaj czy program działa poprawnie, jeśli nie, to będziesz wiedział gdzie i jaki błąd robisz.

@Chlorek nie dziwie sie że nie rozumiesz bo jego kod w porównaniu z kodem z poradnika to dwa różne światy
P-109421
Yoshimori
Temat założony przez niniejszego użytkownika
» 2014-05-07 21:59:58
Przepisalem dokladnie kod tak jak jest na filmiku i dalej postac nie reaguje na naciskanie klawiszy. Nie mam pojecia czemu

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

int main()
{
   
    enum Direction { Down, Left, Right, Up };
   
    sf::Vector2i source( 1, Down );
   
    sf::RenderWindow Window;
    Window.create( sf::VideoMode( 800, 600 ), "GloryHunters" );
   
    Window.setKeyRepeatEnabled( false );
   
    sf::Texture pTexture;
    sf::Sprite playerImage;
   
    if( !pTexture.loadFromFile( "image.png" ) )
         std::cout << "Error could nod load player image" << std::endl;
   
    playerImage.setTexture( pTexture );
   
    while( Window.isOpen() )
    {
        sf::Event Event;
        while( Window.pollEvent( Event ) )
        {
            switch( Event.type )
            {
            case sf::Event::Closed:
                Window.close();
                break;
            case sf::Event::KeyPressed:
                if( Event.key.code == sf::Keyboard::Up )
                     source.y = Up;
                else if( Event.key.code == sf::Keyboard::Down )
                     source.y = Up;
                else if( Event.key.code == sf::Keyboard::Right )
                     source.y = Right;
                else if( Event.key.code == sf::Keyboard::Left )
                     source.y = Left;
               
                break;
            }
        }
       
        playerImage.setTextureRect( sf::IntRect( source.x = 32, source.y = 32, 32, 32 ) );
        Window.draw( playerImage );
        Window.display();
        Window.clear();
    }
}
P-109457
colorgreen19
» 2014-05-07 22:28:48
jak idealnie? wyrzuciłeś z niego sedno i nie rozumiesz idei tamtego kodu.
source.x++
 w pętli słuzy do przesuwania poszczególnych klatek animacji. Animacja jest zapisana w jednym obrazku (poziomo sekwancje ruchu, pionowo kierunek) wiec musisz wyświetlić tylko jej czesc dlatego uzywasz
C/C++
playerImage.setTextureRect( sf::IntRect(
source.x * 32, // klatka pozioma animacji, source.x wzrasta w pętli dlatego klatki sie przesuwaja i tworza animacje (32 bo wielkośc "klatki" x)
source.y * 32, // wyswietlanie poszczegolnych sekwencji ruchu dla odpowiedniego kierunku, kierunek ustalasz nacisniesiami klawiszy (32 bo wysokosc y klatki wynosi 32)
32 //,bo wielkosc klatki x
32 ) //bo wielkosc klatki y

pozniej masz warunek zerujący przebieg sekwencji
C/C++
if( source.x * 32 >= pTexture.size().x )
     source.x = 0;


załącz te elementy, bedzie działac.
P-109461
Yoshimori
Temat założony przez niniejszego użytkownika
» 2014-05-07 23:09:17
dodalem i niestety dalej nic, przepisujac tak samo kod moja postac jest skierowana w lewa strone a jego w dol, chyba ze zmienie source.y = 0 wtedy jest obrocony tak jak on/ Tak czy siak postac dalej sie nie rusza

http://www.imageupload.co.uk/images/2014/05/07/postac.png

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

int main()
{
   
    enum Direction { Down, Left, Right, Up };
   
    sf::Vector2i source( 1, Down );
   
    sf::RenderWindow Window;
    Window.create( sf::VideoMode( 800, 600 ), "GloryHunters" );
   
    Window.setKeyRepeatEnabled( false );
   
    sf::Texture pTexture;
    sf::Sprite playerImage;
   
    if( !pTexture.loadFromFile( "image.png" ) )
         std::cout << "Error could nod load player image" << std::endl;
   
    playerImage.setTexture( pTexture );
   
    while( Window.isOpen() )
    {
        sf::Event Event;
        while( Window.pollEvent( Event ) )
        {
            switch( Event.type )
            {
            case sf::Event::Closed:
                Window.close();
                break;
            case sf::Event::KeyPressed:
                if( Event.key.code == sf::Keyboard::Up )
                     source.y = Up;
                else if( Event.key.code == sf::Keyboard::Down )
                     source.y = Up;
                else if( Event.key.code == sf::Keyboard::Right )
                     source.y = Right;
                else if( Event.key.code == sf::Keyboard::Left )
                     source.y = Left;
               
                break;
            }
        }
       
        if( source.x * 32 >= pTexture.getSize().x )
             source.x = 0;
       
        playerImage.setTextureRect( sf::IntRect( source.x = 32, source.y = 32, 32, 32 ) );
        Window.draw( playerImage );
        Window.display();
        Window.clear();
    }
}
P-109465
pekfos
» 2014-05-08 10:48:48
Tak czy siak postac dalej sie nie rusza
Nie 'wspomagaj się' poradnikami z YT, tylko się po prostu naucz. Z twoich pytań jasno wynika, że w ogóle nie wiesz, co ten kod robi. Postać się nie rusza, bo tu nie ma żadnego kodu do poruszania postacią..

C/C++
else if( Event.key.code == sf::Keyboard::Down )
     source.y = Up;
Down?

C/C++
playerImage.setTextureRect( sf::IntRect( source.x = 32, source.y = 32, 32, 32 ) );
Tu nie powinno być =
P-109480
colorgreen19
» 2014-05-08 14:38:52
Czy ty w ogole umiesz czytać ze zrozumieniem?
Piszę, że potrzbujesz presuwać klatke (source.x++) - nie dajesz.
Piszę, żebys przepisał kod dokładnie, a potem go modyfikuj do własnych potrzeb - robisz po swojemu.
Tłumaczę ci jak działa to IntRect, piszę że ma tam byc source.x * 32 a ty robisz z source.x = 32.
Kiedy postanawiasz już coś dodać dajesz bezmyślny warunek który nigdy nie bedzie spełniony bo source.x jest stałe od początku.

sf::Event Event;
i staraj się nie dawać takiej samej nazwy obiektu jak  nazwa typu

@up

C/C++
else if( Event.key.code == sf::Keyboard::Down
source.y = Up;
Down?
strzałka w dół w sfml. chyba że chodzi ci o powtórzenie source.y = Up;

P-109490
« 1 » 2
  Strona 1 z 2 Następna strona