接口,接口,好多的接口,我们玩的游戏都是接口...
IDIRECT3DDEVICE->SetSamplerRate( DWORD Sample, D3DSAMPLESTATETYPE Type, DWORD Value)是用来设定纹理过滤模式的,极品飞车十一图形选项中可以设置这一项,开成各向异性过滤效果会好一些,就是通过这个方法实现的。
打开灯光却没有SetMaterial(),世界将是黑暗的,即使开启了环境光照SetRenderState( D3DRS_AMBIENT, 0x00ffffff )也是如此。
肚饿,午饭去...
午饭完毕,最爱的茄子炒饭,不知道找工作做时还能不能这么舒心的吃上顿午饭...
// 今天起我会把这篇心得发在msdn上,那里高手众多,说不定能遇见高人指点一二
// 我的msdn用户名曰: id_winmain
下午开始
突然想起前两天犯的错误,ZeroMemory(), 你真重要:
D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
缺了它,将会得到一片花屏。
应该为每个渲染相关的类添加HRESULT Set_Render_State(); 共给d3d device丢失后的恢复操作使用。
源代码文件越来越多了,窗口配置文件和错误打印文件夹杂在其中,好难看。是时候将他们放入单独的文件夹中了。一分钟,找了段代码,粘贴,修改,编译,运行,通过。互联网,真好用。代码如下,可惜原本规整的代码粘贴到此却如此凌乱,有需要者请行整理。
//---------------------------------------------------------------------------
// 函数: Create_Directory( const char *dir )
//
// 功能: 创建目录
//---------------------------------------------------------------------------
bool CIni::Create_Directory( const char *dir )
{
vector<std::string> path; // 存放每一层目录字符串
string str_dir(dir); // 存放要创建的目录字符串
string str_temp; // 一个临时变量,存放目录字符串
bool b_success = false; // 成功标志
// 遍历要创建的字符串
string::const_iterator s_iter;
for( s_iter = str_dir.begin() ; s_iter!=str_dir.end() ; s_iter++ )
{
if (*s_iter != '//')
{
// 如果当前字符不是'//'
str_temp += (*s_iter);
}
else
{
// 如果当前字符是'//'将当前层的字符串添加到数组中
path.push_back(str_temp);
str_temp += '//';
}
}
// 遍历存放目录的数组,创建每层目录
vector<std::string>::const_iterator v_iter;
for( v_iter = path.begin() ; v_iter!=path.end() ; v_iter++ )
{
// 如果CreateDirectory执行成功, 返回true, 否则返回false
b_success = CreateDirectory(v_iter->c_str(), NULL) ? true : false;
}
return b_success;
}
“对称编码很重要”,以前只是听过并以为自己理解了这句话,但是最近才突然发现,原来这句话是如此的重要。
LPDIRECT3DTEXTURE9 *mesh_texture;
mesh_texture = new LPDIRECT3DTEXTURE9[num_mtrl];
......
......
if( mesh_texture )
{
for(int i=0 ; i<num_mtrl ; i++)
{
SAFE_RELEASE(mesh_texture[i]);
}
delete[] mesh_texture;
}
若不是对称编码,很有可能之后忘记了下半部分,引起内存泄露。
今天先写到这吧。刚自习回来,收获是对世界矩阵和物体旋转认识深刻了一点点。
开始实验......