#include "DxLib.h" #include "time.h" #include #include #include #include #include #include "Base/Support/CArchive.h" int Key[256]; int GetHitKeyStateAll_2(int KeyStateBuf[]){ char GetHitKeyStateAll_Key[256]; GetHitKeyStateAll( GetHitKeyStateAll_Key ); for(int i=0;i<256;i++){ if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++; else KeyStateBuf[i]=0; } return 0; } enum StateID { STATE_SELECT_OPERATION, STATE_FIND_FILE, STATE_SELECT_FILE, STATE_MAKE_ARCHIVE, STATE_FINISH_ARCHIVE, STATE_SELECT_ARCHIVE, STATE_LOAD_ARCHIVE, STATE_DRAW_ARCHIVE, STATE_LOAD_FAIL, STATE_END, }; StateID g_State = STATE_SELECT_OPERATION; std::vector g_FileNameVec; std::vector g_SelectFileVec; int g_White = 0, g_Yellow = 0, g_Green = 0; int g_NowOperationNum = 0; int g_NowSelectFile = 0; int g_SelectFileCount = 0; enum ResourceTypeID { RESOURCE_GRAPHIC, RESOURCE_SOUND, RESOURCE_NONE, }; struct MyHandleInfo { int m_Handle; ResourceTypeID m_Type; MyHandleInfo(){ m_Handle = 0; m_Type = RESOURCE_NONE; } }; std::vector g_HandleVec; int g_DifPosX = 0; void SelectOperation() { char* t_OperationSelect[] = {"アーカイブファイルを作成する", "アーカイブファイルを解析する","終わる"}; const int OPERATION_NUM = sizeof(t_OperationSelect) / sizeof(t_OperationSelect[0]); if(Key[KEY_INPUT_DOWN] == 1){ g_NowOperationNum = (g_NowOperationNum + 1) % OPERATION_NUM; }else if(Key[KEY_INPUT_UP] == 1){ g_NowOperationNum = (g_NowOperationNum + OPERATION_NUM - 1) % OPERATION_NUM; }else if(Key[KEY_INPUT_Z] == 1){ switch(g_NowOperationNum){ case 0: g_State = STATE_FIND_FILE;break; case 1: g_State = STATE_LOAD_ARCHIVE;break; case 2: g_State = STATE_END;break; default:break; } } //説明文などを描画 DrawString( 200, 200, "■操作を選択してください", g_White); for(int i = 0; i < OPERATION_NUM; i++){ int t_Color = 0; if(i == g_NowOperationNum){ t_Color = g_Yellow; }else{ t_Color = g_White; } DrawString( 216, 216 + (i<<4), t_OperationSelect[i], t_Color); } } void FindFile() { HANDLE t_FindHandle; WIN32_FIND_DATA t_FindData; t_FindHandle = FindFirstFile("*.*", &t_FindData); if (t_FindHandle != INVALID_HANDLE_VALUE) { do { //ディレクトリでなければ if((t_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0){ g_FileNameVec.push_back(t_FindData.cFileName); } } while(FindNextFile(t_FindHandle, &t_FindData)); FindClose(t_FindHandle); } g_State = STATE_SELECT_FILE; g_SelectFileVec.resize(g_FileNameVec.size(), 0); } void SelectFile() { if(Key[KEY_INPUT_DOWN] == 1 || (Key[KEY_INPUT_DOWN] > 4 && Key[KEY_INPUT_DOWN] % 4 == 0)){ g_NowSelectFile = (g_NowSelectFile + 1) % g_FileNameVec.size(); }else if(Key[KEY_INPUT_UP] == 1 || (Key[KEY_INPUT_UP] > 4 && Key[KEY_INPUT_UP] % 4 == 0)){ g_NowSelectFile = (g_NowSelectFile + g_FileNameVec.size() - 1) % g_FileNameVec.size(); }else if(Key[KEY_INPUT_RIGHT] == 1 || (Key[KEY_INPUT_RIGHT] > 4 && Key[KEY_INPUT_RIGHT] % 4 == 0)){ if(g_NowSelectFile + 40 < g_FileNameVec.size()){ g_NowSelectFile = g_NowSelectFile + 40; } }else if(Key[KEY_INPUT_LEFT] == 1 || (Key[KEY_INPUT_LEFT] > 4 && Key[KEY_INPUT_LEFT] % 4 == 0)){ if(g_NowSelectFile - 40 >= 0){ g_NowSelectFile = g_NowSelectFile - 40; } }else if(Key[KEY_INPUT_Z] == 1){ if(g_SelectFileVec[g_NowSelectFile] == 0){ g_SelectFileVec[g_NowSelectFile] = g_SelectFileCount + 1; g_SelectFileCount += 1; } }else if(Key[KEY_INPUT_X] == 1 || (Key[KEY_INPUT_X] > 4 && Key[KEY_INPUT_X] % 4 == 0)){ if(g_SelectFileCount > 0){ for(size_t i = 0, count = g_SelectFileVec.size(); i < count; i++) { if(g_SelectFileVec[i] == g_SelectFileCount){ g_SelectFileVec[i] = 0; break; } } g_SelectFileCount -= 1; } }else if(Key[KEY_INPUT_A] == 1 ){ for(size_t i = 0, count = g_SelectFileVec.size(); i < count; i++) { g_SelectFileVec[i] = i + 1; } g_SelectFileCount = g_SelectFileVec.size(); }else if(Key[KEY_INPUT_RETURN] == 1){ g_State = STATE_MAKE_ARCHIVE; }else if(Key[KEY_INPUT_W] == 1 || (Key[KEY_INPUT_W] > 4 && Key[KEY_INPUT_W] % 4 == 0)){ g_DifPosX += 10; }else if(Key[KEY_INPUT_Q] == 1 || (Key[KEY_INPUT_Q] > 4 && Key[KEY_INPUT_Q] % 4 == 0)){ g_DifPosX -= 10; } DrawString(200, 50, "■ 以下のファイルが見つかりました ■", g_White); for(size_t i = 0, count = g_FileNameVec.size(); i < count; i++) { if(g_SelectFileVec[i] > 0){ DrawFormatString( g_DifPosX + (i/40)*16*18, 50 + 32 + (i%40)*16, g_Green, "【%03d】", g_SelectFileVec[i], g_FileNameVec[i].c_str() ); } if(i == g_NowSelectFile){ DrawFormatString( g_DifPosX + 60 + (i/40)*16*18, 50 + 32 + (i%40)*16, g_Yellow, "%s", g_FileNameVec[i].c_str() ); }else{ DrawFormatString( g_DifPosX + 60 + (i/40)*16*18, 50 + 32 + (i%40)*16, g_White, "%s", g_FileNameVec[i].c_str() ); } } } void MakeArchive() { std::vector t_NumVec; t_NumVec.resize(g_FileNameVec.size(), -1); for(size_t i = 0, count = g_FileNameVec.size(); i < count; i++) { if(g_SelectFileVec[i] > 0){ t_NumVec[g_SelectFileVec[i] - 1] = i; } } std::string t_ArchiveHeader; std::string t_FileData; std::string t_ArchiveData; for(size_t i = 0, count = t_NumVec.size(); i < count; i++) { if(t_NumVec[i] != -1){ std::ifstream t_File; t_File.open( g_FileNameVec[t_NumVec[i]].c_str(), std::ios::binary ); if(t_File != 0){ std::vector t_BufVec; char t_Str[1024]; //ファイルの終わりまで移動 t_File.seekg( 0, std::ifstream::end ); //ファイルサイズを取得 int t_FileSize = (int)t_File.tellg(); t_File.seekg( 0, std::ifstream::beg); //ファイルを読み込む t_BufVec.resize(t_FileSize); t_File.read( &t_BufVec[0], t_FileSize ); sprintf_s( t_Str, sizeof(t_Str), "%d\"%s\"", t_FileSize, g_FileNameVec[t_NumVec[i]].c_str()); t_ArchiveHeader += t_Str; t_FileData.reserve(t_FileData.size() + t_FileSize); for(int j = 0; j < t_FileSize; j++) { t_FileData += t_BufVec[j]; } } } } t_ArchiveData = t_ArchiveHeader + '#' + t_FileData; std::ofstream fout; fout.open("MyArchive.arc", std::ios::out | std::ios::binary | std::ios::trunc); if(fout != 0){ fout.write( t_ArchiveData.c_str(), t_ArchiveData.size() ); fout.close(); //ファイルを閉じる } g_State = STATE_FINISH_ARCHIVE; } void FinishArchive() { if(Key[KEY_INPUT_RETURN] == 1){ g_State = STATE_SELECT_OPERATION; g_FileNameVec.clear(); g_SelectFileVec.clear(); g_NowOperationNum = 0; g_NowSelectFile = 0; g_SelectFileCount = 0; g_DifPosX = 0; } DrawString(100, 100, "アーカイブファイルを作成しました! (Enterで戻る)", g_White); } void SelectLoadArchive() { if(Key[KEY_INPUT_DOWN] == 1 || (Key[KEY_INPUT_DOWN] > 4 && Key[KEY_INPUT_DOWN] % 4 == 0)){ g_NowSelectFile = (g_NowSelectFile + 1) % g_FileNameVec.size(); }else if(Key[KEY_INPUT_UP] == 1 || (Key[KEY_INPUT_UP] > 4 && Key[KEY_INPUT_UP] % 4 == 0)){ g_NowSelectFile = (g_NowSelectFile + g_FileNameVec.size() - 1) % g_FileNameVec.size(); }else if(Key[KEY_INPUT_Z] == 1){ g_State = STATE_DRAW_ARCHIVE; CArchive t_Archive; //アーカイブファイルの読み込みに成功したら if(t_Archive.LoadArchive(g_FileNameVec[g_NowSelectFile]) != -1){ g_HandleVec.resize(t_Archive.GetFileNum()); for(int i = 0, count = t_Archive.GetFileNum(); i < count; i++) { const char* t_p = t_Archive.GetPointer(i + 1); int t_FileSize = t_Archive.GetFileSize(i + 1); std::string t_FileName = t_Archive.GetFileName(i + 1); if(t_p != NULL){ std::string t_Type[] = {"BMP","JPEG","PNG","DDS","ARGB","TGA", "bmp","jpeg","png","dds","argb","tga", "WAV","MP3","OGG","wav","mp3","ogg"}; //拡張子を取得 std::string t_FileType = t_FileName.substr( t_FileName.size() - 3, 3); for(int j = 0, count = sizeof(t_Type)/sizeof(t_Type[0]); j < count; j++) { if(t_Type[j] == t_FileType){ if(j >= 0 && j < 12){ g_HandleVec[i].m_Handle = CreateGraphFromMem( (void*)t_p, t_FileSize ); g_HandleVec[i].m_Type = RESOURCE_GRAPHIC; }else if(j >= 12){ g_HandleVec[i].m_Handle = LoadSoundMemByMemImage( (void*)t_p, t_FileSize ); g_HandleVec[i].m_Type = RESOURCE_SOUND; } } } } } g_FileNameVec.clear(); g_NowSelectFile = 0; for(int i = 0, count = t_Archive.GetFileNum(); i < count; i++) { const char* t_p = t_Archive.GetFileName(i + 1); if(t_p != NULL){ g_FileNameVec.push_back(t_p); } } if(g_HandleVec[g_NowSelectFile].m_Type == RESOURCE_SOUND){ PlaySoundMem( g_HandleVec[g_NowSelectFile].m_Handle, DX_PLAYTYPE_BACK); } } } DrawString(200, 50, "■ 解析するアーカイブファイルを選択してください ■", g_White); for(size_t i = 0, count = g_FileNameVec.size(); i < count; i++) { if(i == g_NowSelectFile){ DrawFormatString( 60 + (i/40)*16*30, 50 + 32 + (i%40)*16, g_Green, "%s", g_FileNameVec[i].c_str() ); }else{ DrawFormatString( 60 + (i/40)*16*30, 50 + 32 + (i%40)*16, g_White, "%s", g_FileNameVec[i].c_str() ); } } } void LoadArchive() { HANDLE t_FindHandle; WIN32_FIND_DATA t_FindData; t_FindHandle = FindFirstFile("*.arc", &t_FindData); if (t_FindHandle != INVALID_HANDLE_VALUE) { do { //ディレクトリでなければ if((t_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0){ g_FileNameVec.push_back(t_FindData.cFileName); } } while(FindNextFile(t_FindHandle, &t_FindData)); FindClose(t_FindHandle); } if(g_FileNameVec.size() == 0){ g_State = STATE_LOAD_FAIL; }else{ g_State = STATE_SELECT_ARCHIVE; } } void DrawArchive() { if(g_HandleVec[g_NowSelectFile].m_Type == RESOURCE_GRAPHIC){ DrawGraph( 200, 200, g_HandleVec[g_NowSelectFile].m_Handle, TRUE); } DrawString(200, 50, "■ 以下のファイルが見つかりました ■ (Enterで戻る)", g_White); for(size_t i = 0, count = g_FileNameVec.size(); i < count; i++) { if(i == g_NowSelectFile){ DrawFormatString( 60 + (i/40)*16*30, 50 + 32 + (i%40)*16, g_Green, "%s", g_FileNameVec[i].c_str() ); }else{ DrawFormatString( 60 + (i/40)*16*30, 50 + 32 + (i%40)*16, g_White, "%s", g_FileNameVec[i].c_str() ); } } if(Key[KEY_INPUT_DOWN] == 1 || (Key[KEY_INPUT_DOWN] > 4 && Key[KEY_INPUT_DOWN] % 4 == 0)){ int t_Next = (g_NowSelectFile + 1) % (int)g_FileNameVec.size(); if(g_HandleVec[g_NowSelectFile].m_Type == RESOURCE_SOUND){ StopSoundMem( g_HandleVec[g_NowSelectFile].m_Handle); } if(g_HandleVec[t_Next].m_Type == RESOURCE_SOUND){ PlaySoundMem( g_HandleVec[t_Next].m_Handle, DX_PLAYTYPE_BACK); } g_NowSelectFile = (g_NowSelectFile + 1) % (int)g_FileNameVec.size(); }else if(Key[KEY_INPUT_UP] == 1 || (Key[KEY_INPUT_UP] > 4 && Key[KEY_INPUT_UP] % 4 == 0)){ int t_Next = (g_NowSelectFile + g_FileNameVec.size() - 1) % g_FileNameVec.size(); if(g_HandleVec[g_NowSelectFile].m_Type == RESOURCE_SOUND){ StopSoundMem( g_HandleVec[g_NowSelectFile].m_Handle); } if(g_HandleVec[t_Next].m_Type == RESOURCE_SOUND){ PlaySoundMem( g_HandleVec[t_Next].m_Handle, DX_PLAYTYPE_BACK); } g_NowSelectFile = t_Next; }else if(Key[KEY_INPUT_RETURN] == 1 ){ if(g_HandleVec[g_NowSelectFile].m_Type == RESOURCE_SOUND){ StopSoundMem( g_HandleVec[g_NowSelectFile].m_Handle); } g_State = STATE_SELECT_OPERATION; g_NowSelectFile = 0; InitGraph(); InitSoundMem(); g_HandleVec.clear(); g_FileNameVec.clear(); } } void LoadFail() { if(Key[KEY_INPUT_RETURN] == 1 ){ g_State = STATE_SELECT_OPERATION; g_NowSelectFile = 0; g_HandleVec.clear(); g_FileNameVec.clear(); } DrawString(200, 50, "■ アーカイブファイルがありませんでした ■ (Enterで戻る)", g_White); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode( TRUE ); if(DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); SetGraphMode(1024, 768, 32); SetWindowPosition( 100, -24 ); SetBackgroundColor(0,0,70); srand((unsigned int)time(NULL)); g_White = GetColor(255,255,255); g_Yellow = GetColor(255,255,0); g_Green = GetColor(0,255,0); while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && g_State != STATE_END){ switch(g_State){ case STATE_SELECT_OPERATION: SelectOperation();break; case STATE_FIND_FILE: FindFile();break; case STATE_SELECT_FILE: SelectFile();break; case STATE_MAKE_ARCHIVE: MakeArchive();break; case STATE_FINISH_ARCHIVE: FinishArchive();break; case STATE_SELECT_ARCHIVE:SelectLoadArchive();break; case STATE_LOAD_ARCHIVE: LoadArchive();break; case STATE_DRAW_ARCHIVE: DrawArchive();break; case STATE_LOAD_FAIL: LoadFail();break; default:break; } ScreenFlip(); } DxLib_End(); return 0; }