September 10
^_^,最近还真是忙啊...都没时间写东西了
今天来说说设计模式的一种:
Abstract Factory(抽象工厂)
抽象工厂
就是专门抽大象的工厂:
其实可以理解为大象很大,抽他不太容易,那我们就先抽空气,然后叫不同的大象站在刚才的地方,
就代表我们已经抽过大象了,是不是很深奥?
简单解释一下,就是先假设这里有一头大象,先把怎样抽他都设计好,就可以按照设定好的方法抽不同的大象了;
反正抽象工厂就是抽发相同,可以抽不同的大象
用程序表达就是:
class 假设的大象
{
public:
假设的大象();
virtual 脸部 抽丫脸() const
{ }
virtual 屁股 抽丫屁股() const
{ }
};
class 抽大象
{
public:
抽大象();
开始抽(假设的大象& elephant)
{
脸部=elephant.抽丫脸();
屁股=elephant.抽丫屁股();
大象.狠狠的抽(脸部, 屁股);
}
};
class 大象一号:public 假设的大象
{
public:
大象一号();
virtual 脸部 void 抽丫脸() const
{... }
virtual 屁股 抽丫屁股() const
{ ... }
};
class 大象二号:public 假设的大象
...
class 大象三号:public 假设的大象
....
main()
{
//抽大象的工厂,想抽谁抽谁
抽大象 第一次抽大象;
大象一号 挨抽一号;
第一次抽大象.开始抽(挨抽一号);
}
是不是很好理解啊...下次来说说Builder
July 19
很简单的一个函数:
void HextoStr(int in, string &out)
{
char list[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
out+=list[(in >> 4)& 0x0f];
out+=list[in & 0x0f];
}
测试
string strTest;
HextoStr(193, strTest);
strTest的值为c1
可惜有限制,只能转换FF以下的16进制
July 04
以前都不知道怎么给一个table添加注释,这里记下来
comment on table table_name is 'table comment';
comment on column table_name.column is 'column comment';
就是这样了,很简单吧。
公司HP的机器上stl的流不能用只好改用<strstream.h>
标准方法如下:
//类型转换
template<class Type>
const Type& t;
string FileName("007");
string strLogInfo;
ostrstream m_otemp((char*)FileName.c_str(),128);
m_otemp << t<< ends;
strLogInfo=m_otemp.str();
//读取连续字符
template<class Type>
const Type& t;
char headRecordBuffer[MAX_CDR_RECORD_LEN];
istrstream strFileType(headRecordBuffer+n, FILE_TYPE_FIELD_LEN);
strFileType >> dec >> t;
OK
June 20
设置物体透明状态,可以利用d3d9的混合来得到效果,也可以单纯用材质的a值来控制混合效果:
首先设置渲染状态完全不使用背面拣选
m_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
在使Z缓存为FALSE
m_pDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
开启混合渲染状态
m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
设置设置源混合要素和目的混合要素
//通过变换第2参数可以得到多种效果
m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
/*********************************************************
以下转自3D游戏程序设计入门(DirectX 9.0)翁云兵
D3DBLEND_ZERO——blendFactor=(0, 0, 0, 0)
D3DBLEND_ONE——blendFactor=(1, 1, 1, 1)
D3DBLEND_SRCCOLOR——blendFactor=(rs, gs, bs, as)
D3DBLEND_INVSRCCOLOR——blendFactor=(1-rs, 1-gs, 1-bs, 1-as)
D3DBLEND_SRCALPHA——blendFactor=(as, as, as, as)
D3DBLEND_INVSRCALPHA——blendFactor=(1-as, 1-as, 1-as, 1-as)
D3DBLEND_DESTALPHA——blendFactor=(ad, ad, ad, ad)
D3DBLEND_INVDESTALPHA——blendFactor=(1-ad, 1-ad, 1-ad, 1-ad)
D3DBLEND_DESTCOLOR——blendFactor=(rd, gd, bd, ad)
D3DBLEND_INVDESTCOLOR——blendFactor=(1-rd, 1-gd, 1-bd, 1-ad)
D3DBLEND_SRCALPHASAT——blendFactor=(f, f, f, 1) , f=min(as, 1 – ad)
D3DBLEND_BOTHINVSRCALPHA——这种混合模式设置源混合要素为(1-as, 1-as, 1-as, 1-as,)以及目的混合要素为(as,as,as,as)。这种混合模式仅对D3DRS_SRCBLEND有效。
源和目的混合要素的默认值分别是D3DBLEND_SRCALPHA和D3DBLEND_INVSRCALPHA
*******************************************************/
通过材质的a值:
D3DMATERIAL9 mtrl;
::ZeroMemory(&mtrl, sizeof(D3DMATERIAL9));
mtrl.Diffuse.r=mtrl.Ambient.r =1.0f;
mtrl.Diffuse.g=mtrl.Ambient.g =1.0f;
mtrl.Diffuse.b=mtrl.Ambient.b =1.0f;
//通道为0.0f就啥也看不着了
mtrl.Diffuse.a=mtrl.Ambient.a =0.2f;
m_pDevice->SetMaterial(&mtrl);
m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
//定义从何处得到漫反射材质色
//D3DMCS_MATERIAL - 用材质颜色作为材质颜色的来源。
//D3DMCS_COLOR1 - 用顶点的漫反射色作为材质颜色的来源。
//D3DMCS_COLOR2 - 用顶点的镜面反射色作为材质颜色的来源
m_pDevice->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL );
//通过顶点颜色来得到透明,D3DTA_TEXTURE 是alpha值从在alpha通道中获得
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
但是这样只是相对于其他物体透明,还是要配合混合效果,否则会有点奇怪....
可以透过物体看到其他物体,但透明物体的背面却不可见