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 ?? #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" ) ) 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(); } }
|
|
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. |
|
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 |
|
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 #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(); } }
|
|
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 playerImage.setTextureRect( sf::IntRect( source.x * 32, source.y * 32, 32 32 )
pozniej masz warunek zerujący przebieg sekwencji if( source.x * 32 >= pTexture.size().x ) source.x = 0;
załącz te elementy, bedzie działac. |
|
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 #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(); } }
|
|
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ą.. else if( Event.key.code == sf::Keyboard::Down ) source.y = Up; | Down? playerImage.setTextureRect( sf::IntRect( source.x = 32, source.y = 32, 32, 32 ) );
|
Tu nie powinno być = |
|
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. i staraj się nie dawać takiej samej nazwy obiektu jak nazwa typu @up
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; |
|
« 1 » 2 |