1

私は現在、Windows コンソール用の ASCII ゲーム エンジンを作成しています。使用しているクラスの 1 つは Image クラスです。このクラスのデータ メンバーには、幅、高さ、動的に割り当てられた符号なし文字の配列へのポインターが含まれています。画像の色データ。

当初、私はプログラムの他の場所で定義された構造体からのデータを使用してすべての画像を構築していましたが、最初のいくつかの練習用画像を超えると非常に非効率的であることが判明したため、代わりにテキスト ファイルから必要なデータを読み取るコンストラクターを作成しようとしました。テキスト ファイルの形式は次のとおりです。

身長

[文字]

[色]

ここで、文字と色は、幅 * 高さのサイズの空白で区切られた単なる配列です (興味がある場合は、下に貼り付けられた完全な画像ファイル)。ただし、このコンストラクターを呼び出すと、何か問題が発生します。Eclipse のデバッグ モードでは、何も奇妙に見えず、実際には文字と色の配列を正常にコピーしているように見えますが、プログラムを実行しても画像は描画されません。要求されたときに画面に。

コンストラクターの元のバージョンは次のようになります。

Image::Image(const int w, const int h, const CHAR *chrs, const COL *cols) :width(w), height(h) {
    chars = new CHAR[w * h];
    colours = new COL[w * h];
    for (int i = 0; i < w * h; ++i) {
        chars[i] = chrs[i];
        colours[i] = cols[i];
    }
}

そして次のように呼ばれました:

Image *sun_image = new Image(Sun.width, Sun.height, Sun.chars, Sun.colours);

次のように定義された Sun 構造体を使用します。

Sun_s Sun =
{
  SUNW,
  SUNH,
  {
    255,255,255,255,255,255,255,177,255,255,255,255,255,255,255,
    255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
    255,255,255,177,255,255,255,177,255,255,255,177,255,255,255,
    255,255,255,255,177,255,255,255,255,255,177,255,255,255,255,
    255,255,255,255,255,255,177,177,177,255,255,255,255,255,255,
    255,255,255,255,255,177,178,219,178,177,255,255,255,255,255,
    255,255,255,255,177,178,219,219,219,178,177,255,255,255,255,
    177,255,177,255,177,219, 94,219, 94,219,177,255,177,255,177,
    255,255,255,255,177,178,219,126,219,178,177,255,255,255,255,
    255,255,255,255,255,177,178,219,178,177,255,255,255,255,255,
    255,255,255,255,255,255,177,177,177,255,255,255,255,255,255,
    255,255,255,255,177,255,255,255,255,255,177,255,255,255,255,
    255,255,255,177,255,255,255,177,255,255,255,177,255,255,255,
    255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
    255,255,255,255,255,255,255,177,255,255,255,255,255,255,255,
  },
  {
      0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0, 62,  0,  0,  0, 62,  0,  0,  0, 62,  0,  0,  0,
      0,  0,  0,  0, 62,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0, 62, 62, 62,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0, 62, 62, 14, 62, 62,  0,  0,  0,  0,  0,
      0,  0,  0,  0, 62, 62, 14, 14, 14, 62, 62,  0,  0,  0,  0,
     62,  0, 62,  0, 62, 14,224, 14,224, 14, 62,  0, 62,  0, 62,
      0,  0,  0,  0, 62, 62, 14,224, 14, 62, 62,  0,  0,  0,  0,
      0,  0,  0,  0,  0, 62, 62, 14, 62, 62,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0, 62, 62, 62,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0, 62,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,
      0,  0,  0, 62,  0,  0,  0, 62,  0,  0,  0, 62,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,  0,
  }
};

試行された新しいバージョンのコンストラクターは次のようになります。

Image::Image(const char *filename) {
    std::ifstream inputFile;
    inputFile.open(filename, std::ios::in);

    if (inputFile.is_open()) {
        inputFile >> width;
        inputFile >> height;
        chars = new CHAR[width * height];
        colours = new CHAR[width * height];

    int temp, i;
    for (i = 0; i < height * width; ++i) {
        inputFile >> temp;
        chars[i] = (CHAR)temp;
    }

    for (i = 0; i < width * height; ++i) {
        inputFile >> temp;
        colours[i] = (CHAR)temp;
    }
    } else {
        width = 0;
        height = 0;
        chars = new CHAR[width * height];
        colours = new CHAR[width * height];
    }

inputFile.close();
}

次のような呼び出しで:

    Image *sun_image = new Image("./artassets/sun.txt");

そして次のような sun.txt:

15
15

255 255 255 255 255 255 255 177 255 255 255 255 255 255 255 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
255 255 255 177 255 255 255 177 255 255 255 177 255 255 255 
255 255 255 255 177 255 255 255 255 255 177 255 255 255 255 
255 255 255 255 255 255 177 177 177 255 255 255 255 255 255 
255 255 255 255 255 177 178 219 178 177 255 255 255 255 255 
255 255 255 255 177 178 219 219 219 178 177 255 255 255 255 
177 255 177 255 177 219  94 219  94 219 177 255 177 255 177 
255 255 255 255 177 178 219 126 219 178 177 255 255 255 255 
255 255 255 255 255 177 178 219 178 177 255 255 255 255 255 
255 255 255 255 255 255 177 177 177 255 255 255 255 255 255 
255 255 255 255 177 255 255 255 255 255 177 255 255 255 255 
255 255 255 177 255 255 255 177 255 255 255 177 255 255 255 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
255 255 255 255 255 255 255 177 255 255 255 255 255 255 255
  0   0   0   0   0   0   0  62   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0  62   0   0   0  62   0   0   0  62   0   0   0 
  0   0   0   0  62   0   0   0   0   0  62   0   0   0   0 
  0   0   0   0   0   0  62  62  62   0   0   0   0   0   0 
  0   0   0   0   0  62  62  14  62  62   0   0   0   0   0 
  0   0   0   0  62  62  14  14  14  62  62   0   0   0   0 
 62   0  62   0  62  14 224  14 224  14  62   0  62   0  62 
  0   0   0   0  62  62  14 224  14  62  62   0   0   0   0 
  0   0   0   0   0  62  62  14  62  62   0   0   0   0   0 
  0   0   0   0   0   0  62  62  62   0   0   0   0   0   0 
  0   0   0   0  62   0   0   0   0   0  62   0   0   0   0 
  0   0   0  62   0   0   0  62   0   0   0  62   0   0   0 
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
  0   0   0   0   0   0   0  62   0   0   0   0   0   0   0 

誰かが私が間違っていることを指摘できますか? 私の2つのコンストラクターは、私にはそれほど違いはありません...

編集:言及するのを忘れていましたが、CHAR と COL は両方とも unsigned char の定義にすぎません。

4

0 に答える 0