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

📄 cscene.cpp

📁 一个3D的保龄球的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			{
			m_object[RENDER_PLAYER]->SetHideProperty(true);
			if(m_curCamId >= 1 && m_curCamId < 9 )
			{
			setCameraStage(CCSS_ROLLING);				
			}						
			if(m_curCamId == 9 && m_collideLookType == COLLIDE_LOOK_BACK)
			m_object[RENDER_PLAYER]->SetHideProperty(false);
			
			  m_render3D.GetG3d()->setZDist(FOV_OTHERS);//FOV_FORWARD);
			  m_bTvOn = TV_ANI_PLAYER_DONE;	
			  m_ball.SetPositionX(m_replayData[0][0][RPL_POS_X]);
			  }
			  else 
			  {
			  m_ball.StepWithPlayer(m_player, &m_vHandPos, FALSE);//ball follows the player...
			  //
			  m_panelDownCount=(--m_panelDownCount)>0?m_panelDownCount:0;
			  replayingOnTv();
			}*/
				if(withAI == 0 && m_frameIndex == 0)
				{
					if(!(m_iTutorialStage&TUTORIAL_REPLAY_INSTRUCTION))
					{
						m_curHint = ID_HINT_BONUS_CONTINUE;  // player fouls
						setCurTutorialStage(TUTORIAL_REPLAY_INSTRUCTION, withAI);
					}
					++m_frameIndex;
					break;
				}
				else
				{
					if(m_bIsTutStage && withAI == 0)
					{
						if(m_pInput->KeyPressed(VKEY_MENU_NEXT | VKEY_MENU_CLR))
						{
							//m_curHint = ID_HINT_PLAYER_FOUL; 
							m_frameIndex = 1;
							m_iTutorialStage += TUTORIAL_REPLAY_INSTRUCTION;
							m_bIsTutStage = false;
						}
						break;			
					}
				}	
				
				setCameraStage(CCSS_THROW,m_currFrame);	
				m_bTvOn = TV_ANI_PLAYER_DONE;
				m_render3D.GetG3d()->setZDist(FOV_OTHERS);//FOV_FORWARD);
				m_bTvOn = TV_ANI_PLAYER_DONE;	
				m_ball.SetPositionX(m_replayData[0][0][RPL_POS_X]);
			}
			else
			{
				++m_iBonusAni;
			}
		}
		else if (m_bTvOn == TV_ANI_PLAYER_DONE)
		{
			//if(!m_bTvAniPlaying)
			{				
			/*if ((m_colAni == ANI_COLLISION_SPLIT || m_colAni == ANI_FENCE_COLLISION || m_colAni == ANI_IN_GUTTER))
			{
			setTvRollBack(1);
			}
				else*///(m_colAni == ANI_COLLISION_STRIKE || m_colAni == ANI_COLLISION_SPARE || m_colAni == ANI_TURKEY_STRIKE)
				{
					replayingOnTv();
				}
			}
			/*else
			{
			++m_iBonusAni;
		}*/
			//grabbingTenpins(TRUE,withAI);
		}
		else if(m_bTvOn == TV_ANI_ROLL_BACK)
		{
			rollBackTv();
		}
		else if(m_bTvOn == TV_ANI_FINISH)
		{
			//m_colAni = WITHOUT_ANI;
			SetStage(DS_PLAYER_FINISH_ANI, withAI);	
			//switchToWaiting();
		}
		m_cCamera->UpdateCamera(m_currFrame);		//Milo 03-03	
		return ret;
		break;	
	case DS_WAITING_FOR_NEXT:
		m_curStage=DS_DELIVERY_END;		
		break;
		
		
	case DS_RESULT_ANI:
		{
			if (m_player->PlayingAnimation(TRUE) == PLAYER_ANI_FINISH
				|| m_player->PlayingAnimation(TRUE) == PLAYER_ANI_FOUL_FINISH)
			{
				if(m_frameIndex >  (m_player->GetStopFrame()*2+12)) //stop longer time 
				{
					if(m_bIsDraw)
					{						
						m_pMatch->SetCurPlayer(0);
						m_pMatch->SetCurPinMode(ALL_TENPINS_STAND);
						ret = MATCH_DRAW_RETURN;
					}
					else
					{
						//m_player->TurnOver();
						ret = MATCH_FINISH_RETURN;
					}
					
				}
				else
				{
					++m_frameIndex;
				}
			}
			++m_iBonusAni;
		}
		break;
		
	case DS_STORY_MATCHEND:
		{
			if (m_player->PlayingAnimation(TRUE) == PLAYER_ANI_FINISH
				|| m_player->PlayingAnimation(TRUE) == PLAYER_ANI_FOUL_FINISH)
			{	
				if(m_frameIndex >  (m_player->GetStopFrame()*2+12))//stop longer time 
				{
					ret = MATCH_FINISH_RETURN;
				}
				else
				{
					++m_frameIndex;
				}
			}	
		}		
		break;
		
	case DS_DELIVERY_END:		
		break;
		
	case DS_DELIVERY_SCOREBOARD:
		break;
		
	case DS_MATCH_RESULT_SCOREBOARD:
		break;
		
	case DS_STORY_PRE_TALK:
		{
			int t=m_cCamera->GetCameraCombIndex();
			
			((CPlayer*)m_object[RENDER_PLAYER])->PlayingAnimation(TRUE);
			((CPlayer*)m_object[RENDER_PLAYER2])->PlayingAnimation(TRUE);
			
			if(m_pMatch->m_mode!=MODE_QUICK)
			{
				if(t==IDC_CLUB1_BACKSIDE || t==IDC_CLUB2_BACKSIDE || t==IDC_CLUB3_BACKSIDE)
				{
					m_object[RENDER_PLAYER]->SetHideProperty(false);
					m_object[RENDER_PLAYER2]->SetHideProperty(true);
				}
				else if(t==IDC_CLUB1_FRONTSIDE || t==IDC_CLUB2_FRONTSIDE || t==IDC_CLUB3_FRONTSIDE)
				{
					m_object[RENDER_PLAYER]->SetHideProperty(true);
					m_object[RENDER_PLAYER2]->SetHideProperty(false);
				}
				else
				{
					m_object[RENDER_PLAYER]->SetHideProperty(false);
					m_object[RENDER_PLAYER2]->SetHideProperty(false);
				}
			}
			else
			{
				m_object[RENDER_PLAYER]->SetHideProperty(false);
				m_object[RENDER_PLAYER2]->SetHideProperty(false);
			}
			
		}
		break;
		
		
	case DS_REPUTATION_RESULT:// for money system
		
		break;
		
	default :
		break;
	}
	
	m_cCamera->UpdateCamera();
	return ret;	
}



