📄 cidade.cpp
字号:
// Device input (joystick, etc.) that is pre-defined by DInput, according
// to genre type. The genre for this app is space simulators.
{ INPUT_ROTATE_AXIS_LR, DIAXIS_3DCONTROL_LATERAL, 0, TEXT("Rotate left/right"), },
{ INPUT_ROTATE_AXIS_UD, DIAXIS_3DCONTROL_MOVE, 0, TEXT("Rotate up/down"), },
// Keyboard input mappings
{ INPUT_ROTATE_LEFT, DIKEYBOARD_LEFT, 0, TEXT("Rotate left"), },
{ INPUT_ROTATE_RIGHT, DIKEYBOARD_RIGHT, 0, TEXT("Rotate right"), },
{ INPUT_ROTATE_UP, DIKEYBOARD_UP, 0, TEXT("Rotate up"), },
{ INPUT_ROTATE_DOWN, DIKEYBOARD_DOWN, 0, TEXT("Rotate down"), },
{ INPUT_CONFIG_DISPLAY, DIKEYBOARD_F2, DIA_APPFIXED, TEXT("Configure Display"), },
{ INPUT_CONFIG_INPUT, DIKEYBOARD_F3, DIA_APPFIXED, TEXT("Configure Input"), },
{ INPUT_MOVE_FWD, DIKEYBOARD_Q, 0, TEXT("Move Forward"), },
{ INPUT_MOVE_BWD, DIKEYBOARD_A, 0, TEXT("Move Backward"), },
{ INPUT_ACTION, DIKEYBOARD_SPACE, 0, TEXT("Action"), },
};
#define NUMBER_OF_GAMEACTIONS (sizeof(g_rgGameAction)/sizeof(DIACTION))
//-----------------------------------------------------------------------------
// Global access to the app (needed for the global WndProc())
//-----------------------------------------------------------------------------
CMyD3DApplication* g_pApp = NULL;
HINSTANCE g_hInst = NULL;
//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: Entry point to the program. Initializes everything, and goes into a
// message-processing loop. Idle time is used to render the scene.
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
CMyD3DApplication d3dApp;
g_pApp = &d3dApp;
g_hInst = hInst;
InitCommonControls();
if( FAILED( d3dApp.Create( hInst ) ) )
return 0;
return d3dApp.Run();
}
//-----------------------------------------------------------------------------
// Name: CMyD3DApplication()
// Desc: Application constructor. Paired with ~CMyD3DApplication()
// Member variables should be initialized to a known state here.
// The application window has not yet been created and no Direct3D device
// has been created, so any initialization that depends on a window or
// Direct3D should be deferred to a later stage.
//-----------------------------------------------------------------------------
CMyD3DApplication::CMyD3DApplication()
{
m_dwCreationWidth = 800;
m_dwCreationHeight = 600;
m_strWindowTitle = TEXT( "Cidade" );
m_d3dEnumeration.AppUsesDepthBuffer = TRUE;
m_bStartFullscreen = true;
m_bShowCursorWhenFullscreen = false;
// Create a D3D font using d3dfont.cpp
m_pFont = new CD3DFont( _T("Arial"), 12, D3DFONT_BOLD );
m_bLoadingApp = TRUE;
m_pInputDeviceManager = NULL;
m_pSoundManager = NULL;
m_pDIConfigSurface = NULL;
ZeroMemory( &m_UserInput, sizeof(m_UserInput) );
// Read settings from registry
ReadSettings();
}
//-----------------------------------------------------------------------------
// Name: ~CMyD3DApplication()
// Desc: Application destructor. Paired with CMyD3DApplication()
//-----------------------------------------------------------------------------
CMyD3DApplication::~CMyD3DApplication()
{
}
//-----------------------------------------------------------------------------
// Name: OneTimeSceneInit()
// Desc: Paired with FinalCleanup().
// The window has been created and the IDirect3D9 interface has been
// created, but the device has not been created yet. Here you can
// perform application-related initialization and cleanup that does
// not depend on a device.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::OneTimeSceneInit()
{
int i;
float f, hs=sqrtf(powf(Nqx,2)+powf(Nqz,2));
// Mapa Init
mapa();
// Raizes Membros Init
for(i=0;i<NumRMem;i++) rzbm[i].rzmem=NULL;
// Carros Init
for(i=0;i<NumCar;i++) {
CarCnt=NumCar-i-1;
SendMessage( m_hWnd, WM_PAINT, 0, 0 );
CarroInit(&carros[i], i);
}
for(i=NumCar/2-NumCar/10;i<NumCar/2+NumCar/10;i++)
if((f=sqrtf(powf(carros[i].r->x-(float)Nqx/2,2)+powf(carros[i].r->z-(float)Nqz/2,2)))<hs) {
hs=f;
CarNView=i;
}
// Peoes Init
for(i=0;i<NumPea;i++)
PeaoInit(&peoes[i], i);
// Pos Init
do Kasa=findrua(rand()%Nqx+1, rand()%Nqz+1);
while(!Kasa);
m_vPos.x=Kasa->x*EstradaL-CenterX;
m_vPos.z=Kasa->z*EstradaL-CenterZ-EstradaL/2.0f;
rua *r;
for(r=raiz;r;r=r->nx)
r->Pe.altura=r->Pw.altura=r->Ps.altura=r->Pn.altura=0.0f;
for(r=raiz;r;r=r->nx) {
if(!r->e) {
r->Pe.altura=(float)(MinAlt+rand()%(MaxAlt-MinAlt));
r->Pe.color=0xff000000 + (rand()%256<<16) + (rand()%256<<8) + (rand()%256<<0);
if(r->n)
if(r->n->e) // Esquina a Norte
if(r->n->e->Ps.altura) r->Pe.altura=r->n->e->Ps.altura;
if(r->s)
if(r->s->e) // Esquina a Sul
if(r->s->e->Pn.altura) r->Pe.altura=r->s->e->Pn.altura;
}
if(!r->w) {
r->Pw.altura=(float)(MinAlt+rand()%(MaxAlt-MinAlt));
r->Pw.color=0xff000000 + (rand()%256<<16) + (rand()%256<<8) + (rand()%256<<0);
if(r->n)
if(r->n->w) // Esquina a Norte
if(r->n->w->Ps.altura) r->Pw.altura=r->n->w->Ps.altura;
if(r->s)
if(r->s->w) // Esquina a Sul
if(r->s->w->Pn.altura) r->Pw.altura=r->s->w->Pn.altura;
}
if(!r->n) {
r->Pn.altura=(float)(MinAlt+rand()%(MaxAlt-MinAlt));
r->Pn.color=0xff000000 + (rand()%256<<16) + (rand()%256<<8) + (rand()%256<<0);
if(r->e)
if(r->e->n) // Esquina a Este
if(r->e->n->Pw.altura) r->Pn.altura=r->e->n->Pw.altura;
if(r->w)
if(r->w->n) // Esquina a West
if(r->w->n->Pe.altura) r->Pn.altura=r->w->n->Pe.altura;
}
if(!r->s) {
r->Ps.altura=(float)(MinAlt+rand()%(MaxAlt-MinAlt));
r->Ps.color=0xff000000 + (rand()%256<<16) + (rand()%256<<8) + (rand()%256<<0);
if(r->e)
if(r->e->s) // Esquina a Este
if(r->e->s->Pw.altura) r->Ps.altura=r->e->s->Pw.altura;
if(r->w)
if(r->w->s) // Esquina a West
if(r->w->s->Pe.altura) r->Ps.altura=r->w->s->Pe.altura;
}
}
// Initialize DirectInput
InitInput( m_hWnd );
// Initialize audio
InitAudio( m_hWnd );
m_bLoadingApp = FALSE;
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: ReadSettings()
// Desc: Read the app settings from the registry
//-----------------------------------------------------------------------------
VOID CMyD3DApplication::ReadSettings()
{
HKEY hkey;
if( ERROR_SUCCESS == RegCreateKeyEx( HKEY_CURRENT_USER, DXAPP_KEY,
0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL ) )
{
// TODO: change as needed
// Read the stored window width/height. This is just an example,
// of how to use DXUtil_Read*() functions.
DXUtil_ReadIntRegKey( hkey, TEXT("Width"), &m_dwCreationWidth, m_dwCreationWidth );
DXUtil_ReadIntRegKey( hkey, TEXT("Height"), &m_dwCreationHeight, m_dwCreationHeight );
RegCloseKey( hkey );
}
}
//-----------------------------------------------------------------------------
// Name: WriteSettings()
// Desc: Write the app settings to the registry
//-----------------------------------------------------------------------------
VOID CMyD3DApplication::WriteSettings()
{
HKEY hkey;
if( ERROR_SUCCESS == RegCreateKeyEx( HKEY_CURRENT_USER, DXAPP_KEY,
0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL ) )
{
// TODO: change as needed
// Write the window width/height. This is just an example,
// of how to use DXUtil_Write*() functions.
DXUtil_WriteIntRegKey( hkey, TEXT("Width"), m_rcWindowClient.right );
DXUtil_WriteIntRegKey( hkey, TEXT("Height"), m_rcWindowClient.bottom );
RegCloseKey( hkey );
}
}
//-----------------------------------------------------------------------------
// Name: StaticInputAddDeviceCB()
// Desc: Static callback helper to call into CMyD3DApplication class
//-----------------------------------------------------------------------------
HRESULT CALLBACK CMyD3DApplication::StaticInputAddDeviceCB(
CInputDeviceManager::DeviceInfo* pDeviceInfo,
const DIDEVICEINSTANCE* pdidi,
LPVOID pParam )
{
CMyD3DApplication* pApp = (CMyD3DApplication*) pParam;
return pApp->InputAddDeviceCB( pDeviceInfo, pdidi );
}
//-----------------------------------------------------------------------------
// Name: InputAddDeviceCB()
// Desc: Called from CInputDeviceManager whenever a device is added.
// Set the dead zone, and creates a new InputDeviceState for each device
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InputAddDeviceCB( CInputDeviceManager::DeviceInfo* pDeviceInfo,
const DIDEVICEINSTANCE* pdidi )
{
UNREFERENCED_PARAMETER( pdidi );
// Setup the deadzone
DIPROPDWORD dipdw;
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
dipdw.dwData = 500;
pDeviceInfo->pdidDevice->SetProperty( DIPROP_DEADZONE, &dipdw.diph );
// Create a new InputDeviceState for each device so the
// app can record its state
InputDeviceState* pNewInputDeviceState = new InputDeviceState;
ZeroMemory( pNewInputDeviceState, sizeof(InputDeviceState) );
pDeviceInfo->pParam = (LPVOID) pNewInputDeviceState;
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: InitInput()
// Desc: Initialize DirectInput objects
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitInput( HWND hWnd )
{
HRESULT hr;
// Setup action format for the actual gameplay
ZeroMemory( &m_diafGame, sizeof(DIACTIONFORMAT) );
m_diafGame.dwSize = sizeof(DIACTIONFORMAT);
m_diafGame.dwActionSize = sizeof(DIACTION);
m_diafGame.dwDataSize = NUMBER_OF_GAMEACTIONS * sizeof(DWORD);
m_diafGame.guidActionMap = g_guidApp;
// TODO: change the genre as needed
m_diafGame.dwGenre = DIVIRTUAL_CAD_3DCONTROL;
m_diafGame.dwNumActions = NUMBER_OF_GAMEACTIONS;
m_diafGame.rgoAction = g_rgGameAction;
m_diafGame.lAxisMin = -100;
m_diafGame.lAxisMax = 100;
m_diafGame.dwBufferSize = 16;
_tcscpy( m_diafGame.tszActionMap, _T("CIDADE") );
// Create a new input device manager
m_pInputDeviceManager = new CInputDeviceManager();
if( FAILED( hr = m_pInputDeviceManager->Create( hWnd, NULL, m_diafGame,
StaticInputAddDeviceCB, this ) ) )
return DXTRACE_ERR( "m_pInputDeviceManager->Create", hr );
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: InitAudio()
// Desc: Initialize DirectX audio objects
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitAudio( HWND hWnd )
{
HRESULT hr;
// Create a static IDirectSound in the CSound class.
// Set coop level to DSSCL_PRIORITY, and set primary buffer
// format to stereo, 22kHz and 16-bit output.
m_pSoundManager = new CSoundManager();
if( FAILED( hr = m_pSoundManager->Initialize( hWnd, DSSCL_PRIORITY ) ) )
return DXTRACE_ERR( TEXT("m_pSoundManager->Initialize"), hr );
if( FAILED( hr = m_pSoundManager->SetPrimaryBufferFormat( 2, 22050, 16 ) ) )
return DXTRACE_ERR( TEXT("m_pSoundManager->SetPrimaryBufferFormat"), hr );
// TODO: load the sounds from resources (or files)
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: ConfirmDevice()
// Desc: Called during device initialization, this code checks the display device
// for some minimum set of capabilities
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::ConfirmDevice( D3DCAPS9* pCaps, DWORD dwBehavior,
D3DFORMAT Format )
{
UNREFERENCED_PARAMETER( Format );
UNREFERENCED_PARAMETER( dwBehavior );
UNREFERENCED_PARAMETER( pCaps );
BOOL bCapsAcceptable;
// TODO: Perform checks to see if these display caps are acceptable.
bCapsAcceptable = TRUE;
if( bCapsAcceptable )
return S_OK;
else
return E_FAIL;
}
//-----------------------------------------------------------------------------
// Name: InitDeviceObjects()
// Desc: Paired with DeleteDeviceObjects()
// The device has been created. Resources that are not lost on
// Reset() can be created here -- resources in D3DPOOL_MANAGED,
// D3DPOOL_SCRATCH, or D3DPOOL_SYSTEMMEM. Image surfaces created via
// CreateOffScreenPlainSurface are never lost and can be created here. Vertex
// shaders and pixel shaders can also be created here as they are not
// lost on Reset().
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitDeviceObjects()
{
HRESULT hr;
// Init the font
hr = m_pFont->InitDeviceObjects( m_pd3dDevice );
if( FAILED( hr ) )
return DXTRACE_ERR( "m_pFont->InitDeviceObjects", hr );
rua *r;
PAREDEVERTEX* vp;
DWORD RoadColor=0xff000000;
DWORD TelhColor=0xffff4000;
DWORD PasColor1=0xffbbbbaa;
DWORD PasColor2=0xff607060;
DWORD WalkColor=0xfff0f0ff;
float rN, rS, rW, rE, M=0.5f;
bool rd, re;
int i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -