Profile愤怒的草莓PhotosBlogLists Tools Help

你猜是复姓 你猜

Interests
组过乐队,
制做过游戏,
会写两行程序,
当过枪手,
打过群架, 实现共-产-主-义素我滴理想
Photo 1 of 1
July 31

我回来了

还要说什么呢?
欢迎你光临
September 10

关于设计模式(1)抽象工厂

^_^,最近还真是忙啊...都没时间写东西了
 
今天来说说设计模式的一种:
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添加注释

以前都不知道怎么给一个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

Direct3D9学习手记(9)设置物体透明状态

设置物体透明状态,可以利用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 );
    
     但是这样只是相对于其他物体透明,还是要配合混合效果,否则会有点奇怪....
     可以透过物体看到其他物体,但透明物体的背面却不可见

 
No list items have been added yet.