/************************************************************************/
/*                                                                      */
/*  return: the tenpin mode                                             */
/*                                                                      */
/************************************************************************/
int CScene::getTenpinState() 
{
	int ret = 0;
	int m = 0x0001;
	
	for (int i = 0; i < 10; ++i) 
	{		  
		if (m_tenpin[i].m_tenpinState == TENPIN_STATE_STAND) 
		{
			ret += (m << i);
			m = 0x0001;
		}		  
	}	  
	return ret;
}

/************************************************************************/
/* set the ball state before throwing                                   */
/************************************************************************/
void CScene::setInitBallState(int playerPower, int aimSpot, int withAI) {
	
	m_time = (BALL_MOVMENT_FASTEST_TIME - (playerPower) * BALL_MOVMENT_TIME_MODIFICATION); //???Milo  / DEFAULT_EXTEND
	
	if(withAI == 0) 
	{//without AI
		m_ballDestinationPosition.x =(m_ball.GetPosition().x )+ (aimSpot-(60 + (GET_PRECISION(m_player->m_precision)/2)));  //  (90-65)/2		
	}
	else
	{
		m_ballDestinationPosition.x =(m_ball.GetPosition().x )+ (aimSpot-60);  //  (90-65)/2		
	}
	//m_ballDestinationPosition.x =(aimSpot * 15 * DEFAULT_EXTEND /10 ) - (LANE_WIDTH  /  2);  //  (90-65)/2		
	
	m_ballDestinationPosition.y = LANE_LENGTH;
	
	//m_ball.SetPositionZ(DEFAULT_BALL_RADIUS);	  
	
	m_ball.SetBallVelocity(m_ballDestinationPosition,m_vBallStartPosition, m_time);
	m_ball.power = playerPower;
	m_ball.m_ballState = BALL_ONLANE;
}


