Ejemplo n.º 1
0
/**
* Adds collision quads for the world boundary walls. Prevents player from leaving
* the world node area.
*/
void WorldNode::SetupWorldCollWalls(const WorldFile& grid)
{
    // add boundary walls to quad list

    // world left side
    for(int row = 0; row < grid.GetHeight(); row++)
    {
        D3DXVECTOR3 p1( 0.0f, 0.0f,                 (float)row );
        D3DXVECTOR3 p2( 0.0f, kWorldScale,  (float)row );
        D3DXVECTOR3 p3( 0.0f, kWorldScale,  (float)row+kWorldScale );
        D3DXVECTOR3 p4( 0.0f, 0.0f,                 (float)row+kWorldScale );
        
        D3DXVECTOR3 n;
        D3DXVec3Cross(&n, &(p2-p1), &(p3-p1));

        m_vCollQuads.push_back( CollQuad(p1, p2, p3, p4, n) );
    }

    // world right side
    for(int row = 0; row < grid.GetHeight(); row++)
    {
        D3DXVECTOR3 p1( (float)grid.GetWidth(), 0.0f,                   (float)row );
        D3DXVECTOR3 p2( (float)grid.GetWidth(), 0.0f,                   (float)row+kWorldScale );
        D3DXVECTOR3 p3( (float)grid.GetWidth(), kWorldScale,    (float)row+kWorldScale );
        D3DXVECTOR3 p4( (float)grid.GetWidth(), kWorldScale,    (float)row );
        
        D3DXVECTOR3 n;
        D3DXVec3Cross(&n, &(p2-p1), &(p3-p1));

        m_vCollQuads.push_back( CollQuad(p1, p2, p3, p4, n) );
    }

    // world lower side
    for(int col = 0; col < grid.GetWidth(); col++)
    {
        D3DXVECTOR3 p1( (float)col,                     0.0f, 0.0f );
        D3DXVECTOR3 p2( (float)col+kWorldScale, 0.0f, 0.0f );
        D3DXVECTOR3 p3( (float)col+kWorldScale, kWorldScale, 0.0f );
        D3DXVECTOR3 p4( (float)col,                     kWorldScale, 0.0f );
        
        D3DXVECTOR3 n;
        D3DXVec3Cross(&n, &(p2-p1), &(p3-p1));

        m_vCollQuads.push_back( CollQuad(p1, p2, p3, p4, n) );
    }

    // world upper side
    for(int col = 0; col < grid.GetWidth(); col++)
    {
        D3DXVECTOR3 p1( (float)col,                     0.0f,   (float)grid.GetHeight() );
        D3DXVECTOR3 p2( (float)col,                     kWorldScale, (float)grid.GetHeight() );
        D3DXVECTOR3 p3( (float)col+kWorldScale, kWorldScale, (float)grid.GetHeight() );
        D3DXVECTOR3 p4( (float)col+kWorldScale, 0.0f,   (float)grid.GetHeight() );
        
        D3DXVECTOR3 n;
        D3DXVec3Cross(&n, &(p2-p1), &(p3-p1));

        m_vCollQuads.push_back( CollQuad(p1, p2, p3, p4, n) );
    }
}
Ejemplo n.º 2
0
Minimap::Minimap(IDirect3DDevice9* pd3dDevice, WorldFile& worldFile)
	: m_Ok(false)
	, m_WorldFile(worldFile)
	, m_pMinimapTexture(NULL)
	, m_pMinimapMask(NULL)
	, m_pMinimapFrame(NULL)
	, m_pMinimapSaveStateBlock(NULL)
{
	HRESULT hr;

	UINT const w = UINT(worldFile.GetWidth());
	UINT const h = UINT(worldFile.GetHeight());

	hr = pd3dDevice->CreateTexture(w, h, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_pMinimapTexture, NULL);
//	hr = FindAndLoadTexture(pd3dDevice, L"Map256x256.bmp", &m_pMinimapTexture);
	if (FAILED(hr))
	{
		return;
	}

	D3DLOCKED_RECT lockedRect = { 0 };
	hr = m_pMinimapTexture->LockRect(0, &lockedRect, NULL, 0);
	if (FAILED(hr))
	{
		return;
	}

	for (UINT y = 0; y < h; ++y)
	{
		DWORD* const pRow = (DWORD*) ((BYTE*)lockedRect.pBits + lockedRect.Pitch * (w-1 - y));

		for (UINT x = 0; x < w; ++x)
		{
			switch(worldFile(y, x))
			{
				case WorldFile::INVALID_CELL:
					pRow[x] = 0xFFFF0000; // Red
					break;

				case WorldFile::OCCUPIED_CELL:
					pRow[x] = D3DCOLOR_XRGB(160, 100, 100);
					break;

				default:
					pRow[x] = D3DCOLOR_XRGB(160, 180, 100);
					break;
			}
		}
	}

	m_pMinimapTexture->UnlockRect(0);

	hr = FindAndLoadTexture(pd3dDevice, L"Circle256x256.tga", &m_pMinimapMask);
	if (FAILED(hr))
	{
		return;
	}

	hr = FindAndLoadTexture(pd3dDevice, L"MinimapFrame256x256.tga", &m_pMinimapFrame);
	if (FAILED(hr))
	{
		return;
	}

	hr = pd3dDevice->CreateStateBlock(D3DSBT_ALL, &m_pMinimapSaveStateBlock);
	if (FAILED(hr))
	{
		PrintfError(L"Error creating minimap's save state block.");
		return;
	}

	m_Ok = true;
}