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

📄 cscene.cpp

📁 一个3D的保龄球的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include "CScene.h"
/*#include "CPlayer.h"
#include "CBall.h"
#include "CTenpin.h"*/

#include "..\System\IMath.h"
#include "..\system\font.h"
#include "res.h"
#include "..\3d\render3d.h"
#include "..\3d\render3d.h"
#include "CCameraControl.h"
#include "..\System\keyinput.h"
#include "..\System\sound.h"
#include "..\System\Sysdef.h"
#include "UI.h"
#include "game.h"
#include "cid.h"
//add lane setting here


CScene::CScene(CEngine *p, CMatch *pMatch,CDataManager *pDataManager) 
{
    m_pEngine = p;
	m_pMatch = pMatch;
	m_pDM = pDataManager;
	
	m_pInput = m_pEngine->GetInput();
	
	m_cCamera = new CCameraControl(this);
	m_cCamera->Load(m_pEngine);
	
	m_render3D.SetEngine(p);
	int i;
	for (i = 0; i < 10; ++i) 
	{	
		m_tenpin[i].init();		  
		m_object[i] = &m_tenpin[i]; 
	}  	
	m_object[RENDER_BALL] = &m_ball;		  
	m_object[RENDER_PLAYER] = m_player;	
	m_object[RENDER_PLAYER2] = NULL;
	m_bShowSecondPlayer=false;
	
	m_object[RENDER_SCENE] = new CObject(OBJ_NORMAL);	// for scene		
	m_object[RENDER_FLOOR] = new CObject(OBJ_NORMAL); // for FLOOR
	m_object[RENDER_SKYBOX] = new CObject(OBJ_NORMAL); // for SKYBOX
	
	m_object[RENDER_GRABBING_TENPIN] = new CObject(OBJ_NORMAL); // for GRABBING TENPINS
	m_object[RENDER_SETTING_TENPIN] = new CObject(OBJ_NORMAL); // for SETTING TENPINS
	//	m_object[RENDER_HANDS] = new CObject(OBJ_NORMAL); // for HANDS
	
	m_object[RENDER_FIRST_AUDIENCE] = new CObject(OBJ_NORMAL); // for the first  AUDENCE 
	m_object[RENDER_SECOND_AUDIENCE] = new CObject(OBJ_NORMAL); // for the second  AUDENCE 
	m_object[RENDER_THIRD_AUDIENCE] = new CObject(OBJ_NORMAL); // for the third  AUDENCE 
	//		m_object[RENDER_FORTH_AUDIENCE] = new CObject(OBJ_NORMAL); // for the third  AUDENCE 
	m_object[RENDER_FREEZE_AUDIENCE] = new CObject(OBJ_NORMAL); // for the third  AUDENCE 
	m_object[RENDER_FURNITURE] = new CObject(OBJ_NORMAL); // for the third  AUDENCE 
	
	
	//	for(i=0;i<COINS_COUNT;i++)
	m_object[RENDER_COIN]=new CObject(OBJ_NORMAL);
	m_object[RENDER_TV]=new CObject(OBJ_NORMAL);
	
	m_physics = new Physics();
	
	//in old init() function 
	//init();
	m_object[RENDER_FREEZE_AUDIENCE]->m_iCurFrame = 0;
	for(i=0; i<RENDER_COUNTS;++i)
		m_bCurHideProperty[i] = TRUE;
	m_curCamera = 0;
	//	setTenpinLandingPosition();	
	m_hand2DBuf = (unsigned short *)m_pEngine->GetMem()->GlobalMalloc(SCREEN_WIDTH*SCREEN_HEIGHT*2);
	m_pTvBuf = (unsigned short *)m_pEngine->GetMem()->GlobalMalloc(SCREEN_WIDTH*SCREEN_HEIGHT*2);
	
	m_iTutorialStage = WITHOUT_TUTORIAL;
	m_bIsDraw = false;	
}

