我目前正在尝试开发一款游戏而且我在使用Map时遇到了一些麻烦。
Map的工作方式如下:我们有一个名为Map的类,它将包含一个Tiles向量。
class GMap
{
private :
std::vector <BTiles> TileList;
...
因此,在GMap中将有一个函数Load,它将从txt文件加载所有图块。 所有图块都有自己的功能,例如渲染。以及他们自己的变量,如ID和Tile类型。
我可以很容易地渲染瓷砖,但我的问题是,由于地图有点大,而且每个瓷砖只有16x16像素,因此填充整个曲面需要很多。而且由于它们很多,所以加载它需要太长时间。比如,他们中的一小部分是30-40秒。
我还没有开发出实际读取txt文件的代码,它将包含要加载多少个tile的信息,它们是哪些类型以及它们的位置,所以我一直在使用这段代码来测试Tile Rendering。 / p>
bool GMap::Load(char *File)
{
int XRand;
for(int i = 0;i < 1024;i++) //I need 1024 tiles to load a screen of 512x512 pixels.
{
BTiles NewTile; //Btile is the Tiles Class.
XRand = rand() % 5; //There are currently only 5 types of Tile. And i wanted to print them randomly, just for testing.
NewTile.OnLoad(XRand, i); //This will be setting type = Xrand, and ID = i. The Type will define which block to print on the screen. And the ID will define where to print it.
TileList.push_back(NewTile);
}
return true;
}
这是Tiles OnLoad功能:
bool BTiles::OnLoad(int BType, int BID)
{
if((BSurface = Surface::OnLoad("BTexture.png")) == false)
return false;
Type = BType;
ID = BID;
return true;
}
然后我可以通过以下方式打印所有图块:
void GMap::Render(SDL_Surface *MainSurface)
{
for(int i = 0;i < TileList.size();i++)
{
TileList[i].OnRender(MainSurface); //I am calling a Render function inside the Tile Class. MainSurface is the primary surface im using to render images.
}
但我的问题在于加载功能。加载这些1024个瓷砖需要花费太多时间。 1024块瓷砖只是我真正需要加载到严肃地图中的一小部分。此外,它甚至不会加载它们。经过了大量的时间来“加载”1024个图块,它只打印出一半的图块。就像,屏幕不是完整的瓷砖,即使我“加载”正确的数量,以填补整个屏幕。然后我继续将数字从1024增加到2048,希望它能完成屏幕。但它实际上并没有改变任何事情。就像它,它加载一定数量,然后它就停止了。或者至少它会停止渲染。
如果有人想知道如何进行渲染,我有一个可以完成工作的Global函数,然后,在Tile Class上,我有这个功能:
void BTiles::OnRender(SDL_Surface *MSurface)
{
int X = (ID * 16) % M_WIDTH; //Since i am only using the ID to know which position to put a Tile, i use this function to locate which Horizontal Position to put them. M_WIDTH is a global variable that defines the Width of the screen, it is currently 512
int Y = ((ID * 16) / M_HEIGHT) * 16; //The same but for the Vertical Position. M_HEIGHT is currently also 512
Surface::OnDraw(MSurface, BSurface, X, Y, (Type * 16) % M_WIDTH, (Type * 16) / M_HEIGHT, 16, 16); //This means Render(On The Primary Surface, using the Images on the BSurface, on the Position X, on the position Y, Where the Tile i want to render starts on the X line, Where the Tile i want to render starts on the Y line, it is 16 bits Width, it is 16 bits Height
}
我道歉我没有正确解释最后一个功能,但我不认为我的问题就在那里。
无论如何,如果有人需要更多信息,请在部分代码中询问。
谢谢!
答案 0 :(得分:1)
我发现了问题。每个图块都有自己的Surface,它会加载相同的图像。这意味着我正在生成1024个曲面,并加载1024个曲面。我解决这个问题的方法是在Map类中创建一个Surface,它将被所有Tiles使用。
所以
bool BTiles::OnLoad(int BType, int BID)
{
if((BSurface = Surface::OnLoad("BTexture.png")) == false)
return false;
Type = BType;
ID = BID;
return true;
}
成了
bool BTiles::OnLoad(int BType, int BID)
{
Type = BType;
ID = BID;
return true;
}
在Map类中我添加了MSurface,它将加载包含所有Tile Blocks的Image。 然后渲染我将执行以下操作:
void GMap::Render(SDL_Surface *MainSurface)
{
for(int i = 0;i < TileList.size();i++)
{
TileList[i].OnRender(MainSurface, MSurface, 0, 0);
}
}
Msurface是包含图像的Surface。
每个图块都会将MSurface作为外部曲面接收,但它将用于保存所有图像。
因此,我只创建了1个而不是创建1024个Surfaces。现在加载比以前多了2秒。它还解决了我的所有Tiles Not-Rendering问题。