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

[SFML 2.0] crash gry przy zwiększaniu std::vector

Ostatnio zmodyfikowano 2013-08-14 12:52
Autor Wiadomość
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

C/C++
#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()
{
    //Wczytywanie tekstury
    ////////////////////////
   
   
   
    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

C/C++
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 :(


 
P-90255
pekfos
» 2013-08-14 12:32:49
Dlaczego w wywołaniach erase jest -1?
P-90258
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.
P-90261
« 1 »
  Strona 1 z 1