⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fakegame.cpp

📁 游戏编程精粹6第1章 通用编程,对入门的游戏开发者很有帮助.
💻 CPP
字号:
// FakeGame.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "performance.h"
#include "fileinterface.h"
#include "CommandLineParser.h"
#include "ResourceParser.h"
#include "ResourceCache.h"
#include "ResourceFile.h"
#include "defs.h"

namespace
{
	enum EFileAccessMode
	{
		FILE_SYSTEM_OS = 0,
		FILE_SYSTEM_RESOURCEFILE
	};

	EFileAccessMode g_FileAccessMode = FILE_SYSTEM_OS;
}



int main(int argc, char** argv)
{
	char szStartupFilename[512];
	memset(szStartupFilename, 0, 512);

	char szResourceName[512];
	memset(szResourceName, 0, 512);

	bool bLog = false;

	//Parse the command line
	CommandLineParser cmdParser;
	cmdParser.Parse(argc, argv);

	ECommandLineResult cmdResult;
	cmdParser.Find("-log", cmdResult);
	if(cmdResult == CMDLINE_RESULT_EXISTS)
	{
		bLog = true;
	}


	const char* pArg = cmdParser.Find("-resource_dir", cmdResult);
	if((cmdResult == CMDLINE_RESULT_EXISTS)&&(pArg != NULL))
	{
		g_FileAccessMode = FILE_SYSTEM_OS;
		strncpy(szResourceName, pArg, 511);
	}
	else
	{
		pArg = cmdParser.Find("-resource_file", cmdResult);
		if((cmdResult == CMDLINE_RESULT_EXISTS)&&(pArg != NULL))
		{
			g_FileAccessMode = FILE_SYSTEM_RESOURCEFILE;
			strncpy(szResourceName, pArg, 511);
		}
		else
		{
			printf("Error: No Valid Resources...\n");
			return 1;
		}

	}

	pArg = cmdParser.Find("-Startup", cmdResult);
	
	if(pArg)
	{
		strncpy(szStartupFilename, pArg, 511);
	}
	else
	{
		printf("Error: No Startup file...\n");
		return 1;
	}

	if((cmdResult == CMDLINE_RESULT_EXISTS) && (szStartupFilename != NULL))
	{
		char szBuf[512];
		FileList files;
		printf("Parsing files!\n");
		ResourceParser parser;
		parser.Parse(szStartupFilename, files, "level1"); //only worry about level 1.
		printf("Done!\n");

		// How many files do we need to load from disk or cache?
		printf("%d files to process.\n", files.size());

		// Setup our file list iterator.
		FileList::iterator iter = files.begin();

		// Create our file cache.
		ResourceCache fileCache;

		// Start profiler.
		START_TIME();

		switch(g_FileAccessMode)
		{
		case FILE_SYSTEM_OS:
			{
				// Create a file interface for loading files from disk
				FileInterface fileInterface;
				while(iter != files.end())
				{
					// Do something with the file	
					sprintf(szBuf, "%s\\%s", szResourceName, (*iter).c_str());

					uint8* pData;
					bool bFileInCache = fileCache.Find(szBuf, pData);

					// Is it in the cache? or do we need to load it from disk?
					if(!bFileInCache)
					{
						
						if(bLog)
						{
							FILE* fp = fopen("filelog.txt", "a");
							if(fp)
							{
								fprintf(fp, "%s\n", szBuf);
								fclose(fp);
							}
						}						

						FileStats stats;
						if(fileInterface.StatFile(szBuf, &stats))
						{
							BaseFile* pFile = fileInterface.OpenFile(szBuf, BINARY_FILE, READONLY);
							if(pFile)
							{
								// Read in the file in one big chunk.
								pData = new uint8[stats.nSize];
								pFile->Read(pData, stats.nSize);

								fileCache.Add(szBuf, pData);
								fileInterface.CloseFile(pFile);
							}
						}
					}
					++iter;
				}
			}
			break;
		case FILE_SYSTEM_RESOURCEFILE:
			{

				ResourceFile resFile;
				GEN_RESULT gen_result = resFile.Open(szResourceName);
				if (gen_result != RESULT_OK)
				{
					//ERROR!
					printf("Error: failed to open resource file (%s)\n", szResourceName);
					break;
				}
				while(iter != files.end())
				{
					// Do something with the file	
					sprintf(szBuf, "%s", (*iter).c_str());

					uint8* pData;
					bool bFileInCache = fileCache.Find(szBuf, pData);

					// Is it in the cache? or do we need to load it from disk?
					if(!bFileInCache)
					{
						ResourceFileStats stats;
						BaseFile* pFile = resFile.Find(szBuf, &stats);
						if(pFile)
						{
							// Read in the file in one big chunk
							pData = new uint8[stats.nFileSize];
							pFile->Read(pData, stats.nFileSize);

							fileCache.Add(szBuf, pData);
							resFile.ClosePackedFile(pFile);
						}
					}
					++iter;
				}

				resFile.Close();
			}
			break;
		default:
			break;
		}

		// Stop profiler.
		STOP_TIME();
		printf("Profile time: %f milliseconds\n", TIME_IN_MILLI);
		printf("%d files in cache.\n", fileCache.Size());
	}
	else
	{
		printf("Command argument \"-Startup\" not found!\n");
	}

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -