Может быть, видение проблемы поможет вам всем немного:
https://ws.onehub.com/files/nzvrbj4s
Снимки экрана:
https://ws.onehub.com/files/9rw3li12
https://ws.onehub.com/files/37ggbfio
Это демонстрационный exe-файл.
WASD для перемещения игрока
мышь, чтобы прицелиться
щелкните левой кнопкой мыши, чтобы стрелять
R для перезагрузки
M для создания монстра (у меня есть одна точка появления в игре, которая выплевывает 5 монстров 3 живыми в момент времени максимум на точку появления)
Я загружаю данные монстров из файла, который содержит следующее:
Spider_Walk/</p>
<pre><code>12
Spider_Attack/
1
Spider_Die/
9
3
17 32 5 2
28 32 8 1
48 32 15 1
Я проверяю файл каждый раз, когда порождаю паука, для данных зон попадания и путей к файлам для анимации. Я не перезагружаю анимации каждый раз из-за класса менеджера ресурсов, который предотвращает двойную загрузку нескольких анимаций. В настоящее время я могу породить много монстров, но затем неожиданно, если поток установит для меня бит неудачи, и я рухну. Я пытаюсь понять, почему устанавливается мой бит сбоя.
Мой вывод:
(1)LOAD FILE IS BAD! FLAGS SET</p>
<pre><code>EOF: 0
BAD: 0
FAIL: 1
FILENAME.c_str(): gfx/Spider/Spider.txt
Любой совет был бы полезен в тот момент, когда я подумываю о создании информационного класса для монстров и добавлении его в менеджер ресурсов для загрузки данных монстров только один раз. Я просто боюсь, что эта неудача - вершина айсберга, и скрывается нечто гораздо большее.
Самый маленький фрагмент кода, который, вероятно, в конечном итоге воспроизведет проблему.
</p>
<p>ifstream load_file;</p>
<p>load_file.open(filename.c_str());</p>
<p>if(!load_file.good())allegro_message("(1) LOAD FILE IS BAD! FLAGS SET\n EOF: %i \n BAD: %i \n FAIL: %i \n FILENAME.c_str(): %s", load_file.eof(), load_file.bad(), load_file.fail(), filename.c_str());</p>
<p>
ПОЛНЫЙ КОД КОНСТРУКТОРА СЛЕДУЕТ:
Monster::Monster(string filename,Resource_Manager *nrm)</p>
<pre><code>{
rm = nrm;
//Class initalizations
Draw_Hit_Zones = true;
Draw_Health_Bar = true;
last_zone_hit = -1;
Dieing = false;
Time_Of_Death = 0;
cur_state = 0;
MAGIC = NULL;
delay = 100;
cur_frame = 0;
dr = 0;
r = 0;
Move_Speed = 10;
timer = clock();
Max_Hit_Points = 50;
Cur_Hit_Points = Max_Hit_Points;
//end class initalizations
stringstream ss;
string root_path = filename.substr(0,filename.find_last_of("/\\")+1); // /gfx/Spider/
string load_image_path;
string load_mask_path;
string temp;
ifstream load_file;
load_file.open(filename.c_str());
if(!load_file.good())allegro_message("(1) LOAD FILE IS BAD! FLAGS SET\n EOF: %i \n BAD: %i \n FAIL: %i \n FILENAME.c_str(): %s", load_file.eof(),load_file.bad(),load_file.fail(),filename.c_str());
load_file>>temp>>W_num_frames;
W_ANI.assign(root_path);
W_ANI.append(temp);
load_file>>temp>>A_num_frames;
A_ANI.assign(root_path);
A_ANI.append(temp);
load_file>>temp>>D_num_frames;
D_ANI.assign(root_path);
D_ANI.append(temp);
if(!load_file.good())allegro_message("(2)LOAD FILE IS BAD! FLAGS SET\n EOF: %i \n BAD: %i \n FAIL: %i", load_file.eof(),load_file.bad(),load_file.fail());
rm->Load_Sprite(W_ANI,W_ANI);
rm->Load_Sprite(A_ANI,A_ANI);
rm->Load_Sprite(D_ANI,D_ANI);
magic_number = (int)ceil(sqrt(rm->Get_Sprite(W_ANI,0)->w*rm->Get_Sprite(W_ANI,0)->w + rm->Get_Sprite(W_ANI,0)->h*rm->Get_Sprite(W_ANI,0)->h));
load_file>>num_col;
Hit_Zones = new C_Circ*[num_col];
multipliers = new int[num_col];
int cx,cy,cr;
for(int lcv = 0;lcv < num_col;lcv++)
{
load_file>>cx>>cy>>cr>>multipliers[lcv];
Hit_Zones[lcv] = new C_Circ(cx+(magic_number-rm->Get_Sprite(W_ANI,0)->w)/2,cy+(magic_number-rm->Get_Sprite(W_ANI,0)->h)/2,cr);
}
Master_Hit_Zone = new C_Rect(x - (rm->Get_Sprite(W_ANI,0)->w/2),y - (rm->Get_Sprite(W_ANI,0)->h/2),rm->Get_Sprite(W_ANI,0)->w,rm->Get_Sprite(W_ANI,0)->h);
load_file.close();
}