BraveRat Temat założony przez niniejszego użytkownika |
modyfikowanie sf::Vertex podczas pętli » 2020-09-15 22:25:27 Witam od kilku dni próbuję napisać kod dzięki któremu sf::Vertex rozpisanej klasy zmieniałby się nie naruszając reszty obiektu. plik h: class Creature : public sf::Drawable , public sf::Transformable { public: sf::Texture parts; std::vector < sf::Vector2i > rects; int actualframe; sf::Clock creatureClock; void load( sf::Vector2u creatureSize, sf::Vector2i * rectMove, sf::Vector2i * partsMove, int parts, sf::Vector2i * rect, int * sides ); private: virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const { states.transform *= getTransform(); states.texture = & parts; target.draw( vertices, states ); } sf::VertexArray vertices; };
plik cpp: void Creature::load( sf::Vector2u creatureSize, sf::Vector2i * rectMove, sf::Vector2i * partsMove, int parts, sf::Vector2i * rect, int * sides ) { vertices.setPrimitiveType( sf::Quads ); vertices.resize( parts * 4 ); for( unsigned int j = 0; j < parts; j++ ) { sf::Vertex * quad = & vertices[ j * 4 ]; quad[ 0 ].position = sf::Vector2f( partsMove[ j ].x + rectMove[ j ].x, partsMove[ j ].y + rectMove[ j ].y ); quad[ 1 ].position = sf::Vector2f( partsMove[ j ].x + rect[ j ].x + rectMove[ j ].x, partsMove[ j ].y + rectMove[ j ].y ); quad[ 2 ].position = sf::Vector2f( partsMove[ j ].x + rect[ j ].x + rectMove[ j ].x, partsMove[ j ].y + rect[ j ].y + rectMove[ j ].y ); quad[ 3 ].position = sf::Vector2f( partsMove[ j ].x + rectMove[ j ].x, partsMove[ j ].y + rect[ j ].y + rectMove[ j ].y ); quad[( 0 + sides[ j ] ) % 4 ].texCoords = sf::Vector2f( rectMove[ j ].x, rectMove[ j ].y ); quad[( 1 +( sides[ j ] * - 1 ) ) % 4 ].texCoords = sf::Vector2f( rectMove[ j ].x + rect[ j ].x, rectMove[ j ].y ); quad[( 2 + sides[ j ] ) % 4 ].texCoords = sf::Vector2f( rectMove[ j ].x + rect[ j ].x, rectMove[ j ].y + rect[ j ].y ); quad[( 3 +( sides[ j ] * - 1 ) ) % 4 ].texCoords = sf::Vector2f( rectMove[ j ].x, rectMove[ j ].y + rect[ j ].y ); } }
I w mainie: sf::Vector2i rectMove[] = { sf::Vector2i( 12, 0 ), sf::Vector2i( 70, 166 ), sf::Vector2i( 0, 76 ), sf::Vector2i( 70, 76 ), sf::Vector2i( 70, 1 ), }; sf::Vector2i partsMove[] = { sf::Vector2i( 59, 9 ), sf::Vector2i( 0, - 7 ), sf::Vector2i( 65, 6 ), sf::Vector2i( 0, 0 ), sf::Vector2i( 0, 8 ), }; sf::Vector2i rect[] = { sf::Vector2i( 58, 76 ), sf::Vector2i( 62, 108 ), sf::Vector2i( 70, 102 ), sf::Vector2i( 59, 88 ), sf::Vector2i( 62, 75 ), }; int sides[] = { 0, 0, 0, 0, 0, }; Creature Hero1; Hero1.parts.loadFromFile( "Hero1.png" ); Hero1.load( sf::Vector2u( 255, 274 ), rectMove, partsMove, 5, rect, sides ); Hero1.setPosition( 800, 200 );
Hero1.actualframe = 0;
Hero1.rects.resize( 9 ); Hero1.rects.push_back( sf::Vector2i( 70, 166 ) ); Hero1.rects.push_back( sf::Vector2i( 0, - 7 ) ); Hero1.rects.push_back( sf::Vector2i( 62, 108 ) );
Hero1.rects.push_back( sf::Vector2i( 132, 166 ) ); Hero1.rects.push_back( sf::Vector2i( - 62, - 7 ) ); Hero1.rects.push_back( sf::Vector2i( 62, 108 ) );
Hero1.rects.push_back( sf::Vector2i( 194, 166 ) ); Hero1.rects.push_back( sf::Vector2i( - 124, - 7 ) ); Hero1.rects.push_back( sf::Vector2i( 61, 88 ) );
if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) ) { if( Hero1.creatureClock.getElapsedTime().asSeconds() >= 0.12 ) { Hero1.creatureClock.restart(); sf::Vector2i rectMove[] = { sf::Vector2i( 12, 0 ), Hero1.rects[ Hero1.actualframe +( Hero1.actualframe * 3 ) ], sf::Vector2i( 0, 76 ), sf::Vector2i( 70, 76 ), sf::Vector2i( 70, 1 ), }; sf::Vector2i partsMove[] = { sf::Vector2i( 59, 9 ), Hero1.rects[( Hero1.actualframe +( Hero1.actualframe * 3 ) ) + 1 ], sf::Vector2i( 65, 6 ), sf::Vector2i( 0, 0 ), sf::Vector2i( 0, 8 ), }; sf::Vector2i rect[] = { sf::Vector2i( 58, 76 ), Hero1.rects[( Hero1.actualframe +( Hero1.actualframe * 3 ) ) + 2 ], sf::Vector2i( 70, 102 ), sf::Vector2i( 59, 88 ), sf::Vector2i( 62, 75 ), }; if( Hero1.actualframe < 4 ) { int sides[] = { 0, 0, 0, 0, 0 }; } else if( Hero1.actualframe >= 4 ) { int sides[] = { 0, 1, 0, 0, 0 }; } } Hero1.load( sf::Vector2u( 255, 274 ), rectMove, partsMove, 5, rect, sides ); Hero1.actualframe =( Hero1.actualframe + 1 ) % 6; }
Zawsze gdy kompiluje albo nie dzieje się nic albo nogi znikają. Chciałbym żeby od actualframe == 4 animacja wyglądała tak jak do actualframe == 3 tyle że z obróconym dołem. |
pekfos |
» 2020-09-16 20:18:10 Hero1.rects.resize( 9 ); Hero1.rects.push_back( sf::Vector2i( 70, 166 ) ); Hero1.rects.push_back( sf::Vector2i( 0, - 7 ) ); Hero1.rects.push_back( sf::Vector2i( 62, 108 ) );
Hero1.rects.push_back( sf::Vector2i( 132, 166 ) ); Hero1.rects.push_back( sf::Vector2i( - 62, - 7 ) ); Hero1.rects.push_back( sf::Vector2i( 62, 108 ) );
Hero1.rects.push_back( sf::Vector2i( 194, 166 ) ); Hero1.rects.push_back( sf::Vector2i( - 124, - 7 ) ); Hero1.rects.push_back( sf::Vector2i( 61, 88 ) );
Wiesz że tworzysz tu 18 elementów? 9 przez resize() i 9 przez push_back(). sf::Vector2i( 12, 0 ), Hero1.rects[ Hero1.actualframe +( Hero1.actualframe * 3 ) ], sf::Vector2i( 0, 76 ), sf::Vector2i( 70, 76 ), sf::Vector2i( 70, 1 ), };
Na pewno powinno tu być 4 * Hero1.actualframe? if( Hero1.actualframe < 4 ) { int sides[] = { 0, 0, 0, 0, 0 }; } else if( Hero1.actualframe >= 4 ) { int sides[] = { 0, 1, 0, 0, 0 }; }
To niczego nie robi. |
BraveRat Temat założony przez niniejszego użytkownika |
» 2020-09-16 21:11:27 Zauważyłem dziwną zależność. Jeśli nie napiszę o czymś na forum to za nic nie zauważę w czym problem i dopiero po zrobieniu z siebie durnia widzę ten prosty błąd. Jeśli ktoś chciałby zrobić coś takiego to podaje kod który działa. if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) ) { if( Hero1.creatureClock.getElapsedTime().asSeconds() >= 0.13 ) { Hero1.creatureClock.restart(); switch( Hero1.actualframe ) { case 0: rectMove[ 1 ] = sf::Vector2i( 132, 166 ); partsMove[ 1 ] = sf::Vector2i( - 62, - 7 ); rect[ 1 ] = sf::Vector2i( 62, 108 ); sides[ 1 ] = 0; break; case 1: rectMove[ 1 ] = sf::Vector2i( 194, 166 ); partsMove[ 1 ] = sf::Vector2i( - 124, - 7 ); rect[ 1 ] = sf::Vector2i( 61, 88 ); sides[ 1 ] = 0; break; case 2: rectMove[ 1 ] = sf::Vector2i( 70, 166 ); partsMove[ 1 ] = sf::Vector2i( 0, - 7 ); rect[ 1 ] = sf::Vector2i( 62, 108 ); sides[ 1 ] = 0; break; case 3: rectMove[ 1 ] = sf::Vector2i( 132, 166 ); partsMove[ 1 ] = sf::Vector2i( - 62, - 7 ); rect[ 1 ] = sf::Vector2i( 62, 108 ); sides[ 1 ] = 1; break; case 4: rectMove[ 1 ] = sf::Vector2i( 194, 166 ); partsMove[ 1 ] = sf::Vector2i( - 124, - 7 ); rect[ 1 ] = sf::Vector2i( 61, 88 ); sides[ 1 ] = 1; break; case 5: rectMove[ 1 ] = sf::Vector2i( 70, 166 ); partsMove[ 1 ] = sf::Vector2i( 0, - 7 ); rect[ 1 ] = sf::Vector2i( 62, 108 ); sides[ 1 ] = 1; RuthieGriffiths.actualframe = - 1; break; } Hero1.load( sf::Vector2u( 255, 274 ), rectMove, partsMove, 5, rect, sides ); Hero1.actualframe++; } }
Za chęci pomocy dziękuję |