scene.cpp
来自「3D游戏展示程序」· C++ 代码 · 共 388 行
CPP
388 行
//--------------------------------------------------
// Desc: Static Scene
// Author: artsylee/2007.6.9
//--------------------------------------------------
#include "Scene.h"
#include "Common.h"
#include "Heightmap.h"
#include "GameCommon.h"
extern CHeightmap g_Hmap;
extern D3DXVECTOR3 g_CameraPos;
CScene::CScene()
{
m_LastUpdate = 0;
}
CScene::~CScene()
{
}
void CScene::LoadScene()
{
Load(m_Tree, 0, 10, OT_TREE_1);
Load(m_Tree, 10, 10, OT_TREE_2);
Load(m_Tree, 20, 10, OT_TREE_3);
Load(m_Rock, 0, 5, OT_ROCK_1);
Load(m_Rock, 5, 5, OT_ROCK_2);
Load(m_Bush, 0, 40, OT_BUSH_1);
Load(m_Bush, 40, 40, OT_BUSH_2);
Load(m_Bush, 80, 40, OT_BUSH_3);
Load(m_Bush, 120, 40, OT_BUSH_4);
Load(m_Bush, 160, 40, OT_BUSH_5);
Load(m_House, 0, 3, OT_HOUSE);
}
void CScene::SaveScene()
{
Save(m_Tree, 0, 10, OT_TREE_1);
Save(m_Tree, 10, 10, OT_TREE_2);
Save(m_Tree, 20, 10, OT_TREE_3);
Save(m_Rock, 0, 5, OT_ROCK_1);
Save(m_Rock, 5, 5, OT_ROCK_2);
Save(m_Bush, 0, 40, OT_BUSH_1);
Save(m_Bush, 40, 40, OT_BUSH_2);
Save(m_Bush, 80, 40, OT_BUSH_3);
Save(m_Bush, 120, 40, OT_BUSH_4);
Save(m_Bush, 160, 40, OT_BUSH_5);
Save(m_House, 0, 3, OT_HOUSE);
}
void CScene::Load(CMS3DModel *pModel, int offset, int num, OBJECT_TYPE etype)
{
CIniFile scene("Config\\Scene.ini");
for(int i=0; i<num; i++)
{
char szName[32];
sprintf(szName, "Noname");
if(etype == OT_TREE_1)
{
sprintf(szName, "Tree_1_%d", i);
pModel[i+offset].Load("Model\\Scene\\Tree_1.ms3d");
}
if(etype == OT_TREE_2)
{
sprintf(szName, "Tree_2_%d", i);
pModel[i+offset].Load("Model\\Scene\\Tree_2.ms3d");
}
if(etype == OT_TREE_3)
{
sprintf(szName, "Tree_3_%d", i);
pModel[i+offset].Load("Model\\Scene\\Tree_3.ms3d");
}
if(etype == OT_ROCK_1)
{
sprintf(szName, "Rock_1_%d", i);
pModel[i+offset].Load("Model\\Scene\\Rock_1.ms3d");
}
if(etype == OT_ROCK_2)
{
sprintf(szName, "Rock_2_%d", i);
pModel[i+offset].Load("Model\\Scene\\Rock_2.ms3d");
}
if(etype == OT_BUSH_1)
{
sprintf(szName, "Bush_1_%d", i);
pModel[i+offset].Load("Model\\Scene\\Bush_1.ms3d");
}
if(etype == OT_BUSH_2)
{
sprintf(szName, "Bush_2_%d", i);
pModel[i+offset].Load("Model\\Scene\\Bush_2.ms3d");
}
if(etype == OT_BUSH_3)
{
sprintf(szName, "Bush_3_%d", i);
pModel[i+offset].Load("Model\\Scene\\Bush_3.ms3d");
}
if(etype == OT_BUSH_4)
{
sprintf(szName, "Bush_4_%d", i);
pModel[i+offset].Load("Model\\Scene\\Bush_4.ms3d");
}
if(etype == OT_BUSH_5)
{
sprintf(szName, "Bush_5_%d", i);
pModel[i+offset].Load("Model\\Scene\\Bush_5.ms3d");
}
if(etype == OT_HOUSE)
{
sprintf(szName, "House_%d", i);
pModel[i+offset].Load("Model\\Scene\\House.ms3d");
}
CoolListBox *pBox = (CoolListBox*)GetGUI(EDIT_LIST);
if(pBox)
{
pBox->AddItem(szName, NULL);
}
pModel[i+offset].SetName(szName);
float rot = RandomFloat(0.0f, (float)M_PI*2.0f);
float rotateX = scene.ReadFloat(szName, "RotateX", 0.0f);
float rotateY = scene.ReadFloat(szName, "RotateY", rot);
float rotateZ = scene.ReadFloat(szName, "RotateZ", 0.0f);
pModel[i+offset].SetRotate(D3DXVECTOR3(rotateX, rotateY, rotateZ));
float scale = RandomFloat(1.5f, 2.5f);
float scaleX = scene.ReadFloat(szName, "ScaleX", scale);
float scaleY = scene.ReadFloat(szName, "ScaleY", scale);
float scaleZ = scene.ReadFloat(szName, "ScaleZ", scale);
pModel[i+offset].SetScale(D3DXVECTOR3(1.0f*scaleX, 1.0f*scaleY, 1.0f*scaleZ));
float posX = scene.ReadFloat(szName, "PosX", 1402+RandomFloat(-100.0f, 100.0f));
float posY = scene.ReadFloat(szName, "PosY", 61);
float posZ = scene.ReadFloat(szName, "PosZ", 3670+RandomFloat(-100.0f, 100.0f));
pModel[i+offset].SetPosition(D3DXVECTOR3(posX, posY, posZ));
}
}
void CScene::Save(CMS3DModel *pModel, int offset, int num, OBJECT_TYPE etype)
{
for(int i=0; i<num; i++)
{
CIniFile scene;
scene.Open("Config\\Scene.ini");
char szName[32];
if(etype == OT_TREE_1)
{
sprintf(szName, "Tree_1_%d", i);
}
if(etype == OT_TREE_2)
{
sprintf(szName, "Tree_2_%d", i);
}
if(etype == OT_TREE_3)
{
sprintf(szName, "Tree_3_%d", i);
}
if(etype == OT_ROCK_1)
{
sprintf(szName, "Rock_1_%d", i);
}
if(etype == OT_ROCK_2)
{
sprintf(szName, "Rock_2_%d", i);
}
if(etype == OT_BUSH_1)
{
sprintf(szName, "Bush_1_%d", i);
}
if(etype == OT_BUSH_2)
{
sprintf(szName, "Bush_2_%d", i);
}
if(etype == OT_BUSH_3)
{
sprintf(szName, "Bush_3_%d", i);
}
if(etype == OT_BUSH_4)
{
sprintf(szName, "Bush_4_%d", i);
}
if(etype == OT_BUSH_5)
{
sprintf(szName, "Bush_5_%d", i);
}
if(etype == OT_HOUSE)
{
sprintf(szName, "House_%d", i);
}
D3DXVECTOR3 pos;
pModel[i+offset].GetPosition(&pos);
scene.WriteFloat(szName, "PosX", pos.x);
scene.WriteFloat(szName, "PosY", pos.y);
scene.WriteFloat(szName, "PosZ", pos.z);
pModel[i+offset].GetScale(&pos);
scene.WriteFloat(szName, "ScaleX", pos.x);
scene.WriteFloat(szName, "ScaleY", pos.y);
scene.WriteFloat(szName, "ScaleZ", pos.z);
pModel[i+offset].GetRotate(&pos);
scene.WriteFloat(szName, "RotateX", pos.x);
scene.WriteFloat(szName, "RotateY", pos.y);
scene.WriteFloat(szName, "RotateZ", pos.z);
scene.Save(NULL);
}
}
void CScene::Update()
{
D3DXVECTOR3 objectPos;
float x;
// float y;
float z;
if(g_GlobalTime-m_LastUpdate>=100)
{
// Trees
for(int i=0; i<MAX_TREE; i++)
{
objectPos = m_Tree[i].GetDerivedPos();
x = g_CameraPos.x-objectPos.x;
// y = g_CameraPos.y-objectPos.y;
z = g_CameraPos.z-objectPos.z;
if(abs(x)>500)
{
m_Tree[i].SetVisual(false);
continue;
}
if(abs(z)>500)
{
m_Tree[i].SetVisual(false);
continue;
}
if(x*x + z*z<250000.0f)
{
if(g_Hmap.IsInFrustum(objectPos.x, objectPos.z))
{
m_Tree[i].SetVisual(true);
continue;
}
else
m_Tree[i].SetVisual(false);
}
m_Tree[i].SetVisual(false);
}
// Rocks
for(int i=0; i<MAX_ROCK; i++)
{
objectPos = m_Rock[i].GetDerivedPos();
x = g_CameraPos.x-objectPos.x;
// y = g_CameraPos.y-objectPos.y;
z = g_CameraPos.z-objectPos.z;
if(abs(x)>500)
{
m_Rock[i].SetVisual(false);
continue;
}
if(abs(z)>500)
{
m_Rock[i].SetVisual(false);
continue;
}
if(x*x + z*z<250000.0f)
{
if(g_Hmap.IsInFrustum(objectPos.x, objectPos.z))
{
m_Rock[i].SetVisual(true);
continue;
}
else
m_Rock[i].SetVisual(false);
}
m_Rock[i].SetVisual(false);
}
// Bushes
for(int i=0; i<MAX_BUSH; i++)
{
objectPos = m_Bush[i].GetDerivedPos();
x = g_CameraPos.x-objectPos.x;
z = g_CameraPos.z-objectPos.z;
if(abs(x)>500)
{
m_Bush[i].SetVisual(false);
continue;
}
if(abs(z)>500)
{
m_Bush[i].SetVisual(false);
continue;
}
if(x*x + z*z<250000.0f)
{
if(g_Hmap.IsInFrustum(objectPos.x, objectPos.z))
{
m_Bush[i].SetVisual(true);
continue;
}
else
m_Bush[i].SetVisual(false);
}
m_Bush[i].SetVisual(false);
}
// House
for(int i=0; i<MAX_HOUSE; i++)
{
objectPos = m_House[i].GetDerivedPos();
x = g_CameraPos.x-objectPos.x;
z = g_CameraPos.z-objectPos.z;
if(abs(x)>500)
{
m_House[i].SetVisual(false);
continue;
}
if(abs(z)>500)
{
m_House[i].SetVisual(false);
continue;
}
if(x*x + z*z<250000.0f)
{
if(g_Hmap.IsInFrustum(objectPos.x, objectPos.z))
{
m_House[i].SetVisual(true);
continue;
}
else
m_House[i].SetVisual(false);
}
m_House[i].SetVisual(false);
}
m_LastUpdate = g_GlobalTime;
}
for(int i=0; i<MAX_TREE; i++)
{
m_Tree[i].Update();
}
for(int i=0; i<MAX_ROCK; i++)
{
m_Rock[i].Update();
}
for(int i=0; i<MAX_BUSH; i++)
{
m_Bush[i].Update();
}
for(int i=0; i<MAX_HOUSE; i++)
{
m_House[i].Update();
}
}
void CScene::Render()
{
g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
g_pD3DDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
g_pD3DDevice->LightEnable(0, TRUE);
g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
g_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
g_pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
g_pD3DDevice->SetRenderState(D3DRS_ALPHAREF, 0x7F);
for(int i=0; i<MAX_TREE; i++)
{
m_Tree[i].Render();
}
// Bushes
for(int i=0; i<MAX_BUSH; i++)
{
m_Bush[i].Render();
}
g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
g_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
// Rocks
for(int i=0; i<MAX_ROCK; i++)
{
m_Rock[i].Render();
}
g_pD3DDevice->LightEnable(0, FALSE);
g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
// House
// 设置碰撞后使用CCW
g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
for(int i=0; i<MAX_HOUSE; i++)
{
m_House[i].Render();
}
g_pD3DDevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?