google rss rss

doneykoo [Ouditian]

DKzone- Ouditian Technology

游戏开发学习过程(连载中...)(转自 威尔弗的空间)

转自 : http://hi.baidu.com/welflau/blog/item/1b17032320bb05499358075e.html

http://hi.baidu.com/welflau/希望能保留原创作者链接,谢谢!

2008-12-02

第1讲【创建框架】

 


1 新建MFC exe / dialog based
2 删除dialog类的显示代码
3 添加WelflGameFrm类
4 在app类的InitInstance 函数中 添加http://hi.baidu.com/welflau/希望能保留原创作者链接,谢谢!
m_pMainWnd = new CWelflGameFrm;
m_pMainWnd->ShowWindow( m_nCmdShow );
m_pMainWnd->UpdateWindow();
5 将CWelflGameFrm()构造函数改为public 成员
6 在构造函数CWelflGameFrm中添加:
RECT rect;
Create(NULL,"ch07-1: ミDirectGraphics");
CClientDC dc(this);
int width = dc.GetDeviceCaps(HORZRES);
int height = dc.GetDeviceCaps(VERTRES);
GetWindowRect( &rect );
width = ( width - ( rect.right - rect.left ))/2 ;
height = (height - (rect.bottom - rect.top ))/2 ;
MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);

7 为CWelfGameFrm类添加WindowProc函数,并加入代码:http://hi.baidu.com/welflau/希望能保留原创作者链接,谢谢!
switch( message )
{
case WM_CREATE :
   if( !d3dCreate( m_hWnd , 640 , 480 , true ))
    PostMessage( WM_CLOSE );
   return 0 ;
case WM_DESTROY :
   d3dRelease();
   return 0 ;
}

8 为工程添加两个文件
myd3d.cpp, myd3d.h

9 编译出现
fatal error C1010: unexpected end of file while looking for precompiled header directive
解决方案:在Project Settings里C++页面的Precomplie Header里把出错源文件设置为不使用预编译头就可以了,详见视频

10 将BOOL CWelfGameApp::InitInstance()中的
return FALSE;改为 return TRUE;

11 为CWelfGameFrm类添加OnPaint响应
添加如下代码:
d3dClear(0);
//
d3d_Device->Present( NULL , NULL , NULL , NULL );




第2讲【绘制文字和图像】

目录
【一】、从DirectGraphic中获取DC(GDI)
【二】、2D图像绘制


【一】、从DirectGraphic中获取DC(GDI)
1 添加类d3dHdc 在 myd3d.h文件中
class d3dHdc
{
private :
HDC m_hdc ;
LPDIRECT3DSURFACE9 m_Surface ;

public :
void Release();
inline operator HDC(){ return m_hdc ;};
public :
d3dHdc();
~d3dHdc();
};

2在myd3d.cpp中添加函数定义
d3dHdc::d3dHdc()
{
m_hdc = 0 ;
m_Surface = 0 ;
// 获得设备
if( !d3d_Device )
   return ;
if( d3d_Device->GetBackBuffer( 0 , 0 , D3DBACKBUFFER_TYPE_MONO , &m_Surface ) != D3D_OK )
   return ;

m_Surface->GetDC( &m_hdc );
}

d3dHdc::~d3dHdc()
{
Release();
}

void d3dHdc::Release()
{
if( m_Surface )
{
   if( m_hdc )
    m_Surface->ReleaseDC( m_hdc );
   m_Surface->Release();
  
   m_hdc = NULL ;
   m_Surface = NULL ;
}

}

3 现在就可以使用他了
在绘制函数中添加:
d3dHdc hdc ;
   SetTextColor( hdc , RGB( 255 , 255 , 255 ));
   SetBkMode( hdc , 1 );
   TextOut( hdc , 0 , 0 , str , strlen( str ));
hdc.Release();


【二】、2D图像绘制
1 新建d3dTexture类
class d3dTexture
{
private :
int      m_Width ;
int      m_Height ;
LPDIRECT3DTEXTURE9 m_Texture ;
public :
void BltFast( int x , int y );
void BltFast( int l , int t , int r , int b );
public :
BOOL Create( LPCTSTR file );
void Release();
inline operator LPDIRECT3DTEXTURE9(){ return m_Texture ;};
public :
d3dTexture();
~d3dTexture();
};

2 并添加定义:

/*////////////////////////////////////////////////
3D 纹理类d3dTexture 函数定义 2008-12-02

/*////////////////////////////////////////////////

d3dTexture::d3dTexture()
{
m_Texture = NULL ;
}

d3dTexture::~d3dTexture()
{
Release();
}

void d3dTexture::Release()
{
if( m_Texture )
   m_Texture->Release();
m_Texture = NULL ;
}

BOOL d3dTexture::Create( LPCTSTR file )
{
D3DXIMAGE_INFO in ;
memset( &in , 0 , sizeof( in ));
// ﹍て
Release();
//更
D3DXCreateTextureFromFileEx( d3d_Device ,
   file , D3DX_DEFAULT , D3DX_DEFAULT ,
   0 , 0 , D3DFMT_UNKNOWN , D3DPOOL_MANAGED ,
   D3DX_DEFAULT ,
   D3DX_DEFAULT , 0 , &in , NULL , &m_Texture );
if( m_Texture == NULL )
   return false ;
// 眔戈
m_Width = in.Width ;
m_Height = in.Height ;

return true ;
}

void d3dTexture::BltFast(int x, int y)
{
BltFast( x , y , x + m_Width , y + m_Height );
}

