[SFML 2.0] crash gry przy zwiększaniu std::vector
Ostatnio zmodyfikowano 2013-08-14 12:52
Mozarek Temat założony przez niniejszego użytkownika |
[SFML 2.0] crash gry przy zwiększaniu std::vector » 2013-08-14 12:07:20 Witam wszystkich forumowiczów. Z góry mówię, że nie mam pewności co do tego czy to przez vector lecz dopiero po dodaniu go do programu wywala apke. A wywala ja po zwiększeniu vectora do ok 10( czyli wystrzeleniu 10 pocisków ). Tak dokładnie to dwa vektory (jeden do sprite'ów pocisków , drugi do sf::Vector2f przechowującego przemieszczenie pocisku na klatkę ). Debugger wskazuje mi na coś takiego: Program received signal SIGTRAP, Trace/breakpoint trap. In ntdll!DbgUiConnectToDbg () (C:\WINDOWS\system32\ntdll.dll) ale nie zawsze, bo czasami pokazuje w osobnym okienku SEGMENTATION FAULTA a to wygląda tak, że równe 20 linijek wiekszosć wskazuje na pliki systemowe ntdll.dll oraz msvcrt.dll a jedna linijka wskazuje na sfml-graphics-2.dll w moim folderze release. fragmenty kodu: shot.cpp #include <SFML/Graphics.hpp> #include <iostream> #include "player.h" #include <cmath> #include <vector>
std::vector < sf::Vector2f > Cshot::bullets_move; std::vector < sf::Sprite > Cshot::bullets; sf::Image Cshot::bulletI;
Cshot::Cshot() { if( !bulletI.loadFromFile( "D:\\programy\\CodeBlocks\\teksturki\\pocisk.PNG" ) ) std::cout << "Cant load file"; bulletI.createMaskFromColor( sf::Color( 255, 255, 255 ), 0 ); }
void Cshot::draw( sf::RenderWindow & okno ) { for( int i = 0; i < bullets.size(); i++ ) okno.draw( bullets[ i ] ); }
void Cshot::fly() { for( int i = 0; i < bullets.size(); i++ ) { bullets[ i ].move( bullets_move[ i ] ); if( bullets[ i ].getPosition().x > 1024 || bullets[ i ].getPosition().x < 0 || bullets[ i ].getPosition().y > 768 || bullets[ i ].getPosition().y < 0 ) { bullets.erase( bullets.begin() + i - 1 ); bullets_move.erase( bullets_move.begin() + i - 1 ); i--; } } }
void Cshot::shot( sf::Sprite gracz, sf::Vector2i mysz ) { sf::Sprite spr_bul; static sf::Texture txt_bul; if( !txt_bul.loadFromImage( bulletI ) ) std::cout << "error"; spr_bul.setTexture( txt_bul ); spr_bul.setRotation( gracz.getRotation() + 45 ); spr_bul.setPosition( gracz.getPosition() ); bullets.push_back( spr_bul ); float X =( mysz.x ) -( gracz.getPosition().x ); float Y =( mysz.y ) -( gracz.getPosition().y ); float stosunek = 10 /( sqrt( pow( X, 2 ) + pow( Y, 2 ) ) ); sf::Vector2f przesuniecie; przesuniecie.x = stosunek * X; przesuniecie.y = stosunek * Y; bullets_move.push_back( przesuniecie ); std::cout << "rozmiar: " << bullets_move.size() << std::endl; }
player.h class Cshot { private: static std::vector < sf::Vector2f > bullets_move; static std::vector < sf::Sprite > bullets; static sf::Image bulletI; public: Cshot(); static void shot( sf::Sprite, sf::Vector2i ); static void draw( sf::RenderWindow & ); static void fly(); };
i to chyba tyle jak bedzie trzeba to udostęnie reszte kodu, a na koniec jeszcze dodam, że raz miałem tak, że jak pomajstrowałem z fps limit to działało w 100%, lecz reset apki i powrót do problemu :( |
|
pekfos |
» 2013-08-14 12:32:49 Dlaczego w wywołaniach erase jest -1? |
|
Mozarek Temat założony przez niniejszego użytkownika |
» 2013-08-14 12:52:11 ponieważ o ile pamiętam begin() zwraca iterator do 1 elementu... omg dopiero teraz zdalem sobie sprawe z tego co przed chwilą napisałem... . Bo przecież ja jako licznik mam i ktore ustawiłem na 0 nie na 1... . ok dzeki temat zamykam. |
|
« 1 » |