CScene::~CScene()
{	
	if(m_object[RENDER_SCENE])
	{
		delete m_object[RENDER_SCENE];
		m_object[RENDER_SCENE] = NULL;
	}	
	
	if(m_object[RENDER_FLOOR])
	{
		delete m_object[RENDER_FLOOR];
		m_object[RENDER_FLOOR] = NULL;
	}	
	
	if(m_object[RENDER_SKYBOX])
	{
		delete m_object[RENDER_SKYBOX];
		m_object[RENDER_SKYBOX] = NULL;
	}	
	
	
	if(m_object[RENDER_GRABBING_TENPIN])
	{
		delete m_object[RENDER_GRABBING_TENPIN];
		m_object[RENDER_GRABBING_TENPIN] = NULL;
	}	
	
	/*	if(m_object[RENDER_HANDS])
	{
	delete m_object[RENDER_HANDS];
	m_object[RENDER_HANDS] = NULL;
}*/
	
	if(m_object[RENDER_FIRST_AUDIENCE])
	{
		delete m_object[RENDER_FIRST_AUDIENCE];
		m_object[RENDER_FIRST_AUDIENCE] = NULL;
	}
	
	if(m_object[RENDER_SECOND_AUDIENCE])
	{
		delete m_object[RENDER_SECOND_AUDIENCE];
		m_object[RENDER_SECOND_AUDIENCE] = NULL;
	}
	
	if(m_object[RENDER_THIRD_AUDIENCE])
	{
		delete m_object[RENDER_THIRD_AUDIENCE];
		m_object[RENDER_THIRD_AUDIENCE] = NULL;
	}
	/*
	if(m_object[RENDER_FORTH_AUDIENCE])
	{
	delete m_object[RENDER_FORTH_AUDIENCE];
	m_object[RENDER_FORTH_AUDIENCE] = NULL;
}*/
	if(m_object[RENDER_FREEZE_AUDIENCE])
	{
		delete m_object[RENDER_FREEZE_AUDIENCE];
		m_object[RENDER_FREEZE_AUDIENCE] = NULL;
	}
	
	if(m_object[RENDER_FURNITURE])
	{
		delete m_object[RENDER_FURNITURE];
		m_object[RENDER_FURNITURE] = NULL;
	}
	
	
	//	for(int i=0;i<COINS_COUNT;i++)
	if(m_object[RENDER_COIN])
	{
		delete m_object[RENDER_COIN];
		m_object[RENDER_COIN] = NULL;
	}
	
	if(m_object[RENDER_TV])
	{
		delete m_object[RENDER_TV];
		m_object[RENDER_TV] = NULL;
	}
	
	
	if(m_object[RENDER_SETTING_TENPIN])
	{
		delete m_object[RENDER_SETTING_TENPIN];
		m_object[RENDER_SETTING_TENPIN] = NULL;
	}	
	if(m_cCamera)
	{
		delete m_cCamera;
		m_cCamera = NULL;
	}	
	
	if(m_physics)
	{
		delete m_physics;
		m_physics=NULL;
	}
	
	m_pEngine->GetMem()->StackFree(NULL);
}

/*
* load all OBJECT in game scene: ball, player, tenpin and scene.
* @return boolean Load successful or not.
*/
bool CScene::Load() 
{	
	m_render3D.UpdateCamera();	
	return true;
}

