Exemple #1
0
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;
}
Exemple #2
0
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);				
	}

}