/***********************************************************************************/
/* calculate the next step or state of ball & tenpins until the collision finished */    
/***********************************************************************************/
bool CScene::step(byte withAI) 
{	
	int colRet = 0;
	int i;	
	bool ret = false;
	//according to state of ball, deciding the whole state...
	if (!m_bMovementFinished) 
	{
	/*if (m_isSlowAction == true)
		Thread.sleep(200); */  //09/02 Milo for slow action
		if (m_ball.GetPosition().y <= 1900  && m_ball.GetPosition().y >=0 // 1900; 500  )
			&& m_ball.m_ballState == BALL_ONLANE)
		{
			if(withAI == 0) //without AI
			{
				rotationPowerAdjust();
				
			}
			else
			{
				m_curHint = ID_HINT_COM_PLAYING;
				m_playerAI.rotation = getRandomNumber(MAX_PLAYER_ROTATION) & 0x7fffffff;
			}
			
			//if(m_ball.GetPosition().y>= 500)//1300)
			{
				if(m_ball.GetPosition().y == 500 && m_bReplay == TRUE)//1300) //Milo 12-28 for showing people and playing ball running sound
				{
					m_object[RENDER_PLAYER]->SetHideProperty(TRUE);
				}
				setRotationPower(); 
			}
		}
		
		if (m_bMovementFinished == false) 
		{ //m_ballState != BALL_INVALID) {
			if (!m_isInTenpinArea) 
			{
				
				m_ball.GoToNext();
				m_nFrame++; //added by Milo 09-22
				if ((m_ball.GetPosition().y  + m_ball.m_ballVelocityY) > LANE_LENGTH) 
				{
					
					m_isInTenpinArea = true;
					m_iCollisionFrm = m_iSaveFrameCnt;
					m_physics->Bodies[ID_BALL].vPosition.x = (m_ball.m_vPos.x<<PHT_EXT)/10;
					m_physics->Bodies[ID_BALL].vPosition.y = (m_ball.m_vPos.y<<PHT_EXT)/10;
					m_physics->Bodies[ID_BALL].vPosition.z = (m_ball.m_vPos.z<<PHT_EXT)/10;
					m_physics->Bodies[ID_BALL].vVelocity.x =m_ball.m_ballVelocityX;//(m_ball.m_ballVelocityX<<PHT_EXT)/1000*(m_time/6);
					m_physics->Bodies[ID_BALL].vVelocity.z = 0;
					//DBGPRINTF("m_ball.power== %d ",m_ball.power);
					if(m_ball.power>5){	
						m_physics->Bodies[ID_BALL].vVelocity.y = 1470+random+(m_ball.m_ballVelocityY-28)*100/5;//(m_ball.m_ballVelocityY<<PHT_EXT)/1000*(m_time/6);
						//m_physics->Bodies[ID_BALL].vVelocity.x += (m_ball.m_ballVelocityX>0?1:-1)*50;
						m_physics->Bodies[ID_BALL].vAngularVelocity.z=100;
						m_physics->Bodies[ID_BALL].vAngularVelocity.y=-120;
						m_physics->Bodies[ID_BALL].vAngularVelocity.x=120;
					}
					else
					{
						m_physics->Bodies[ID_BALL].vVelocity.y = 1420+random+(m_ball.m_ballVelocityY-28)*100/20;
						//m_physics->Bodies[ID_BALL].vVelocity.x =0;
						m_physics->Bodies[ID_BALL].vAngularVelocity.z=0;
						m_physics->Bodies[ID_BALL].vAngularVelocity.y=0;
						m_physics->Bodies[ID_BALL].vAngularVelocity.x=0;				
					}
					
					for(int i=0;i<10;i++)
					{
						if(m_tenpin[i].m_tenpinState==TENPIN_STATE_STAND)
							m_physics->Bodies[i+1].status = TENPIN_STATE_STAND;
						else
							m_physics->Bodies[i+1].status = TENPIN_STATE_OUTSIDE;
					}
					m_nFrame = 0; //added by Milo 09-22
					
					// to display the current ball status
					DBGPRINTF("----------------------------------------------------\n");
					DBGPRINTF("the type of the ball is %d \n",m_ball.m_weight);
					DBGPRINTF("the position of the ball: x= %d, y= %d, z=%d \n", 
						m_physics->Bodies[ID_BALL].vPosition.x,m_physics->Bodies[ID_BALL].vPosition.y,m_physics->Bodies[ID_BALL].vPosition.z);
					DBGPRINTF("the velocity of the ball: x= %d, y= %d, z=%d \n",
						m_physics->Bodies[ID_BALL].vVelocity.x,m_physics->Bodies[ID_BALL].vVelocity.y,m_physics->Bodies[ID_BALL].vVelocity.z);
					DBGPRINTF("the rotation of the ball: x= %d, y= %d, z=%d \n",
						m_physics->Bodies[ID_BALL].vAngularVelocity.x,m_physics->Bodies[ID_BALL].vAngularVelocity.y,m_physics->Bodies[ID_BALL].vAngularVelocity.z);
					DBGPRINTF("----------------------------------------------------\n");
					
					if( m_bIsTutStage )
					{
						m_frameIndex = 0;
						m_iTutorialStage += TUTORIAL_SPIN_CONTROL;//TUTORIAL_FINISH;//TUTORIAL_DONE_SPIN_CONTROL;
						m_bIsTutStage = false;
					}
				}
				if(m_ball.m_ballState == BALL_OUTSIDE && m_iSoundPlay == WITHOUT_ANI)
				{
					m_iSoundPlay = ANI_IN_GUTTER;
					m_pEngine->GetSound()->playMIDI(ConvertSoundID(ID_SOUND_GUTTER),0); 
				}
			}
			else 
			{
				//Milo for play two sounds 01-05
				int count = 0;
				int movingCount = 0;
				for (i = 0 ; i< 10; ++i)
				{
					if(m_tenpin[i].m_tenpinState == TENPIN_STATE_STAND)
					{
						++count;
					}
					if(m_tenpin[i].m_tenpinState == TENPIN_STATE_MOVING)
					{
						++movingCount;
					}
				}
				if (m_physics->isCollided && m_iSoundPlay == WITHOUT_ANI)
				{					
					m_pEngine->GetSound()->stopMIDI();
					if(count < 4) // m_player->GetStrength() < 12 && strength 0-30
					{
						m_pEngine->GetSound()->playMIDI(ConvertSoundID(ID_SOUND_CRASH1),0);	//play crash 1 LESS PINS
					}
					else
					{
						m_pEngine->GetSound()->playMIDI(ConvertSoundID(ID_SOUND_CRASH2),0);	//play crash 2 MORE PINS
					} // 12-28 Milo
					m_iSoundPlay = ANI_NORMAL_COLLISION;	
					m_bWitheScreen = TRUE;
					return ret;
				}
				
				//for LAST PIN SHAKE ANIMATION begin    // Milo 12-24 && 01-05
				//if(count ==0)
				if(!m_bIsShaking)
				{
					int shakingPin = 0;
					//bool isShaking = false;
					for(i = ID_TENPIN_0; i<ID_TENPIN_10; ++i)
					{					
						m_bIsShaking = m_physics->isTenpinShaking(i);
						if(m_bIsShaking)
						{
							shakingPin = i - 1;
							break;
						}
					}
					
					if( m_collideLookType == COLLIDE_LOOK_FORWARD && m_bIsShaking && count <= 2 )//&& movingCount <= 3)//deadCount > 2)		//>=3) //&& count ==0 
					{
						m_cCamera->SetCameraFocus(Vector4s(TENPIN_INIT_POS[shakingPin][0],
							TENPIN_INIT_POS[shakingPin][1],TENPIN_INIT_POS[shakingPin][2]));//shakingPin flag[0]-1// Milo 12-24
						m_physics->StepSimulation(11);
						m_pEngine->GetSound()->playMIDI(ConvertSoundID(ID_SOUND_SINGLEFALL),0);
						//Qiu Li, change FOV
						m_changeFOV = true;
						//Qiu Li
					}
					else
					{
						m_physics->StepSimulation(11);
						m_physics->StepSimulation(11);
						m_physics->StepSimulation(11);
						m_bIsShaking = false;
						m_changeFOV = false;
					}					
				}
				else
				{
					m_physics->StepSimulation(11);	
					m_physics->StepSimulation(11);	
					m_physics->StepSimulation(11);
				}
				//pos END
				
				//Qiu Li, 2005/1/14
				if( m_changeFOV )
				{
					if( m_frameIndex <= (FOV_OTHERS - 70))	
					{
						m_frameIndex += 2;
						m_render3D.GetG3d()->setZDist(FOV_OTHERS - m_frameIndex); //Milo 12-28					
					}
					else
						m_changeFOV = false;
				}
				//Qiu Li end
				
				
				
				m_ball.m_vPos.x=(m_physics->Bodies[ID_BALL].vPosition.x*10>>PHT_EXT);
				m_ball.m_vPos.y=(m_physics->Bodies[ID_BALL].vPosition.y*10>>PHT_EXT);
				m_ball.m_vPos.z=(m_physics->Bodies[ID_BALL].vPosition.z*10>>PHT_EXT) - 2;
				
				m_ball.m_vRot.x=m_physics->Bodies[ID_BALL].vEulerAngles.x*2048/3600;
				m_ball.m_vRot.y=m_physics->Bodies[ID_BALL].vEulerAngles.y*2048/3600;
				m_ball.m_vRot.z=m_physics->Bodies[ID_BALL].vEulerAngles.z*2048/3600;
				
				for(i=ID_TENPIN_0;i<ID_TENPIN_10;i++){
					m_tenpin[i-1].m_vPos.x=(m_physics->Bodies[i].vPosition.x*10>>PHT_EXT);
					m_tenpin[i-1].m_vPos.y=(m_physics->Bodies[i].vPosition.y*10>>PHT_EXT);
					m_tenpin[i-1].m_vPos.z=(m_physics->Bodies[i].vPosition.z*10>>PHT_EXT);
					/*					
					// test the initial tenpin position shift
					if(((m_tenpin[i-1].m_vPos.x-TENPIN_INIT_POS[i-1][0])!=0))
					{
					DBGPRINTF("m_tenpin[%d].m_vPos.x= %d \n", i-1,m_tenpin[i-1].m_vPos.x);
					DBGPRINTF("TENPIN_INIT_POS[%d].x= %d \n", i-1,TENPIN_INIT_POS[i-1][0]);
					}
					if(((m_tenpin[i-1].m_vPos.y-TENPIN_INIT_POS[i-1][1])!=0))
					{	
					DBGPRINTF("m_tenpin[%d].m_vPos.y= %d \n", i-1,m_tenpin[i-1].m_vPos.y);
					DBGPRINTF("TENPIN_INIT_POS[%d].y= %d \n", i-1,TENPIN_INIT_POS[i-1][1]);
					}
					if(i==ID_TENPIN_10-1)
					{
					DBGPRINTF("-------------------------------------------------");
					}
					*/
					m_tenpin[i-1].m_vRot.x=m_physics->Bodies[i].vEulerAngles.x*2048/3600;
					m_tenpin[i-1].m_vRot.y=m_physics->Bodies[i].vEulerAngles.y*2048/3600;
					m_tenpin[i-1].m_vRot.z=m_physics->Bodies[i].vEulerAngles.z*2048/3600;
					m_tenpin[i-1].m_tenpinState = m_physics->Bodies[i].status;
				}
				
				m_nFrame++;
			}
			m_ball.IsValid();
			
			if ((m_ball.m_ballState == BALL_INVALID && isNoPinMoving())||m_nFrame>110) 
			{
				m_bMovementFinished = true;
				for(i=0;i<10;i++)
				{

⌨️ 快捷键说明

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