⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.txt

📁 游戏编程很好的东西大家看看啊可以学到很多东西
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	STDMETHOD(LoadFromConfigFile)(/*[in]*/ULONG config_struct_ptr);
	STDMETHOD(ReleaseOffScreenPlain)(/*[in]*/ULONG plain_ptr);
	STDMETHOD(UnloadBitmapFile)(/*[in]*/ULONG bitmap_file_ptr);
	STDMETHOD(CreateOffScreenPlain)(/*[in]*/ULONG plain_ptr,/*[in]*/int nWidth,/*[in]*/int nHeight,/*[in]*/ULONG dwFlags);
	STDMETHOD(ShowUnit)(/*[in]*/ULONG plain_ptr,/*[in]*/int x_pos,/*[in]*/int y_pos);
	STDMETHOD(CopyBitmapToPlain08)(/*[in]*/ULONG bitmap_file_ptr,/*[in]*/ULONG plain_ptr);
	STDMETHOD(LoadBitmapFile)(/*[in]*/ULONG bitmap_file_ptr,/*[in]*/ULONG bitmap_file_name);
	STDMETHOD(Wait_Clock)(/*[in]*/double count);
	STDMETHOD(Start_Clock)();
	STDMETHOD(Flip)();
	STDMETHOD(DrawRandPixel_08)(/*[in]*/int nCount);
	STDMETHOD(UpdatePalette)(/*[in]*/ULONG lp_palette_entry);
	STDMETHOD(SetClipper)(/*[in]*/int nNum,/*[in]*/ULONG lp_rect);
	STDMETHOD(UnInit)();
	STDMETHOD(Init)(/*[in]*/ULONG hWnd,/*[in]*/int nWidth,/*[in]*/int nHeight,/*[in]*/int nBit);



