📄 cscene.cpp
字号:
{
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 + -