CCommand CScenePlay::CreateCommand() { CCommand command; // 入力制限時は入力受付なし if(CSceneManager::getisKeyLock_()) return command; // STARTキー if(DXUTWasKeyPressed('P') || CJoyPadManager::IsKeyTrigger(0, CJoyPadManager::PAD_BTN_10)) command.Add(CCommand::START); // 非ポーズ時はこれより下の入力は受け付けない if(!CSceneManager::getisPause_()) return command; // 上キー int move = 0; if (DXUTIsKeyDown(VK_UP) || DXUTIsKeyDown('W') ||CJoyPadManager::IsKeyKeep(0, CJoyPadManager::CROSS_UP) || CJoyPadManager::IsKeyKeep(0, CJoyPadManager::CROSS_LEFT_UP) || CJoyPadManager::IsKeyKeep(0, CJoyPadManager::CROSS_UP_RIGHT) || CJoyPadManager::IsKeyKeep(0, CJoyPadManager::STICK_UP)) move |= CCommand::UP; // 下キー if (DXUTIsKeyDown(VK_DOWN) || DXUTIsKeyDown('S') || CJoyPadManager::IsKeyKeep(0, CJoyPadManager::CROSS_DOWN) || CJoyPadManager::IsKeyKeep(0, CJoyPadManager::CROSS_DOWN_LEFT) || CJoyPadManager::IsKeyKeep(0, CJoyPadManager::CROSS_RIGHT_DOWN) || CJoyPadManager::IsKeyKeep(0, CJoyPadManager::STICK_DOWN)) move |= CCommand::DOWN; // コマンドの追加 command.Add(move); // ○キー if(DXUTWasKeyPressed('Z') || DXUTWasKeyPressed(VK_RETURN) || CJoyPadManager::IsKeyTrigger(0, CJoyPadManager::PAD_BTN_2)) command.Add(CCommand::CIRCLE); // ✕キー if(DXUTWasKeyPressed('X') || CJoyPadManager::IsKeyTrigger(0, CJoyPadManager::PAD_BTN_3)) command.Add(CCommand::CROSS); return command; }
void CPlayer::keyboardProcess(double nowTime) { bool value; int i,j,temp; bool isDropped; int deletedLine; temp=board.chkBlock(playInfo.nowXPos,playInfo.nowYPos,CBlockMgr::getBlock(playerNum,playInfo.turnNum),playInfo.nowTurn); if(temp==CBoard::ONCOLLISION) //보드가 꽉차서 죽는경우., { MYTRACE("[%d]### Death by collision (posX=%d turn=%d turnNum=%d blockNum=%d)",playerNum,decisionInfo.posX,decisionInfo.turn,playInfo.turnNum, CBlockMgr::getBlock(playerNum,playInfo.turnNum)); setDead(); return; } isDropped=false; for(i=0;i<6;i++) { value=DXUTIsKeyDown(keyPad[kbdType][playerNum][i]); if(value==false) isRepeated[i]=false; //일정 시간이 지나지 않았다면 입력받지 않는다. if(isRepeated[i]==true && nowTime-lastKeyboardTime[i]<=keyboardInputLimitTime[i]) { continue; } else { isKeyDown[i]=isKeyDown[i] | value; } if(!isKeyDown[i]) continue; //첫입력은 약간의 딜레이를 준다. if(isRepeated[i]==false) { isRepeated[i]=true; if(i==0 || i==4) //UP키나 스페이스 키라면 딜레이를 많이 준다. keyboardInputLimitTime[i]=100; else keyboardInputLimitTime[i]=keyBoardInterval; //약간의 딜레이 } else { if(i==3)//Down이라면 keyboardInputLimitTime[i]=keyBoardRepeatInterval*1.2; //조금 더 늦게 반응 else keyboardInputLimitTime[i]=keyBoardRepeatInterval; //적은 딜레이 } lastKeyboardTime[i]=nowTime; isKeyDown[i]=false; //키보드 처리 switch(i) { case 0:/*UP*/ temp=(playInfo.nowTurn+1)%4; //왼쪽이나 오른쪽으로 이동해서 돌릴 수 있다면 그렇게 한다. for(j=0;j<4;j++) { if(board.chkBlock(playInfo.nowXPos+j,playInfo.nowYPos,CBlockMgr::getBlock(playerNum,playInfo.turnNum),temp)==CBoard::ONNOTHING) { playInfo.nowTurn=temp; playInfo.nowXPos+=j; game.ogg.Play(OGG_MOVE); break; } if(board.chkBlock(playInfo.nowXPos-j,playInfo.nowYPos,CBlockMgr::getBlock(playerNum,playInfo.turnNum),temp)==CBoard::ONNOTHING) { playInfo.nowTurn=temp; playInfo.nowXPos-=j; game.ogg.Play(OGG_MOVE); break; } } break; case 1:/*LEFT*/ if(board.chkBlock(playInfo.nowXPos-1,playInfo.nowYPos,CBlockMgr::getBlock(playerNum,playInfo.turnNum),playInfo.nowTurn)==CBoard::ONNOTHING) { playInfo.nowXPos--; game.ogg.Play(OGG_MOVE); } break; case 2:/*RIGHT*/ if(board.chkBlock(playInfo.nowXPos+1,playInfo.nowYPos,CBlockMgr::getBlock(playerNum,playInfo.turnNum),playInfo.nowTurn)==CBoard::ONNOTHING) { playInfo.nowXPos++; game.ogg.Play(OGG_MOVE); } break; case 3:/*DOWN*/ playInfo.nowYPos++; lastDownTime=nowTime; game.ogg.Play(OGG_SOFTDROP); break; case 4:/*DROP*/ isDropped=true; keyboardInputLimitTime[i]=dropInterval; playInfo.isOnHold=FALSE; break; case 5:/*HOLD*/ if(playInfo.isOnHold) { game.ogg.Play(OGG_HOLDFAIL); } else { playInfo.holdCount++; playInfo.isOnHold=TRUE; game.ogg.Play(OGG_HOLD); keyboardInputLimitTime[i]=holdInterval; if(playInfo.holdNum==0) { playInfo.holdNum=CBlockMgr::getBlock(playerNum,playInfo.turnNum); setNextBlock(nowTime); } else { int holdBlock=CBlockMgr::getBlock(playerNum,playInfo.turnNum); CBlockMgr::setBlock(playerNum,playInfo.turnNum,playInfo.holdNum); playInfo.holdNum=holdBlock; playInfo.turnNum--; setNextBlock(nowTime); return; } } break; } } //일정시간이 지났다면 떨어짐. if(nowTime-lastDownTime>1.0) // 1.0을 시간이 지남에 따라서 줄어들게 만들어야 함 { lastDownTime=nowTime; playInfo.nowYPos++; } //충돌하였다면. temp=board.chkBlock(playInfo.nowXPos,playInfo.nowYPos,CBlockMgr::getBlock(playerNum,playInfo.turnNum),playInfo.nowTurn); if(isDropped || temp==CBoard::ONCOLLISION) { game.ogg.Stop(OGG_HARDDROP);game.ogg.Play(OGG_HARDDROP); //블럭을 놓는다. board.putBlock(playInfo.nowXPos,playInfo.nowYPos,CBlockMgr::getBlock(playerNum,playInfo.turnNum),playInfo.nowTurn); //꽉찬 줄을 지운다. if((deletedLine=board.deleteFilledLine())>0) { playInfo.lineDeletionCount+=deletedLine; switch(deletedLine) { case 1: game.ogg.Stop(OGG_SINGLE);game.ogg.Play(OGG_SINGLE,false); playInfo.isBackToBack=FALSE; break; case 2: game.ogg.Stop(OGG_DOUBLE);game.ogg.Play(OGG_DOUBLE,false); playInfo.isBackToBack=FALSE; if(targetPlayer!=NULL) targetPlayer->getEventQueue()->push_back(makePushEvent(1,false));//old 0 break; case 3: game.ogg.Stop(OGG_TRIPLE);game.ogg.Play(OGG_TRIPLE,false); playInfo.isBackToBack=FALSE; if(targetPlayer!=NULL) targetPlayer->getEventQueue()->push_back(makePushEvent(2,false)); //old 1 break; case 4: if(playInfo.isBackToBack) { game.ogg.Stop(OGG_BACKTOBACK_TETRIS);game.ogg.Play(OGG_BACKTOBACK_TETRIS); if(targetPlayer!=NULL) targetPlayer->getEventQueue()->push_back(makePushEvent(5,false));//old 4 } else { game.ogg.Stop(OGG_TETRIS);game.ogg.Play(OGG_TETRIS); if(targetPlayer!=NULL) targetPlayer->getEventQueue()->push_back(makePushEvent(4,false));//old 3 } playInfo.isBackToBack=TRUE; break; } //콤보 수 증가. playInfo.nowCombo++; //콤보에 따른 라인 추가 if(playInfo.nowCombo>=3 && playInfo.nowCombo<=4) { if(targetPlayer!=NULL) targetPlayer->getEventQueue()->push_back(makePushEvent(1,false)); }else if(playInfo.nowCombo>=5 && playInfo.nowCombo<=6){ if(targetPlayer!=NULL) targetPlayer->getEventQueue()->push_back(makePushEvent(2,false)); }else if(playInfo.nowCombo>=7 && playInfo.nowCombo<=8){ if(targetPlayer!=NULL) targetPlayer->getEventQueue()->push_back(makePushEvent(3,false)); }else if(playInfo.nowCombo>=9){ if(targetPlayer!=NULL) targetPlayer->getEventQueue()->push_back(makePushEvent(4,false)); } /* old if(playInfo.nowCombo>=3 && playInfo.nowCombo<=7) { if(targetPlayer!=NULL) targetPlayer->getEventQueue()->push_back(makePushEvent(1)); }else if(playInfo.nowCombo>=8 && playInfo.nowCombo<=13){ if(targetPlayer!=NULL) targetPlayer->getEventQueue()->push_back(makePushEvent(2)); }else if(playInfo.nowCombo>=14){ if(targetPlayer!=NULL) targetPlayer->getEventQueue()->push_back(makePushEvent(3)); } */ //콤보 음성효과 switch(playInfo.nowCombo) { case 0: case 1:break; case 2:game.ogg.Stop(OGG_COMBO1);game.ogg.Play(OGG_COMBO1);break; case 3:game.ogg.Stop(OGG_COMBO2);game.ogg.Play(OGG_COMBO2);break; case 4:game.ogg.Stop(OGG_COMBO3);game.ogg.Play(OGG_COMBO3);break; case 5:game.ogg.Stop(OGG_COMBO4);game.ogg.Play(OGG_COMBO4);break; case 6:game.ogg.Stop(OGG_COMBO5);game.ogg.Play(OGG_COMBO5);break; case 7:game.ogg.Stop(OGG_COMBO6);game.ogg.Play(OGG_COMBO6);break; case 8:game.ogg.Stop(OGG_COMBO7);game.ogg.Play(OGG_COMBO7);break; default:game.ogg.Stop(OGG_COMBO8);game.ogg.Play(OGG_COMBO8);break; } //콤보 애니메이션 if(playInfo.nowCombo>1) { if(playInfo.nowCombo<18) game.effectCollection.insertEffect(ANI_COMBO2+playInfo.nowCombo-2,CBoard::boardPosition[playerNum].x+30,270,nowTime); else game.effectCollection.insertEffect(ANI_COMBOWOW,CBoard::boardPosition[playerNum].x+30,270,nowTime); } //터진 것에 대한 effect를 준다 for(i=0;i<21;i++) { if(board.deletedLine[i]) //지워진 라인에 대해서 effect를 준다. { game.effectCollection.insertEffect(ANI_BOMB,CBoard::boardPosition[playerNum].x,CBoard::boardPosition[playerNum].y+i*22,nowTime); game.effectCollection.insertEffect(ANI_BOMB,CBoard::boardPosition[playerNum].x+64,CBoard::boardPosition[playerNum].y+i*22,nowTime); game.effectCollection.insertEffect(ANI_BOMB,CBoard::boardPosition[playerNum].x+128,CBoard::boardPosition[playerNum].y+i*22,nowTime); } } } else //라인이 지워지지 않았다면 { playInfo.nowCombo=0; //콤보 초기화. if(CBlockMgr::getBlock(playerNum,playInfo.turnNum)==5) playInfo.isBackToBack=FALSE; } setNextBlock(nowTime); } }