/*---------------------------------------------------------------------------------
功能:初始化DirectDraw
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::Init(ULONG hWnd, int nWidth, int nHeight, int nBit)
{
	m_h_wnd		= (HWND)hWnd;

	m_n_bit		= nBit;
	m_n_width	= nWidth;
	m_n_height	= nHeight;

	/////////////////////////////////////////////////////////

	HRESULT					result;
	DDSCAPS2				caps;
	DDSURFACEDESC2			desc;

	result = DirectDrawCreateEx( NULL, (void**)&m_dd, IID_IDirectDraw7, NULL );

	if( result != DD_OK )
	{
		m_log.SaveMessage("创建DirectDraw对象失败!");

		return 1;
	}


	result = m_dd->SetCooperativeLevel(m_h_wnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT | DDSCL_ALLOWMODEX );

	if( result != DD_OK )
	{
		m_log.SaveMessage( "设置协调层级失败!" );

		return 2;
	}


	result = m_dd->SetDisplayMode( m_n_width, m_n_height, m_n_bit, 0, 0 );

	if( result != DD_OK )
	{
		m_log.SaveMessage( "设置显示模式失败!" );

		return 3;
	}

	//创建主页面
	INIT_STRUCT( desc );
	desc.dwFlags			= DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
	desc.dwBackBufferCount  = 1;
	desc.ddsCaps.dwCaps		= DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;

	result = m_dd->CreateSurface( &desc, &m_prim_surface, NULL );

	if( result != DD_OK )
	{
		m_log.SaveMessage( "创建主页面失败!" );

		return 4;
	}

	//副缓冲区
	memset( &caps, 0, sizeof( caps ) );

	caps.dwCaps = DDSCAPS_BACKBUFFER;

	result = m_prim_surface->GetAttachedSurface( &caps, &m_back_surface );

	if( result != DD_OK )
	{
		m_log.SaveMessage( "创建次页面失败!" );

		return 5;
	}

	//如果是8bit,就要创建调色板
	if( m_n_bit == 8 )
	{
		if(CreatePalatte() != 0)
		{
			m_log.SaveMessage( "创建调色板失败!" );

			return 6;
		}
	}

	//设置剪切区
	RECT rect[] = {0, 0, m_n_width, m_n_height };
	if( SetClipper( m_back_surface, 1, rect ) != 0 )
	{
		m_log.SaveMessage("设置剪切区失败!");

		return 7;
	}

	m_log.SaveMessage( "DirectDraw组件初始化成功!" );

	return 0;	
}

/*---------------------------------------------------------------------------------
功能:清除DirectDraw资源
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::UnInit()
{
	SAFE_RELEASE( m_clipper );
	SAFE_RELEASE( m_palette );
	SAFE_RELEASE( m_back_surface );
	SAFE_RELEASE( m_prim_surface );
	SAFE_RELEASE( m_dd );

	return 0;
}

/*---------------------------------------------------------------------------------
功能:剪切页面
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::SetClipper(int nNum, ULONG lp_rect)
{
	int nRet;

	nRet = SetClipper( m_back_surface, nNum, (LPRECT)lp_rect );

	return nRet;
}

/*---------------------------------------------------------------------------------
功能:更新调色板
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::UpdatePalette(ULONG lp_palette_entry)
{
	int nRet;

	nRet = UpdatePalette( (PALETTEENTRY*)lp_palette_entry );

	return nRet;
}

/*---------------------------------------------------------------------------------
功能:直接在副页面上画随机的点-------8位
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::DrawRandPixel_08(int nCount)
{
	int x,y;

	int				mempitch	= 0;
	unsigned char*	lp_buf		= NULL;

	HRESULT hr;

	int count = nCount;

	DDSURFACEDESC2	dd;


	INIT_STRUCT( dd );

	hr = m_back_surface->Lock(NULL,&dd,DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);

	if(hr != DD_OK)
	{
		m_log.SaveMessage("锁定表面失败!");

		return 1;
	}


	mempitch	= dd.lPitch;

	lp_buf		= (unsigned char*)dd.lpSurface;

	int	 nBitSize = dd.lPitch * m_n_height;

	//清除后缓冲区中的数据
	__asm
	{
		CLD							; clear direction of copy to forward
		MOV EAX, 0					; color goes here
		MOV ECX, nBitSize			; number of DWORDS goes here
		MOV EDI, lp_buf				; address of line to move data
		REP STOSB					; send the pentium X on its way
	}

	srand( GetTickCount() );

	for(int i = 0; i < count; i++ )
	{
		UCHAR color = rand() % MAX_PALETTE_COLORS;

		x = rand() % m_n_width;

		y = rand() % m_n_height;

		lp_buf[ x + y * mempitch ] = color;
	}

	hr = m_back_surface->Unlock(NULL);

	if(hr != DD_OK)
	{
		m_log.SaveMessage("解锁定表面失败!");

		return 2;
	}

	return 0;
}

/*---------------------------------------------------------------------------------
功能:切换副页面为主页面
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::Flip()
{
	while( m_prim_surface->Flip( NULL, DDFLIP_WAIT ) != DD_OK );

	return 0;
}

/*---------------------------------------------------------------------------------
功能:开始等待
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::Start_Clock()
{
	m_clock_count = GetTickCount();

	return 0;
}

/*---------------------------------------------------------------------------------
功能:等待
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::Wait_Clock(double count)
{
	m_clock_count += count;

	while( GetTickCount() < m_clock_count );

	return 0;
}

/*---------------------------------------------------------------------------------
功能:载入位图
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::LoadBitmapFile(ULONG bitmap_file_ptr, ULONG bitmap_file_name)
{
	int		nRet;
	char*	szFileName = (char*)bitmap_file_name;

	BITMAP_FILE_PTR	lp_bitmap = (BITMAP_FILE_PTR)bitmap_file_ptr;

	if( szFileName == NULL )
	{
		return 1;
	}

	if( lp_bitmap == NULL )
	{
		return 2;
	}

	//////////////////////////////////////////////////////////////////////////

	FILE*	fp = fopen( szFileName, "rb" );

	if( fp == NULL )
	{
		return 3;
	}

	rewind( fp );

	//初始化位图文件结构
	memset( lp_bitmap, 0, sizeof( BITMAP_FILE ) );

	//读入文件头
	fread( &lp_bitmap->m_file_head, sizeof( CHAR ), sizeof( BITMAPFILEHEADER ), fp );

	if( lp_bitmap->m_file_head.bfType != BITMAP_ID )
	{
		fclose( fp );

		return 4;
	}

	//读入位图信息
	fread( &lp_bitmap->m_info_head, sizeof( CHAR ), sizeof( BITMAPINFOHEADER ), fp );

	if( lp_bitmap->m_info_head.biBitCount == 8 )
	{
		fread( &lp_bitmap->m_palette, sizeof( CHAR ), sizeof( PALETTEENTRY ) * MAX_PALETTE_COLORS, fp );

		int	temp_color;

		for( int i = 0; i < MAX_PALETTE_COLORS; i++ )
		{
			temp_color = lp_bitmap->m_palette[i].peRed;

			lp_bitmap->m_palette[i].peRed  = lp_bitmap->m_palette[i].peBlue;

			lp_bitmap->m_palette[i].peBlue = temp_color;

			lp_bitmap->m_palette[i].peFlags= PC_NOCOLLAPSE;
		}
	}

	//读入位图像素信息
	if( lp_bitmap->m_info_head.biBitCount == 8  ||
		lp_bitmap->m_info_head.biBitCount == 16 ||
		lp_bitmap->m_info_head.biBitCount == 24 ||
		lp_bitmap->m_info_head.biBitCount == 32 )
	{
		lp_bitmap->m_mem_buf = new UCHAR[ lp_bitmap->m_info_head.biSizeImage ];

		if( lp_bitmap->m_mem_buf  == NULL )
		{
			fclose( fp );

			return 5;
		}

		fread( lp_bitmap->m_mem_buf, sizeof( char ), lp_bitmap->m_info_head.biSizeImage, fp );
	}

	fclose( fp );

	//将位图反转过来
	nRet = Flip_Bitmap( lp_bitmap );

	if( nRet != 0 )
	{
		return 6;
	}

	return 0;
}

/*---------------------------------------------------------------------------------
功能:拷贝位图信息到屏幕缓冲区
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::CopyBitmapToPlain08(ULONG bitmap_file_ptr, ULONG plain_ptr)
{
	BITMAP_FILE_PTR	lp_bitmap = (BITMAP_FILE_PTR)bitmap_file_ptr;
	OFFSCREEN_PTR	lp_plain  = (OFFSCREEN_PTR)plain_ptr;

	if( lp_plain == NULL || lp_bitmap == NULL || lp_bitmap->m_mem_buf == NULL )
	{
		return 1;
	}

	DDSURFACEDESC2		ddsd;

	INIT_STRUCT(ddsd);

	int		nWidth,nHeight;
	int		y,nPitch,src_pos,dest_pos;

	UCHAR	*src_buf, *dest_buf;

	//得到位图的宽度和高度
	nWidth	= lp_bitmap->m_info_head.biWidth * lp_bitmap->m_info_head.biBitCount / 8;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -