|
|
小弟初学DX,现在用DX写2D游戏的地图部分,我的地图是用一个一个的TILE拼成的,每个TILE对应了一张texture的BMP,每帧根据地图的位置来从二维数组中加载相应的部分
struct MAPOBJECT
{
int m_nID; //标识ID
CUSTOMMAPCELL centerMapCell; //地图对象所包含的中心位置地图块
POINT m_LeftTopPos; //左上角顶点坐标 LPDIRECT3DVERTEXBUFFER9 m_pVB; //纹理图片的顶点缓冲
LPDIRECT3DTEXTURE9 m_pTexure; //纹理对象指针
};
list<MAPOBJECT*> m_ListBackgroundTilesInScreen; //当前位于屏幕显示区域内的TILE
LPDIRECT3DDEVICE9 m_pd3dDevice; //这个为在外部传进来的当前屏幕的DEVICE
void Update()
{
//根据人物在大地图中的当前位置确定nStartRowIndex,nStartColIndex,nEndRowIndex,nEndColIndex
。。。。
ClearBackgroundTilesList(); // 清空m_ListBackgroundTilesInScreen
MAPOBJECT* pBackgoundTile = NULL;
for (i = nStartRowIndex;i < nEndRowIndex; i++)
for (j = nStartColIndex; j < nEndColIndex; j++)
{
pBackgoundTile = new MAPOBJECT;
//根据i,j和偏移来设置pBackgoundTile-> m_LeftTopPos;
D3DXCreateTextureFromFile(m_pd3dDevice,"Image\\001.bmp",&(pBackgoundTile->m_pTexure));
CUSTOMVERTEX1 vertices[6] = {。。。。} //纹理图片矩形的4个顶点
m_pd3dDevice->CreateVertexBuffer( 6*sizeof(CUSTOMVERTEX1),
0, D3DFVF_CUSTOMVERTEX1,
D3DPOOL_DEFAULT,
&(pBackgoundTile->m_pVB), NULL );
VOID* pVertices;
pBackgoundTile->m_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 );
memcpy( pVertices, vertices, 6*sizeof(CUSTOMVERTEX1) );
pBackgoundTile->m_pVB->Unlock();
m_ListBackgroundTilesInScreen.push_back(pBackgoundTile);
}
}
void Render()
{
m_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX1)
for (list<MAPOBJECT*>::iterator it = m_ListBackgroundTilesInScreen.begin(); it != m_ListBackgroundTilesInScreen.end(); it++)
{
m_pd3dDevice->SetTexture(0, (*it)->m_pTexure);
m_pd3dDevice->SetStreamSource(0, (*it)->m_pVB, 0, sizeof(CUSTOMVERTEX1));
m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
}
}
之后在外部的Update()中先调用地图部分的Update(),然后在外部的Render()中调用地图部分的Render(),这样效果是实现了,不过当屏幕贴满TILE的时候,FPS变得很低,移动地图的时候显得很卡,如果只贴一半的TILE,FPS就会提高许多,请问我问题是出在哪里?
|
|