/************************************************************************/
/* Update all object status, properties and movement.					*/
/* parameter: withAI ==	1 for with AI, 0 for without AI					*/
/* return 0- PAUSE in Game 1 -normal 3-Show ScoreBoard in Game			*/
/*				5-after show finish animation							*/
/************************************************************************/
int CScene::UpdateScene(byte withAI) 
{
	int ret = NORMAL_RETURN;	
	Vector4s rot = Vector4s(0,0,0);	
	int i = 0;
	++m_iTotalCounter;
	
#ifdef _NOT_RELEASE
	//for CHEAT CODE MODULE
	if((m_curStage ==DS_DELIVERY_INIT || m_curStage ==DS_PLAYER_POSITION_CONFIRM) && m_curStage !=DS_DELIVERY_REPLAY)
	{
		if(isCheatOpen() == CHEAT_OPEN)
		{		
			m_iCheatCode[0] = 7;
			cheatCode();
		}	
		//return ret;
	} //Milo 01-04 //for cheat code
#endif
	
	//response MENU KEY in Game
	if (m_pInput->KeyPressed(gk_NUM5|gk_MSOFT) 
		&& m_curStage != DS_RESULT_ANI && m_curStage != DS_STORY_MATCHEND && !m_bIsTutStage)
	{
		if(withAI == 1 && m_bDirectResult == FALSE && 
			((m_curStage != DS_BALL_RUNNING || !m_isInTenpinArea )&& m_iSoundPlay != ANI_IN_GUTTER))
		{	//for SKIP COM PLAYING IN VS MODE	
			skipCOMPlaying();
			switchToWaiting();
			m_pInput->ResetAll();
			m_cCamera->UpdateCamera();
			return ret;
		}
	}
	
	//	for(i=0;i<COINS_COUNT;i++)
	CoinRotate();
	
	//according to the current Stage in SCENE, deal with particular function
	switch (m_curStage) 
	{
	case DS_DELIVERY_INIT:	
	/*if (TENPIN_VIEW_RETURN == swithchWithCameraView() && withAI == 0)
	{
	ret = TENPIN_VIEW_RETURN;
	return ret;
	}	*/	
		if(m_frameIndex < 5)
		{
			++m_frameIndex;		
		}
		else
		{
			m_frameIndex = 0;
			m_pEngine->GetSound()->playMIDI(ConvertSoundID(ID_SOUND_AMBIENCE),1);//ID_SOUND_AUD3),0); //ConvertSoundID(ID_SOUND_AUD_DEPRESS//SDF_MID_FOOT_FAULT
			m_curStage = DS_GRABBING_TENPIN_ANIM;
		}
		break;
		
	case DS_GRABBING_TENPIN_ANIM:
		grabbingTenpins(TRUE,withAI);	
		if(withAI ==0) // without AI
		{
			playerPositionAdjust(withAI, false);
		}
		break;
		
	case DS_CLOSE_SEE_COIN:
		{			
			
			if(m_cCamera->IsCameraConstant() && m_iCoinMode != COIN_VIEW_SHOWING
				&& m_iCoinMode != COIN_VIEW_DONE)
			{
				m_iCoinMode = COIN_VIEW_SHOWING;
			}
			if(m_iCoinMode == COIN_VIEW_SHOWING && m_pInput->KeyPressed(VKEY_MENU_SELECT | VKEY_MENU_CLR)) 
			{
				m_iCoinMode = COIN_VIEW_DONE;
				m_cCamera->MoveBackFromCoin();	
			}
			else
			{
				if(m_cCamera->IsCameraConstant() && m_iCoinMode == COIN_VIEW_DONE)	
				{
					SetStage(DS_PLAYER_POSITION_CONFIRM, withAI);
				}
			}			
			if (m_pInput->KeyPressed(VKEY_MENU_CLR))
			{
				m_iCoinMode = COIN_VIEW_DONE;
				SetStage(DS_PLAYER_POSITION_CONFIRM, withAI);
			}
		}
		break;
		
	case DS_PLAYER_POSITION_CONFIRM:
		//for tutorial
		if(m_frameIndex == 0 && m_bWholeScoreBoard == FALSE)
		{
			setCurTutorialStage(TUTORIAL_POSITION, withAI);
			++m_frameIndex;
			break;
		}
		/*		else
		{
		if(m_bIsTutStage && withAI == 0)
		{
		if(m_pInput->KeyPressed(VKEY_MENU_SELECT))
		{
		m_iTutorialStage += TUTORIAL_POSITION;	
		m_bIsTutStage = false;					
		}
		break;
		}
		}
		*/
		if(m_prepareClock>0)
		{
			m_prepareClock--;
			if(m_pInput->KeyPressed(VKEY_MENU_SELECT))
				m_prepareClock=0;
			//			break;
		}
		if(m_prepareClock==0)
			m_bHasTitle=false;
		
		if(withAI == 0 && m_bWholeScoreBoard ==FALSE)
		{
			if ( TENPIN_VIEW_RETURN == swithchWithCameraView())
			{
				ret = TENPIN_VIEW_RETURN;
				return ret;
			}
		}
		//for SHOW WHOLE SCORE BOARD IN GAME (IN GAME)
		if ((m_pInput->KeyPressed(gk_NUM3) && m_pMatch->m_iMatchType != MATCH_TYPE_BONUS)
			|| (m_bWholeScoreBoard == TRUE && (m_pInput->KeyPressed(gk_NUM5) || m_pInput->KeyPressed(VKEY_MENU_BACK))))
		{	
			if(m_bWholeScoreBoard ==FALSE)
			{		
				ret = SCOREBOARD_RETURN;
				m_curHint = ID_HINT_EXIT_SCOREVIEW;
				m_bWholeScoreBoard = TRUE;
				m_iShowVSTurn = 0;
				return ret;	
			}
			else
			{
				m_curHint = m_pMatch->m_iMatchType == MATCH_TYPE_BONUS ? ID_HINT_BONUS_WAITING : ID_HINT_WAITING;
				m_bWholeScoreBoard = FALSE; 
				m_iPlayerMoving = 0 ; 
				m_bMoving = false;
				return ret;
			}
			m_pInput->ResetAll();
		}
		
		if(m_bWholeScoreBoard == TRUE)
		{
			ret = SCOREBOARD_RETURN;
			m_frameIndex = 0;
			return ret;
		}
		playerPositionAdjust(withAI);
		++m_frameIndex;
		break;
		
	case DS_PLAYER_POWER_CONFIRM:
		//for tutorial
		if(m_frameIndex == 1)
		{
			setCurTutorialStage(TUTORIAL_POWER, withAI);
			++m_frameIndex;
			break;
		}
		/*		else
		{
		if(m_bIsTutStage && withAI == 0)
		{
		if(m_pInput->KeyPressed(VKEY_MENU_SELECT))
		{
		m_iTutorialStage += TUTORIAL_POWER;	
		m_bIsTutStage = false;
		}	
		break;		
		}			
		}
		*/	
		playerPowerAdjust(withAI);			
		break;
	case DS_AIM_SPOT_CONFIRM:
		//for tutorial FOULS or FASTER DIRECTION
		if((m_player->GetIsFouls(m_ball.m_weight) != FOUL_TYPE_NONE && !(m_iTutorialStage&TUTORIAL_OVER_POWER) )
			|| (m_player->GetIsFouls(m_ball.m_weight) == FOUL_TYPE_FOUL)) 
		{	
			if(withAI == 0)
			{
				if(m_player->GetIsFouls(m_ball.m_weight) == FOUL_TYPE_FOUL)
				{
					if(m_frameIndex == 0)
					{
						if(!(m_iTutorialStage&TUTORIAL_FOUL))
						{
							m_curHint = ID_HINT_BONUS_CONTINUE;  // player fouls
							setCurTutorialStage(TUTORIAL_FOUL, withAI);
						}
						++m_frameIndex;
						break;
					}
					else
					{
						if(m_bIsTutStage && withAI == 0)
						{
							if(m_pInput->KeyPressed(gk_NUM5 | gk_MSOFT | VKEY_MENU_CLR))
							{
								m_curHint = ID_HINT_PLAYER_FOUL; 
								m_frameIndex = 1;
								m_iTutorialStage += TUTORIAL_FOUL;
								m_bIsTutStage = false;
							}
							break;			
						}
					}						
				}
				else if(m_player->GetIsFouls(m_ball.m_weight) == FOUL_TYPE_FASTER_DIRECTION)
				{
					if(m_frameIndex == 0)
					{
						m_curHint = ID_HINT_BONUS_CONTINUE;  // player choose too much power, 
						setCurTutorialStage(TUTORIAL_OVER_POWER, withAI);
						++m_frameIndex;
						break;
					}
					else
					{
						if(m_bIsTutStage && withAI == 0)
						{
							if(m_pInput->KeyPressed(gk_NUM5 | gk_MSOFT | VKEY_MENU_CLR))
							{
								m_curHint = ID_HINT_DIRECTION;
								m_frameIndex = 0;
								m_iTutorialStage += TUTORIAL_OVER_POWER;
								m_bIsTutStage = false;
							}
							break;			
						}
					}				
				}				
			}
			
			//if the Player foul, jump to throwing ani after 1-2 seconds... 
			if(m_player->GetIsFouls(m_ball.m_weight) == FOUL_TYPE_FOUL)
			{
				if(m_frameIndex > STOP_ON_FOULS_FEET)
				{			
					SetStage(DS_ROTATION_POWER_CONFIRM, withAI);
				}
				else
				{			
					++m_frameIndex;
				}
				break;
			}
		}	
		/*else
		{
		//for tutorial DIRECTION
		if(m_frameIndex == 0)
		{
		setCurTutorialStage(TUTORIAL_DIRECTION, withAI);
		++m_frameIndex;
		break;
		}			
		}*/
		
		/*if(!m_bMoving && m_player->GetIsFouls(m_ball.m_weight) == FOUL_TYPE_FASTER_DIRECTION)
		{			
		if(m_frameIndex > 15)
		{	
		SetStage(DS_ROTATION_POWER_CONFIRM, withAI);
		if( m_bIsTutStage )
		{
		m_iTutorialStage += TUTORIAL_DIRECTION;	
		m_bIsTutStage = false;
		}

⌨️ 快捷键说明

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