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

📄 freedirectdraw.cpp

📁 游戏编程很好的东西大家看看啊可以学到很多东西
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	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;

	DWORD	read_len;
	HANDLE	file_handle;

	BITMAP_FILE_PTR	lp_bitmap = (BITMAP_FILE_PTR)bitmap_file_ptr;

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

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

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

	file_handle = CreateFile( szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	if( file_handle == INVALID_HANDLE_VALUE )
	{
		return 3;
	}

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

	//读入文件头
	nRet = ReadFromFile( file_handle, (LPVOID)&lp_bitmap->m_file_head, sizeof( BITMAPFILEHEADER ), &read_len );
	
	if( nRet != 0 )
	{
		return nRet;
	}

	if( lp_bitmap->m_file_head.bfType != BITMAP_ID )
	{
		CloseHandle( file_handle );

		return 6;
	}

	//读入位图信息
	nRet = ReadFromFile( file_handle, (LPVOID)&lp_bitmap->m_info_head, sizeof( BITMAPINFOHEADER ), &read_len );
	
	if( nRet != 0 )
	{
		return nRet;
	}

	if( lp_bitmap->m_info_head.biBitCount == 8 )
	{
		nRet = ReadFromFile( file_handle, (LPVOID)lp_bitmap->m_palette, sizeof( PALETTEENTRY ) * MAX_PALETTE_COLORS, &read_len );
		
		if( nRet != 0 )
		{
			return nRet;
		}

		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 )
		{
			CloseHandle( file_handle );

			return 7;
		}

		nRet = ReadFromFile( file_handle, (LPVOID)lp_bitmap->m_mem_buf, lp_bitmap->m_info_head.biSizeImage, &read_len );
		
		if( nRet != 0 )
		{
			return nRet;
		}
	}

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

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

	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;
	nHeight	= lp_bitmap->m_info_head.biHeight;

	src_buf	= lp_bitmap->m_mem_buf;

	if( FAILED( lp_plain->m_off_screen->Lock( NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL ) ) )
	{
		return 2;
	}

	nPitch	= ddsd.lPitch;
	dest_buf= (UCHAR*)ddsd.lpSurface;

	if( nPitch == nWidth )
	{
		memcpy( dest_buf, src_buf, lp_bitmap->m_info_head.biSizeImage );
	}
	else
	{
		for( y = 0; y < nHeight; y++ )
		{
			src_pos		= y * nWidth;
			dest_pos	= y * nPitch;

			memcpy( dest_buf + dest_pos, src_buf + src_pos, nPitch );
		}
	}

	lp_plain->m_off_screen->Unlock( NULL );

	return 0;
}

/*---------------------------------------------------------------------------------
功能:显示一个图像
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::ShowUnit(ULONG plain_ptr, int x_pos, int y_pos )
{
	OFFSCREEN_PTR	lp_screen = (OFFSCREEN_PTR)plain_ptr;

	RECT			rect,dest_rect;

	rect.left	= 0 ;
	rect.top	= 0 ;
	rect.right	= lp_screen->m_n_width;
	rect.bottom	= lp_screen->m_n_height;

	dest_rect	= rect;

	dest_rect.left   += x_pos;
	dest_rect.top    += y_pos;
	dest_rect.right  += x_pos;
	dest_rect.bottom += y_pos;

	if( FAILED( m_back_surface->Blt( &dest_rect, lp_screen->m_off_screen, &rect, DDBLT_WAIT, NULL ) ) )
	{
		return 1;
	}

	return 0;
}

/*---------------------------------------------------------------------------------
功能:创建一个离屏区
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::CreateOffScreenPlain(ULONG plain_ptr, int nWidth, int nHeight, ULONG dwFlags)
{
	OFFSCREEN_PTR	lp_screen = (OFFSCREEN_PTR)plain_ptr;

	DDSURFACEDESC2		ddsd;

	INIT_STRUCT(ddsd);

	ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;

	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | dwFlags;

	ddsd.dwWidth  = nWidth;
	ddsd.dwHeight = nHeight;
	
	if( FAILED( m_dd->CreateSurface(&ddsd, &lp_screen->m_off_screen, NULL ) ) )
	{
		m_log.SaveMessage("创建离屏区失败!");
		
		return 1;
	}

	lp_screen->m_n_width  = nWidth;
	lp_screen->m_n_height = nHeight;

	return 0;
}

/*---------------------------------------------------------------------------------
功能:卸载位图
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::UnloadBitmapFile(ULONG bitmap_file_ptr)
{
	BITMAP_FILE_PTR lp_bitmap = (BITMAP_FILE_PTR)bitmap_file_ptr;

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

	if( lp_bitmap->m_mem_buf == NULL )
	{
		return 0;
	}

	delete [] lp_bitmap->m_mem_buf;

	lp_bitmap->m_mem_buf = NULL;

	return 0;
}

/*---------------------------------------------------------------------------------
功能:清除离屏区
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::ReleaseOffScreenPlain(ULONG plain_ptr)
{
	OFFSCREEN_PTR lp_plain = (OFFSCREEN_PTR)plain_ptr;

	SAFE_RELEASE( lp_plain->m_off_screen );

	return 0;
}

/*---------------------------------------------------------------------------------
功能:从配置文件载入位图的配置信息
说明:
返回:成功,0;失败,其它正数值
---------------------------------------------------------------------------------*/
STDMETHODIMP CFreeDirectDraw::LoadFromConfigFile(ULONG config_struct_ptr)
{
	CONFIG_PTR	lp_config = (CONFIG_PTR)config_struct_ptr;

	m_ini.SetIniFileName( lp_config->m_file_name );

	m_ini.ReadIniInt( &lp_config->m_n_bit,     "DIRECTDRAW", "BITCOUNT" );
	m_ini.ReadIniInt( &lp_config->m_n_width,   "DIRECTDRAW", "WIDTH"  );
	m_ini.ReadIniInt( &lp_config->m_n_height,  "DIRECTDRAW", "HEIGHT" );
	m_ini.ReadIniString( lp_config->m_file_name, 20, "DIRECTDRAW", "FILENAME" );

	m_ini.GetFullFileName( lp_config->m_file_name );

	m_log.SaveMessage( lp_config->m_file_name );

	return 0;
}

⌨️ 快捷键说明

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