2017-11-22 15 views
-1

私はちょうど.txtファイルからタイルマップをロードするコードを書いた。すべてが良かったし、私の「ゲーム」が集められた。この後、私はマップ上にハウスのようなオブジェクトを追加するための応答コードを書いた。 今はコードをコンパイルしますが、これを起動するとSIGSEGVエラーが発生します。私はSFML 2.4.2で作業しています。どうしたの?デバッガLevel.cppに行目にも780線種のstl_vector.hに私を送り、:2次元ベクトルはSIGSEGVを返します。 SFML Game

tiles[i][j].setTexture(tekstury[tiles_atributes[i][j].type]) 

Level.h

class Object; 

class Level 
{ 
public: 

    Level(); 
    Level(std::string filename); 

    void loadFromFile(std::string filename, Object &object);  //load level from .txt 

    ~Level(void); 


    enum FieldType { 
     GRASS, 
     STONE, 
     WATER, 
     WATER_1, 
     WATER_2, 
     WATER_3, 
     WATER_4, 
     GRASS_BLOCK}; 

    struct Tile 
    { 
     FieldType type; 
     bool isWall; 
    }; 

    int width; 
    int height; 

    const static int tile_width = 40;  //width and height of single tile 
    const static int tile_height = 40; 

    sf::Texture tekstury[7]; 
    std::vector <std::vector <sf::Sprite> > tiles; 
    std::vector < std::vector <Tile> > tiles_atributes; 

}; 

class Object 
{ 
    public: 

    int l; 
    Object(); 
    ~Object(); 

    std::vector <sf::Texture> objects_textures; 
    std::vector <sf::Sprite> objects_sprites; 
    /*std::vector <std::vector<sf::Sprite>> additional_sprites;*/ 
}; 

Level.cpp

void Level::loadFromFile(std::string filename, Object &object) 
{ 

    std::fstream file; 
    file.open(filename, std::ios::in);  

    if (!file.is_open()) 
    { 
     std::cout << "Not found " + filename; 
     return; 
    } 


    file >> width >> height; 


    tiles.resize(height); 
    tiles_atributes.resize(height); 
    for (int i = 0; i < height; i++) 
    { 
     tiles[i].resize(width); 
     tiles_atributes[i].resize(width); 
    } 


    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 

      int tmp = 0; 
      file >> tmp; 

      tiles_atributes[y][x].type = FieldType(tmp); 

      if(tmp==2 || tmp==3 || 
        tmp==4 || tmp==5 || 
        tmp==6) 
       tiles_atributes[y][x].isWall = true; 

      else 
       tiles_atributes[y][x].isWall = false; 
     } 
    } 

    int j=0; 

    for (int i = 0; i <8; i++) 
    { 
     std::stringstream ss; 
     ss<< "Img/Kafelki/tekstura" << i <<".png"; 
     std::string zrodlo; 
     ss>>zrodlo; 

     tekstury[i].loadFromFile(zrodlo); 

     j++; 
    } 



    for (int i = 0; i < height; i++) 
    { 
     for (int j = 0; j < width; j++) 
     { 
      tiles[i][j].setTexture(tekstury[tiles_atributes[i][j].type]); 
      tiles[i][j].setPosition(j*tile_width, i*tile_height); 
     } 
    } 

    int m=0; 
    int p=0; 

    while (!file.eof()) 
    { 

     std::string name;  // nazwa specjalnego Objectu 
     file >> name; 
     std::cout<< name; 

     if (name == "[House]") 
     { 
      unsigned short x, y; 
      file >> x >> y; 
      m++; 


      object.objects_sprites.resize(m); 
      object.objects_sprites[p].setTexture(object.objects_textures[0]); 
      object.objects_sprites[p].setPosition(x, y); 

      int ob_height= object.objects_sprites[p].getGlobalBounds().height; 
      int ob_width= object.objects_sprites[p].getGlobalBounds().width; 

      int point_x=object.objects_sprites[p].getGlobalBounds().left; 
      int point_y=object.objects_sprites[p].getGlobalBounds().top; 

      for (int i = point_y/tile_height; i < ob_height/tile_height; i++) 
      { 
       for (int j = point_x/tile_width; j < ob_width/tile_width; j++) 
       { 
        tiles_atributes[i][j].type = FieldType(7); 
       } 
      } 

      for (int i = point_y/tile_height; i < ob_height/tile_height; i++) 
      { 
       for (int j = point_x/tile_width; j < ob_width/tile_width; j++) 
       { 
        tiles[i][j].setTexture(tekstury[tiles_atributes[i][j].type]); 
       } 
      } 



      p++; 

     } 

    } 

    file.close(); 
} 

答えて

1

あなたは7を持っていますあなたの配列のテクスチャsf::Texture tekstury[7];。しかし、の8つのタイプがあるため、8つの画像を読み込もうとします。そして、あなたが8番目のテクスチャにアクセスしようとすると...よく。

これを修正する必要があります。コード内のマジックナンバーの使用をやめてください。あなたが持っている型の数を知っている単一の定数を使用してください。いくつかの人々はCOUNTという値で列挙型を終了します...その値は、あなたが真ん中にいくつか追加したとしても、その数が分かるためです。しかし、単純なconst size_t FieldTypeCount = 8;も機能するかもしれません。

関連する問題