#include "DxLib.h" #include "time.h" #include #include 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 MapChipID { MAP_NONE = -1, MAP_WALL, MAP_FLOOR }; enum DirectID { DIRECT_RIGHT, DIRECT_LEFT, DIRECT_UP, DIRECT_DOWN }; enum MoveID { MOVE_NONE, MOVE_RIGHT, MOVE_LEFT, MOVE_UP, MOVE_DOWN, MOVE_STAY }; struct MapInfo { MapChipID m_ChipID; int m_ObjectUniqID; MapInfo(){ m_ChipID = MAP_NONE; m_ObjectUniqID = -1; } }; struct PlayerInfo { int m_PosX, m_PosY; MoveID m_MoveFlag; DirectID m_Direct; PlayerInfo(){ m_PosX = m_PosY = 0; m_Direct = DIRECT_DOWN; m_MoveFlag = MOVE_NONE; } }; struct DrawObjectInfo3 { int m_PosX, m_PosY; int m_DifX, m_DifY; float m_ExtendNum, m_RotaNum; int m_TransNum; int m_Handle; DrawObjectInfo3() { m_PosX = m_PosY = 0; m_DifX = m_DifY = 0; m_ExtendNum = m_RotaNum = 1.0f; m_TransNum = 255; m_Handle = -1; } }; struct MoverInfo { int m_SpeedCount; int m_Speed; int m_Step; int m_NowStep; int m_StartPosX, m_StartPosY; int m_NextPosX, m_NextPosY; DWORD m_MoveTime; MoveID m_MoveID; MoverInfo(){ m_SpeedCount = 0; m_Speed = 0; m_Step = 1; m_NowStep = 1; m_MoveID = MOVE_NONE; m_StartPosX = m_StartPosY = 0; m_NextPosX = m_NextPosY = 0; m_MoveTime = 0; } }; MoverInfo g_MoverInfo[2]; const int g_HumanHandleVecNum = 0; const int g_EnemyHandleVecNum = 0; const int g_MapChipHandleVecNum = 1; int g_MoveHumanHandle = 0; int g_MoveEnemyHandle = 0; std::vector g_pDrawObjectVec; std::list g_DrawObjectList; std::vector> g_HandleVec; DWORD g_NowTime = 0; const DWORD g_BaseMoveTime = 600; DWORD g_StartTime = 0; DWORD g_GamePlayTime = 0; int g_Map[][8] = { {0,0,0,0,0,0,0,0,}, {0,1,1,1,0,1,1,0,}, {0,1,1,1,0,1,1,0,}, {0,0,1,1,0,1,1,0,}, {0,1,1,1,0,1,1,0,}, {0,1,1,0,0,0,1,0,}, {0,1,1,1,1,1,1,0,}, {0,0,0,0,0,0,0,0,}}; std::vector> g_MapVec; int g_White = 0; int MyLoadDivGraph( const char* t_pFileName, int t_VecNum, int t_SplitX, int t_SplitY, int t_SizeX, int t_SizeY) { int result = -1; if(t_VecNum >= 0 && t_SplitX >= 1 && t_SplitY >= 1){ if( (int)g_HandleVec.size() <= t_VecNum ){ g_HandleVec.resize(t_VecNum + 1); } if( g_HandleVec[t_VecNum].empty() == TRUE ){ g_HandleVec[t_VecNum].resize(t_SplitX*t_SplitY); if( LoadDivGraph( t_pFileName, t_SplitX * t_SplitY, t_SplitX, t_SplitY, t_SizeX, t_SizeY, &(g_HandleVec[t_VecNum][0]) ) != -1){ result = t_VecNum; } } } return(result); } int MyGetHandle(int t_VecNum, int t_SplitNum) { int result = -1; if(t_VecNum >= 0 && t_SplitNum >= 0){ if((int)g_HandleVec.size() > t_VecNum && (int)g_HandleVec[t_VecNum].size() > t_SplitNum){ result = g_HandleVec[t_VecNum][t_SplitNum]; } } return(result); } int AddDrawObject(DrawObjectInfo3& t_Info, int t_VecNum, int t_SplitNum) { int result = -1; t_Info.m_Handle = MyGetHandle( t_VecNum, t_SplitNum ); g_DrawObjectList.push_back(t_Info); g_pDrawObjectVec.push_back(&(g_DrawObjectList.back())); result = g_pDrawObjectVec.size() - 1; return(result); } void DrawAllObject() { std::list::iterator it; for( it = g_DrawObjectList.begin(); it != g_DrawObjectList.end(); it++) { DrawGraph( (*it).m_PosX + (*it).m_DifX, (*it).m_PosY + (*it).m_DifY, (*it).m_Handle, TRUE ); } } void GetDrawObject(int t_MoveHandle, DrawObjectInfo3& t_Info) { if(t_MoveHandle >= 0 && (int)g_pDrawObjectVec.size() > t_MoveHandle ){ t_Info = (*g_pDrawObjectVec[t_MoveHandle]); } } void SetDrawObject(int t_MoveHandle, DrawObjectInfo3& t_Info) { if(t_MoveHandle >= 0 && (int)g_pDrawObjectVec.size() > t_MoveHandle ){ (*g_pDrawObjectVec[t_MoveHandle]) = t_Info; } } int CheckMove(int m_PosX, int m_PosY) { int result = -1; int t_VecX = (m_PosX>>5); int t_VecY = (m_PosY>>5); if((int)g_MapVec.size() > t_VecY && t_VecY >= 0 && (int)g_MapVec[t_VecY].size() > t_VecX && t_VecX >= 0){ if(g_MapVec[t_VecY][t_VecX].m_ChipID == MAP_FLOOR && g_MapVec[t_VecY][t_VecX].m_ObjectUniqID == -1){ result = 0; } } return(result); } int SetObjectHandleOfMap(int m_PosX, int m_PosY, int ObjectHandle) { int result = -1; int t_VecX = (m_PosX>>5); int t_VecY = (m_PosY>>5); if((int)g_MapVec.size() > t_VecY && t_VecY >= 0 && (int)g_MapVec[t_VecY].size() > t_VecX && t_VecX >= 0){ g_MapVec[t_VecY][t_VecX].m_ObjectUniqID = ObjectHandle; } return(result); } int ReSetObjectHandleOfMap(int m_PosX, int m_PosY) { int result = -1; int t_VecX = (m_PosX>>5); int t_VecY = (m_PosY>>5); if((int)g_MapVec.size() > t_VecY && t_VecY >= 0 && (int)g_MapVec[t_VecY].size() > t_VecX && t_VecX >= 0){ g_MapVec[t_VecY][t_VecX].m_ObjectUniqID = -1; } return(result); } void UpDateStep() { for(int i = 0; i < 2; i++) { g_MoverInfo[i].m_SpeedCount += g_MoverInfo[0].m_Speed; g_MoverInfo[i].m_Step = g_MoverInfo[i].m_SpeedCount / g_MoverInfo[i].m_Speed; g_MoverInfo[i].m_SpeedCount %= g_MoverInfo[i].m_Speed; } } void MoveHuman() { DrawObjectInfo3 t_Info; GetDrawObject( g_MoveHumanHandle, t_Info ); if(g_MoverInfo[0].m_MoveID == MOVE_NONE){ g_StartTime = 0; g_MoverInfo[0].m_MoveTime = g_BaseMoveTime; if(Key[KEY_INPUT_RIGHT] >= 1){ t_Info.m_Handle = MyGetHandle( g_HumanHandleVecNum, 0 ); SetDrawObject( g_MoveHumanHandle, t_Info ); if( CheckMove(t_Info.m_PosX + 32, t_Info.m_PosY) == 0 ){ g_MoverInfo[0].m_MoveID = MOVE_RIGHT; g_MoverInfo[0].m_StartPosX = t_Info.m_PosX; g_MoverInfo[0].m_StartPosY = t_Info.m_PosY; g_MoverInfo[0].m_NextPosX = t_Info.m_PosX + 32; g_MoverInfo[0].m_NextPosY = t_Info.m_PosY; g_StartTime = g_GamePlayTime; UpDateStep(); SetObjectHandleOfMap(g_MoverInfo[0].m_NextPosX, g_MoverInfo[0].m_NextPosY, g_MoveHumanHandle); } }else if(Key[KEY_INPUT_LEFT] >= 1){ t_Info.m_Handle = MyGetHandle( g_HumanHandleVecNum, 4 ); SetDrawObject( g_MoveHumanHandle, t_Info ); if( CheckMove(t_Info.m_PosX - 32, t_Info.m_PosY) == 0 ){ g_MoverInfo[0].m_MoveID = MOVE_LEFT; g_MoverInfo[0].m_StartPosX = t_Info.m_PosX; g_MoverInfo[0].m_StartPosY = t_Info.m_PosY; g_MoverInfo[0].m_NextPosX = t_Info.m_PosX - 32; g_MoverInfo[0].m_NextPosY = t_Info.m_PosY; g_StartTime = g_GamePlayTime; UpDateStep(); SetObjectHandleOfMap(g_MoverInfo[0].m_NextPosX, g_MoverInfo[0].m_NextPosY, g_MoveHumanHandle); } }else if(Key[KEY_INPUT_UP] >= 1){ t_Info.m_Handle = MyGetHandle( g_HumanHandleVecNum, 8 ); SetDrawObject( g_MoveHumanHandle, t_Info ); if( CheckMove(t_Info.m_PosX, t_Info.m_PosY - 32) == 0 ){ g_MoverInfo[0].m_MoveID = MOVE_UP; g_MoverInfo[0].m_StartPosX = t_Info.m_PosX; g_MoverInfo[0].m_StartPosY = t_Info.m_PosY; g_MoverInfo[0].m_NextPosX = t_Info.m_PosX; g_MoverInfo[0].m_NextPosY = t_Info.m_PosY - 32; g_StartTime = g_GamePlayTime; UpDateStep(); SetObjectHandleOfMap(g_MoverInfo[0].m_NextPosX, g_MoverInfo[0].m_NextPosY, g_MoveHumanHandle); } }else if(Key[KEY_INPUT_DOWN] >= 1){ t_Info.m_Handle = MyGetHandle( g_HumanHandleVecNum, 12 ); SetDrawObject( g_MoveHumanHandle, t_Info ); if( CheckMove(t_Info.m_PosX, t_Info.m_PosY + 32) == 0 ){ g_MoverInfo[0].m_MoveID = MOVE_DOWN; g_MoverInfo[0].m_StartPosX = t_Info.m_PosX; g_MoverInfo[0].m_StartPosY = t_Info.m_PosY; g_MoverInfo[0].m_NextPosX = t_Info.m_PosX; g_MoverInfo[0].m_NextPosY = t_Info.m_PosY + 32; g_StartTime = g_GamePlayTime; UpDateStep(); SetObjectHandleOfMap(g_MoverInfo[0].m_NextPosX, g_MoverInfo[0].m_NextPosY, g_MoveHumanHandle); } } } if(g_MoverInfo[0].m_MoveID != MOVE_NONE){ double t_Rate = (double)(g_GamePlayTime - g_StartTime ) / g_MoverInfo[0].m_MoveTime; if(t_Rate > 1.0){ t_Rate = 1.0; } t_Info.m_PosX = g_MoverInfo[0].m_StartPosX + (int)( t_Rate*(g_MoverInfo[0].m_NextPosX - g_MoverInfo[0].m_StartPosX) ); t_Info.m_PosY = g_MoverInfo[0].m_StartPosY + (int)( t_Rate*(g_MoverInfo[0].m_NextPosY - g_MoverInfo[0].m_StartPosY) ); t_Info.m_Handle = MyGetHandle( g_HumanHandleVecNum, (g_MoverInfo[0].m_MoveID - 1)*4 + ((int)(t_Rate*4) % 4) ); if(t_Rate == 1.0){ g_MoverInfo[0].m_MoveID = MOVE_NONE; ReSetObjectHandleOfMap(g_MoverInfo[0].m_StartPosX, g_MoverInfo[0].m_StartPosY); } SetDrawObject( g_MoveHumanHandle, t_Info ); DrawFormatString( 300, 316, g_White, "(%06d - %06d)/%06d = %lf", (g_GamePlayTime - g_StartTime), ((g_MoverInfo[0].m_NowStep - 1)*g_MoverInfo[0].m_MoveTime), g_MoverInfo[0].m_MoveTime, (double)(g_GamePlayTime - g_StartTime - (g_MoverInfo[0].m_NowStep - 1)*g_MoverInfo[0].m_MoveTime) / g_MoverInfo[0].m_MoveTime ); } } void MoveEnemy() { if(g_StartTime != 0){ DrawObjectInfo3 t_Info; GetDrawObject( g_MoveEnemyHandle, t_Info ); if(g_MoverInfo[1].m_MoveID == MOVE_NONE){ if(g_MoverInfo[1].m_Step >= g_MoverInfo[1].m_NowStep){ int t_Move[4] = {0,1,2,3}; for(int i = 0; i < 6; i++) { int t_RandA = rand() % 4; int t_RandB = rand() % 4; int t_Value = t_Move[t_RandA]; t_Move[t_RandA] = t_Move[t_RandB]; t_Move[t_RandB] = t_Value; } g_MoverInfo[1].m_MoveTime = g_BaseMoveTime / g_MoverInfo[1].m_Step; for(int i = 0; i < 4; i++) { switch(t_Move[i]){ case 0: if(CheckMove( t_Info.m_PosX + 32, t_Info.m_PosY ) == 0){ g_MoverInfo[1].m_MoveID = MOVE_RIGHT; g_MoverInfo[1].m_StartPosX = t_Info.m_PosX; g_MoverInfo[1].m_StartPosY = t_Info.m_PosY; g_MoverInfo[1].m_NextPosX = t_Info.m_PosX + 32; g_MoverInfo[1].m_NextPosY = t_Info.m_PosY; SetObjectHandleOfMap(g_MoverInfo[1].m_NextPosX, g_MoverInfo[1].m_NextPosY, g_MoveEnemyHandle); } break; case 1: if(CheckMove( t_Info.m_PosX - 32, t_Info.m_PosY ) == 0){ g_MoverInfo[1].m_MoveID = MOVE_LEFT; g_MoverInfo[1].m_StartPosX = t_Info.m_PosX; g_MoverInfo[1].m_StartPosY = t_Info.m_PosY; g_MoverInfo[1].m_NextPosX = t_Info.m_PosX - 32; g_MoverInfo[1].m_NextPosY = t_Info.m_PosY; SetObjectHandleOfMap(g_MoverInfo[1].m_NextPosX, g_MoverInfo[1].m_NextPosY, g_MoveEnemyHandle); } break; case 2: if(CheckMove( t_Info.m_PosX, t_Info.m_PosY - 32 ) == 0){ g_MoverInfo[1].m_MoveID = MOVE_UP; g_MoverInfo[1].m_StartPosX = t_Info.m_PosX; g_MoverInfo[1].m_StartPosY = t_Info.m_PosY; g_MoverInfo[1].m_NextPosX = t_Info.m_PosX; g_MoverInfo[1].m_NextPosY = t_Info.m_PosY - 32; SetObjectHandleOfMap(g_MoverInfo[1].m_NextPosX, g_MoverInfo[1].m_NextPosY, g_MoveEnemyHandle); } break; case 3: if(CheckMove( t_Info.m_PosX, t_Info.m_PosY + 32 ) == 0){ g_MoverInfo[1].m_MoveID = MOVE_DOWN; g_MoverInfo[1].m_StartPosX = t_Info.m_PosX; g_MoverInfo[1].m_StartPosY = t_Info.m_PosY; g_MoverInfo[1].m_NextPosX = t_Info.m_PosX; g_MoverInfo[1].m_NextPosY = t_Info.m_PosY + 32; SetObjectHandleOfMap(g_MoverInfo[1].m_NextPosX, g_MoverInfo[1].m_NextPosY, g_MoveEnemyHandle); } break; default:break; } if(g_MoverInfo[1].m_MoveID != MOVE_NONE){ break; } } if(g_MoverInfo[1].m_MoveID == MOVE_NONE){ g_MoverInfo[1].m_MoveID = MOVE_STAY; g_MoverInfo[1].m_StartPosX = t_Info.m_PosX; g_MoverInfo[1].m_StartPosY = t_Info.m_PosY; g_MoverInfo[1].m_NextPosX = t_Info.m_PosX; g_MoverInfo[1].m_NextPosY = t_Info.m_PosY; SetObjectHandleOfMap(g_MoverInfo[1].m_NextPosX, g_MoverInfo[1].m_NextPosY, g_MoveEnemyHandle); } } } if(g_MoverInfo[1].m_MoveID != MOVE_NONE){ double t_Rate = (double)(g_GamePlayTime - g_StartTime - (g_MoverInfo[1].m_NowStep - 1)*(g_MoverInfo[1].m_MoveTime)) / g_MoverInfo[1].m_MoveTime; if(t_Rate > 1.0){ t_Rate = 1.0; } t_Info.m_PosX = g_MoverInfo[1].m_StartPosX + (int)( t_Rate*(g_MoverInfo[1].m_NextPosX - g_MoverInfo[1].m_StartPosX) ); t_Info.m_PosY = g_MoverInfo[1].m_StartPosY + (int)( t_Rate*(g_MoverInfo[1].m_NextPosY - g_MoverInfo[1].m_StartPosY) ); if(g_MoverInfo[1].m_MoveID != MOVE_STAY){ t_Info.m_Handle = MyGetHandle( g_EnemyHandleVecNum, (g_MoverInfo[1].m_MoveID - 1)*4 + ((int)(t_Rate*4) % 4) ); } if(t_Rate == 1.0){ g_MoverInfo[1].m_MoveID = MOVE_NONE; g_MoverInfo[1].m_NowStep += 1; if(g_MoverInfo[1].m_MoveID != MOVE_STAY){ ReSetObjectHandleOfMap(g_MoverInfo[1].m_StartPosX, g_MoverInfo[1].m_StartPosY); } if(g_MoverInfo[1].m_NowStep > g_MoverInfo[1].m_Step){ g_MoverInfo[1].m_NowStep = 1; } } SetDrawObject( g_MoveEnemyHandle, t_Info ); DWORD t_Time = g_GamePlayTime - g_StartTime; DrawFormatString( 300, 316, g_White, "(%06d - %06d)/%06d = %lf", (g_GamePlayTime - g_StartTime), ((g_MoverInfo[1].m_NowStep - 1)*g_MoverInfo[1].m_MoveTime), g_MoverInfo[1].m_MoveTime, (double)(g_GamePlayTime - g_StartTime - (g_MoverInfo[1].m_NowStep - 1)*g_MoverInfo[1].m_MoveTime) / g_MoverInfo[1].m_MoveTime ); } } } void MyInitGraph() { MyLoadDivGraph( "Human.png", g_HumanHandleVecNum, 4, 4, 32, 64); MyLoadDivGraph( "MapChip1.png", g_MapChipHandleVecNum, 2, 2, 32, 32); } void MyInitDrawObject() { for(int y = 0, count = g_MapVec.size(); y < count; y++) { for(int x = 0, count2 = g_MapVec[y].size(); x < count2; x++) { DrawObjectInfo3 t_Info; t_Info.m_PosX = (x<<5); t_Info.m_PosY = (y<<5); AddDrawObject( t_Info, g_MapChipHandleVecNum, (int)g_MapVec[y][x].m_ChipID ); } } //ŽålŒö DrawObjectInfo3 t_Info; t_Info.m_PosX = (1<<5); t_Info.m_PosY = (1<<5); t_Info.m_DifY = -40; g_MoveHumanHandle = AddDrawObject( t_Info, g_HumanHandleVecNum, 0 ); SetObjectHandleOfMap( t_Info.m_PosX, t_Info.m_PosY, g_MoveHumanHandle ); //“G t_Info.m_PosX = (3<<5); t_Info.m_PosY = (3<<5); t_Info.m_DifY = -40; g_MoveEnemyHandle = AddDrawObject( t_Info, g_EnemyHandleVecNum, 0 ); SetObjectHandleOfMap( t_Info.m_PosX, t_Info.m_PosY, g_MoveEnemyHandle ); } void MyInitMoverInfo() { g_MoverInfo[0].m_Speed = 36; g_MoverInfo[1].m_Speed = 18; } void LoadMap() { int t_HeightNum = sizeof(g_Map) / sizeof(g_Map[0]); int t_WidthNum = sizeof(g_Map[0]) / sizeof(g_Map[0][0]); g_MapVec.resize(t_HeightNum); for(int y = 0; y < t_HeightNum; y++) { g_MapVec[y].resize(t_WidthNum); for(int x = 0; x < t_WidthNum; x++) { switch(g_Map[y][x]){ case 0: g_MapVec[y][x].m_ChipID = MAP_WALL;break; case 1: g_MapVec[y][x].m_ChipID = MAP_FLOOR;break; default:break; } } } } 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); LoadMap(); MyInitGraph(); MyInitDrawObject(); MyInitMoverInfo(); while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0){ g_NowTime = timeGetTime(); MoveHuman(); MoveEnemy(); DrawAllObject(); ScreenFlip(); g_GamePlayTime += (timeGetTime() - g_NowTime); } DxLib_End(); return 0; }