void d3dTexture::BltFast(int l , int t , int r , int b )
{
D3DTLVERTEX v[4] ;
//郴翴 挡篶
memset( v , 0 , sizeof( v ));
v[0].x = v[3].x = (float)(l) ;
v[1].x = v[2].x = (float)(r);
v[0].y = v[1].y = (float)(t);
v[2].y = v[3].y = (float)(b);

v[0].rhw = v[1].rhw = v[2].rhw = v[3].rhw =
   v[0].z = v[1].z = v[2].z = v[3].z = 0.5f ;

v[0].diffuse = v[1].diffuse = v[2].diffuse = v[3].diffuse = -1 ;

v[1].tu = v[2].tu = 1.0f ;
v[2].tv = v[3].tv = 1.0f ;
//砞酶瓜家Α
d3d_Device->SetTexture( 0 , m_Texture );
d3d_Device->SetFVF( D3DFVF_TLVERTEX );
d3d_Device->DrawPrimitiveUP( D3DPT_TRIANGLEFAN , 2 , (LPVOID)v , sizeof( D3DTLVERTEX ));


}

3 编译时会出错
解决方法:
在myd3d.h文件中添加
#include "d3dx9tex.h"

#pragma comment(lib,"d3dx9.lib")
以及
const DWORD D3DFVF_TLVERTEX = (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1 );
typedef struct _D3DTLVERTEX
{
float x , y , z , rhw ;
D3DCOLOR diffuse , specular;
float tu, tv;
}D3DTLVERTEX ;

4 在WelfGameFrm中添加两个成员
d3dTexture m_Bk ;
d3dTexture m_Role ;

5 在WelfGameFrm的Create响应添加:
   m_Bk.Create( "背景.tga" );
   m_Role.Create( "娃娃.tga" );

6 调用BltFast进行绘制
//开始绘制
d3d_Device->BeginScene();
d3d_Device->SetRenderState( D3DRS_CULLMODE , D3DCULL_NONE );
d3d_Device->SetRenderState( D3DRS_ZENABLE , D3DZB_FALSE );
m_Bk.BltFast( 0 , 0 );
m_Role.BltFast( 0 , 0 );
d3d_Device->EndScene();

7 将BltFast函数改进




第3讲 WelfGame【图像透明及颜色】

http://hi.baidu.com/welflau/希望能保留原创作者链接,

【一】、实现透明图像

1 RenderScene()中添加设置代码

在背景绘制前添加:

              d3d_Device->SetRenderState( D3DRS_CULLMODE , D3DCULL_NONE );

              d3d_Device->SetRenderState( D3DRS_ZENABLE , D3DZB_FALSE );

              d3d_Device->SetRenderState( D3DRS_SHADEMODE , D3DSHADE_FLAT );

              d3d_Device->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );

在前景绘制的前面添加

       d3d_Device->SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA );

       d3d_Device->SetRenderState( D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA );

       d3d_Device->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );//开启混色

 

 

 

效果

 

2 d3dTexture添加BltFast函数

void d3dTexture::BltFast(int l , int t , int r , int b , DWORD diffuse )

{

       D3DTLVERTEX v[4] ;

       //郴翴 挡篶

       memset( v , 0 , sizeof( v ));

       v[0].x = v[3].x = (float)(l) ;

       v[1].x = v[2].x = (float)(r);

       v[0].y = v[1].y = (float)(t);

       v[2].y = v[3].y = (float)(b);

       v[0].rhw = v[1].rhw = v[2].rhw = v[3].rhw =

       v[0].z = v[1].z = v[2].z = v[3].z = 0.5f ;

       //肅︹

       v[0].diffuse = v[1].diffuse = v[2].diffuse = v[3].diffuse = diffuse ;

       v[1].tu = v[2].tu = 1.0f ;

       v[2].tv = v[3].tv = 1.0f ;

       //砞酶瓜家Α

       d3d_Device->SetTexture( 0 , m_Texture );

       d3d_Device->SetFVF( D3DFVF_TLVERTEX );

       d3d_Device->DrawPrimitiveUP( D3DPT_TRIANGLEFAN , 2 , (LPVOID)v , sizeof( D3DTLVERTEX ));

}

添加以下几句:

       d3d_Device->SetTextureStageState( 0 , D3DTSS_ALPHAARG1 , D3DTA_TEXTURE );

       d3d_Device->SetTextureStageState( 0 , D3DTSS_ALPHAARG2 , D3DTA_DIFFUSE );

       d3d_Device->SetTextureStageState( 0 , D3DTSS_COLORARG1 , D3DTA_TEXTURE );

       d3d_Device->SetTextureStageState( 0 , D3DTSS_COLORARG2 , D3DTA_DIFFUSE );

       d3d_Device->SetTextureStageState( 0 , D3DTSS_COLOROP , D3DTOP_SELECTARG1 );

       d3d_Device->SetTextureStageState( 0 , D3DTSS_ALPHAOP , D3DTOP_MODULATE );

       //以下为前景

       m_Role.BltFast( 100, 100, 250 ,250 ,D3DCOLOR_ARGB( 128 , 255 , 255 , 255 ));//最后一个参数为颜色,包括透明度

效果图

 

posted on 2008-12-31 18:04 DoNeY 阅读(409) 评论(0)  编辑  收藏 所属分类: GameDevC++


只有注册用户登录后才能发表评论。


网站导航:
 
  doneykoo blogjava