irdufresh Temat założony przez niniejszego użytkownika |
[SFML 2.3.2] problem z kompilacją kodu error przy enemyArray.erase(iter4); » 2015-11-28 23:38:25 Witam zainteresowanych Po kolei na youtubie znalazłem ciekawy tutorial do SFML //www.youtube.com/watch?v=M5B4faQXHkE&list=PLx2OWCj5oxNMf0g1ggEzcboCzdYYFuXF6&index=11 w do odcinka 9 wszystko działa perfekt ale w 10 po 6,19min wpisany jest kod : counter = 0; for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ ) { if( enemyArray[ counter ].alive == false ) { enemyArray.erase( iter4 ); break; } counter++; } i tu problem przy próbie kompilacji wyskakuje mi wiadomość ||=== Build: Debug in x1 (compiler: GNU GCC Compiler) ===| D:\...\main.cpp||In function 'int main()':| D:\...\main.cpp|154|error: no matching function for call to 'std::vector<enemy>::erase()'| D:\...\main.cpp|154|note: candidates are:| d:\..\lib\gcc\mingw32\4.7.1\include\c++\bits\vector.tcc|135|note: std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::iterator) [with _Tp = enemy; _Alloc = std::allocator<enemy>; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<enemy*, std::vector<enemy> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = enemy*]| d:\..\lib\gcc\mingw32\4.7.1\include\c++\bits\vector.tcc|135|note: candidate expects 1 argument, 0 provided| d:\..\lib\gcc\mingw32\4.7.1\include\c++\bits\vector.tcc|147|note: std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::iterator, std::vector<_Tp, _Alloc>::iterator) [with _Tp = enemy; _Alloc = std::allocator<enemy>; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<enemy*, std::vector<enemy> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = enemy*]| d:\..\lib\gcc\mingw32\4.7.1\include\c++\bits\vector.tcc|147|note: candidate expects 2 arguments, 0 provided| D:\...\main.cpp|36|warning: unused variable 'playerMovementSpeed' [-Wunused-variable]| D:\...\main.cpp|37|warning: unused variable 'counterWalking' [-Wunused-variable]| D:\...\main.cpp|40|warning: unused variable 'counter3' [-Wunused-variable]| ||=== Build failed: 1 error(s), 3 warning(s) (0 minute(s), 0 second(s)) ===| Dodam że na oglondanym tutorialu wszystko działa ? u mnie do momenu wpisania tego kodu też? cały main
#include <SFML/Audio.hpp> #include <SFML/Graphics.hpp> using namespace std; #include <iostream>
#include "random.h" #include "player.h" #include "entity.h" #include "projectile.h" #include "enemy.h" #include <vector>
int main() { float playerMovementSpeed = 2; int counterWalking = 0; int counter = 0; int counter2 = 0; int counter3 = 0; sf::RenderWindow window( sf::VideoMode( 1000, 800 ), "I want to learn SFML! W00tsaurs" ); window.setFramerateLimit( 60 ); sf::Texture textureEnemy; if( !textureEnemy.loadFromFile( "D:\\nn.png" ) ) { return EXIT_FAILURE; } sf::Texture texturePlayer; if( !texturePlayer.loadFromFile( "D:\\nn.png" ) ) { return EXIT_FAILURE; } sf::Sprite spritePlayer( texturePlayer ); spritePlayer.setPosition( window.getSize().x / 2, window.getSize().y / 2 ); spritePlayer.setTextureRect( sf::IntRect( 0, 0, 32, 32 ) ); sf::Font font; if( !font.loadFromFile( "D:\\nn.ttf" ) ) { return EXIT_FAILURE; } sf::Text text( "Zoomafu!1obe", font, 25 ); text.setColor( sf::Color::White ); text.setCharacterSize( 50 ); text.setPosition( 300, 300 ); class player Player1; Player1.sprite.setTexture( texturePlayer ); vector < projectile >::const_iterator iter; vector < projectile > projectileArray; class projectile projectile1; vector < enemy >::const_iterator iter4; vector < enemy > enemyArray; class enemy enemy1; enemy1.sprite.setTexture( textureEnemy ); enemy1.rect.setPosition( 600, 200 ); enemyArray.push_back( enemy1 ); 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(); } } window.clear(); counter = 0; for( iter = projectileArray.begin(); iter != projectileArray.end(); iter++ ) { counter2 = 0; for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ ) { if( projectileArray[ counter ].rect.getGlobalBounds().intersects( enemyArray[ counter2 ].rect.getGlobalBounds() ) ) cout << "BOOOOOMMMM !!!!!" << endl; enemyArray[ counter2 ].hp--; if( enemyArray[ counter2 ].hp <= 0 ) { enemyArray[ counter2 ].alive == false; } counter2++; } counter++; } counter = 0; for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ ) { if( enemyArray[ counter ].alive == false ) { enemyArray.erase( iter4 ); break; } counter++; } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Y ) ) { enemy1.rect.setPosition( generateRandom( window.getSize().x ), generateRandom( window.getSize().y ) ); enemyArray.push_back( enemy1 ); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) ) { projectile1.rect.setPosition( Player1.rect.getPosition().x + Player1.rect.getSize().x / 2 - projectile1.rect.getSize().x / 2, Player1.rect.getPosition().y + Player1.rect.getSize().y / 2 - projectile1.rect.getSize().y / 2 ); projectile1.direction = Player1.direction; projectileArray.push_back( projectile1 ); } counter = 0; for( iter = projectileArray.begin(); iter != projectileArray.end(); iter++ ) { projectileArray[ counter ].update(); window.draw( projectileArray[ counter ].rect ); counter++; } counter = 0; for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ ) { enemyArray[ counter ].update(); enemyArray[ counter ].updateMovement(); window.draw( enemyArray[ counter ].sprite ); counter++; } Player1.update(); Player1.updateMovement(); window.draw( Player1.sprite ); window.display(); } return EXIT_SUCCESS; }
|
|
j23 |
» 2015-11-29 09:51:06 Prawdopodobnie problem jest w tym, że iter4 jest typu const_iterator, a erase w wersji sprzed C++11 oczekuje typu iterator. Przestaw kompilator (w opcjach projektu) na nowy standard lub zmień typ iteratora. |
|
pekfos |
» 2015-11-29 12:28:56 Nie ucz się z kursów youtube. W każdych kursach mogą się zdarzyć błędy, a na filmach nikt ich nie poprawi. Do tego kursy na youtube nie mają zwykle zbyt wysokiej jakości. |
|
irdufresh Temat założony przez niniejszego użytkownika |
» 2015-11-29 14:49:07 mam ustawiony kompilator na C++ 11 a co do zmiany const_iterator na iterator to czy nie spowoduje to potem błędów z linią kodu powyżej:
- "enemyArray[counter2].hp--;" - "enemyArray[counter2].alive == false;" |
|
pekfos |
» 2015-11-29 15:42:13 czy nie spowoduje to potem błędów z linią kodu powyżej:
- "enemyArray[counter2].hp--;" - "enemyArray[counter2].alive == false;" |
Te linie nawet nie używają tego iteratora. Po co w ogóle pytasz, czy nie spowoduje to błędu, skoro możesz to w 5 sekund sam sprawdzić..? |
|
irdufresh Temat założony przez niniejszego użytkownika |
» 2015-11-29 16:02:06 Prawda sprawdziłem i okazało sie że to nie dział nie mam pojęcia dlaczego to działa na przykladzie z youtuba skoro robie wszystko tak samo a linie kodu oznaczyłem"///" nie współpracują po prost niewiem gdzie jest błąd
counter = 0; for( iter = projectileArray.begin(); iter != projectileArray.end(); iter++ ) { counter2 = 0; for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ ) { if( projectileArray[ counter ].rect.getGlobalBounds().intersects( enemyArray[ counter2 ].rect.getGlobalBounds() ) ) { enemyArray[ counter2 ].hp--; if( enemyArray[ counter2 ].hp <= 0 ) { enemyArray[ counter2 ].alive == false; } } counter2++; } counter++; }
counter = 0; for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ ) { if( enemyArray[ counter ].alive == false ) { enemyArray.erase( iter4 ); break; } counter++; }
|
|
irdufresh Temat założony przez niniejszego użytkownika |
» 2015-11-29 16:32:41 Dobra po zmianie iteratora z const_iterator na iteratot błąd znikł -( dzięki za podpowiedz) a co do kodu poniżej to zrobiłem błąd == zamiast =, całoś teraz działa poprawnie ( zapis const_iteratot nie pozwala na zmiany ,a zapis iterator tak -czy dobże to rozumiem) counter = 0; for( iter = projectileArray.begin(); iter != projectileArray.end(); iter++ ) { counter2 = 0; for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ ) { if( projectileArray[ counter ].rect.getGlobalBounds().intersects( enemyArray[ counter2 ].rect.getGlobalBounds() ) ) { enemyArray[ counter2 ].hp--; if( enemyArray[ counter2 ].hp <= 0 ) { enemyArray[ counter2 ].alive == false; } } counter2++; } counter++; }
counter = 0; for( iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++ ) { if( enemyArray[ counter ].alive == false ) { enemyArray.erase( iter4 ); break; } counter++; }
Jeszcze raz dzięki za drobne porady |
|
« 1 » |