【发布时间】:2016-03-02 14:08:01
【问题描述】:
我在 Visual Studio 2012 上使用 allegro 4.4.2 进行学校项目。 Allegro 已安装并正在运行,我正在尝试让它加载位于项目文件夹中的 map.txt 文件。调试时,allegro 冻结并变得异常缓慢,并向我抛出未处理的异常,违反访问代码。
这是 Map.h:
#include <allegro.h>
#include "Global.h"
#include <fstream>
using namespace std;
class Map
{
public:
Map();
~Map();
void Init();
void Update();
void Draw(BITMAP *Buffer);
void LoadMap (const char*filename);
private:
int loadCounterX;
int loadCounterY;
int mapSizeX;
int mapSizeY;
int MapFile[20][15];
};
这是 Map.cpp:
#include "Map.h"
Map::Map()
{
}
Map::~Map()
{
}
void Map::Init()
{
loadCounterX = loadCounterY = 0;
Map::LoadMap("map1.txt");
}
void Map::Update()
{
}
void Map::Draw(BITMAP *Buffer)
{
for (int i = 0; 1 < mapSizeX; i++)
{
for (int j = 0; j < mapSizeY; j++)
{
if (MapFile[i][j] == 1)
{
rectfill(Buffer, i*BlockSize, j*BlockSize, i*BlockSize + BlockSize, j*BlockSize + BlockSize, makecol(0, 255, 255));
}
else if (MapFile[i][j] == 2)
{
rectfill(Buffer, i*BlockSize, j*BlockSize, i*BlockSize + BlockSize, j*BlockSize + BlockSize, makecol(0, 255, 0));
}
}
}
}
void Map::LoadMap(const char*filename)
{
ifstream openfile (filename);
if (openfile.is_open())
{
openfile >> mapSizeX >> mapSizeY;
while (!openfile.eof())
{
openfile >> MapFile[loadCounterX][loadCounterY];
loadCounterX ++;
if (loadCounterX >= mapSizeX)
{
loadCounterX = 0;
loadCounterY ++;
}
}
loadCounterX = loadCounterY = 0;
} //File is opened
else
{
allegro_message ("Map File couldn't be found");
}
}
这是我的主文件:
#include <allegro.h>
#include "Player.h"
#include "Global.h"
#include "Camera.h"
#include "Map.h"
using namespace std;
volatile int counter = 0;
void Increment ()
{
counter ++;
}
int main (void)
{
allegro_init();
install_keyboard();
install_mouse();
install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, "A");
set_color_depth(32);
set_gfx_mode (GFX_AUTODETECT_WINDOWED, ScreenWidth, ScreenHeight, 0, 0);
LOCK_VARIABLE (counter);
LOCK_FUNCTION (Increment);
install_int_ex (Increment, BPS_TO_TIMER(100));
BITMAP *Buffer = create_bitmap (6000, ScreenHeight);
bool done = false;
Player player;
Camera camera;
Map map;
player.Init();
camera.Init();
map.Init();
while (!done)
{
while (counter > 0)
{
//Input
if (key[KEY_ESC])
done = true;
//Update
map.Update();
player.Update();
camera.Update(player.x, player.y);
counter --;
}
//Draw
map.Draw(Buffer);
player.Draw(Buffer);
camera.Draw(Buffer);
clear_bitmap(Buffer);
}
return 0;
}
END_OF_MAIN();
在这一行崩溃
if (MapFile[i][j] == 1)
每次。 Visual Studio 中“Autos”中显示的所有变量都变为红色; “MapFile”“MapFile[i]”(我不明白..这不应该只是“i”吗?)“j”“mapSizeY”和“this”但是当我展开“MapFile”时,第一个正确填写了 20 个块,因为它们在我的 map.txt 文件中。 我完全迷失了,不知道该怎么办......非常感谢任何帮助!
【问题讨论】:
-
在
void Map::Draw(BITMAP *Buffer)你使用1 < mapSizeX而不是i < mapSizeX -
据我们所见,
mapSizeX和mapSizeY从未被初始化。 -
我不敢相信我错过了 1 而不是 i。我多年来一直在寻找这个。非常感谢。
-
@LogicStuff
openfile >> mapSizeX >> mapSizeY; -
@Simon 我错过了,因为我在构造函数中寻找初始化。如果
LoadMap未被调用,则等待崩溃...
标签: c++ visual-studio-2012 allegro