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

📄 myddraw.cpp

📁 坦克大战游戏.很值得学习的东东.希望对大家有帮助
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MyDDraw.cpp: implementation of the MyDDraw class.
//DirectxDraw
//创建于 2006. 修改于 2008.10
//吴文捷 
//////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include "常数定义.h"
#include "Control.h"
#include "Bullete.h"
#include "Player.h"
#include "Bomb.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBomb  bomb;
extern  bool      NewGame;
extern  bool      ShowMainMenu;
extern  short     MainMenuSelect;
extern  bool      ShowStage;
extern  bool      SetPause;
extern  bool      DrawGame;
extern  bool      StartGame1,StartGame2;
extern  bool      playsound[10];

MyDDraw::MyDDraw()
{
   setdoop=false;
   fps=0;

   bitmap=new HBITMAP[BMPSOURCE];
   pOPlatemp=new LPDIRECTDRAWSURFACE7[BMPSOURCE];

}

MyDDraw::~MyDDraw()
{
	pDD7->Release();
	pPSur->Release();
	for(i=0;i<BMPSOURCE;i++)
	    pOPlatemp[i]->Release();
    delete  []bitmap;
	delete  []pOPlatemp;
}

bool MyDDraw::InitDDraw(HWND ghWnd)	
{
//==================建立DirectDraw对象=================
result = DirectDrawCreateEx(NULL, (VOID**)&pDD7,
                IID_IDirectDraw7, NULL);  //建立DirectDraw对象
if (result != DD_OK)
{MessageBox(GetFocus(),"建立DirectDraw对象失败!","错误!",MB_OK|MB_ICONHAND);return false;}
//======================设置程序协调层级================
result = pDD7->SetCooperativeLevel(ghWnd,DDSCL_EXCLUSIVE |
			      DDSCL_FULLSCREEN|
DDSCL_ALLOWREBOOT );  /*建立一个独占模式、全屏幕、允许按下Ctrl+Alt+Del重新开机的应用程序 */
if(result !=DD_OK)
{MessageBox(GetFocus(),"设定程序协调层级失败!","错误!",MB_OK|MB_ICONHAND);return false;}
//===================设置屏幕显示模式====================
result=pDD7->SetDisplayMode(800,600,32,0,DDSDM_STANDARDVGAMODE);  //设置屏幕显示模式  
if(result !=DD_OK)
{MessageBox(GetFocus(),"设定屏幕显示模式失败!","错误!",MB_OK|MB_ICONHAND);return false;}
//================建立主绘图页\设置一个后缓冲区============
memset(&desc,0,sizeof(desc));  //清空结构体变量内容  
desc.dwSize = sizeof(desc);     //配置大小      
desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;  /*设置结构体变量desc的dwFlags数据成员*/
desc.dwBackBufferCount = 1;    //设置一个后缓冲区    
desc.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE| DDSCAPS_COMPLEX |
                   DDSCAPS_FLIP;   //定义一个可翻页的主绘图页
result = pDD7->CreateSurface(&desc,&pPSur,NULL);//调用CreateSurface方法
if(result !=DD_OK)
{MessageBox(GetFocus(),"建立主绘图页失败!","错误!",MB_OK|MB_ICONHAND);return false;}
//====================连接后缓冲区=======================
caps.dwCaps = DDSCAPS_BACKBUFFER;  //设置绘图页属性
result = pPSur->GetAttachedSurface(&caps,&pBBuf);  //定义该绘图页对象为//后缓冲区
if(result !=DD_OK)
{MessageBox(GetFocus(),"连接后缓冲区失败!","错误!",MB_OK|MB_ICONHAND);return false;}
//=====================建立幕后暂存区=====================
memset(&desc,0,sizeof(desc));  //清空结构内容      
desc.dwSize = sizeof(desc);  //重设desc结构体变量大小
desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; //设置各项//属性
desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;  //设置为幕后暂
//存区
desc.dwWidth = 800;   //设置暂存区宽度
desc.dwHeight = 600;  //设置暂存区高度
for(i=0;i<BMPSOURCE;i++)  //建立BMPSOURCE个幕后暂存区
{result =pDD7->CreateSurface(&desc, &pOPlatemp[i], NULL);}
if(result !=DD_OK)
{MessageBox(GetFocus(),"建立幕后暂存区失败!","错误!",MB_OK|MB_ICONHAND);return false;}
//=========================================================================================

    SetColorKey(key);  //设置颜色键(0为黑色)
	LoadBmp();	
	BitToHdc();
	
	::SetCursorPos(0,0);    //设置鼠标位置
  
	return true;
}

void MyDDraw::SetColorKey(DDCOLORKEY &ColorKey)
{
//	WORD ColorKey=0x001F;  //兰色;

//屏幕显示模式为32位RGB模式
	key.dwColorSpaceLowValue=RGB(255, 0, 255);   //紫色
    key.dwColorSpaceHighValue=RGB(255, 0, 255);
    for(i=0;i<BMPSOURCE;i++)  //设置幕后暂存区的颜色键
	    pOPlatemp[i]->SetColorKey(DDCKEY_SRCBLT,&key);
}		

void MyDDraw::Render()
{
	fps++;
	if(fps>=800){fps=0;}
//-----------------------------------------------------------------
	DrawBack();
	if(ShowMainMenu){DrawMainMenu();}  //MainMenu

	if(ShowStage) //stage
	{
		DrawStageBmp();
		DrawGame=false;
		static int tt;
		if(OneSecond){tt++;}
		if(tt>=5)
		{
			playsound[0]=true;
			ShowStage=false;
			tt=0;
			file.NextFile=false;
			if(MainMenuSelect==0){StartGame1=true;}
			else{StartGame2=true;}
			NewGame=false;
			DrawGame=true; 
			ShowMainMenu=false;
		}/**/

	}
	if(DrawGame)
	{
		ShowMainMenu=false;
		DrawMap();	
	//-----------------------------------------------------------------
	    if(!SetPause)
		{
			if(!tank[0].dead)
			{
				tank[0].GetTankRect();
				DrawPlayer(player.ScreenXY, flash);
				DrawBlood(tank[0].ScreenXY,tank[0].blood,tank[0].way);
				DrawPlayerBullet(tank[0].way);
				if(bullete[0].ShowBomb){DrawHitBomb(HitBomb[0],0);}
				if(tank[0].showrect){int a=0;DrawRect(a);}
			}
			else{if(tank[0].BoomNow){DrawBomb(tank[0].ScreenXY,0);}}
		//------------------------------------------------------------------
			for(i=1;i<11;i++)
			{
				if(!tank[i].dead)
				{
					tank[i].GetTankRect();

					if(tank[i].MoveStop)	
					{
						static int ts[11];
						if(OneSecond)
						{
							ts[i]++;
							if(ts[i]>=10)
							{
								ts[i]=0;
								tank[i].MoveStop=false;
							}
						}
					}
					DrawEnemy(tank[i].ScreenXY,flash,i);

					DrawBlood(tank[i].ScreenXY,tank[i].blood,tank[i].way);
					DrawEnemyBullet(tank[i].way,i);
					if(bullete[i].ShowBomb){DrawHitBomb(HitBomb[i],i);}
					if(tank[i].showrect){DrawRect(i);}	   
				}
				else  //画物品
				{		  
					if(tank[i].things.kind!=0 &&  tank[i].things.LiveTime>0)
					{
						tank[i].things.show=true;
						tank[i].things.ScreenXY.x=tank[i].ScreenXY.x+2;
						tank[i].things.ScreenXY.y=tank[i].ScreenXY.y+2;
						DrawThings(tank[i].things.ScreenXY,tank[i].things.kind);
						if(OneSecond){tank[i].things.LiveTime--;}
					}else{tank[i].things.show=false;}
					if(!bullete[i].BulleteHit){DrawEnemyBullet(tank[i].way,i);}
					if(bullete[i].ShowBomb){DrawHitBomb(HitBomb[i],i);}
				   
					POINT dp={tank[i].ScreenXY.x,tank[i].ScreenXY.y};
					if(tank[i].BoomNow){DrawBomb(dp,i);} //爆炸效果
				}
			}
			if(showdoop){DrawDoop();}
		//--------------------------------------------------------------
			DrawGress();  //最后画草地
		}
		else{DrawGress();DrawPauseBmp();}

	}
	if(tank[0].dead && DrawGame){DrawGameOver();}

	pPSur->Flip( NULL , DDFLIP_WAIT );   //翻页
/*
//text
		char string[10];
		POINT p;
		p.x=0;
		p.y=20;
		COLORREF rgb=RGB(0,255,0);
		ZeroMemory( string, 10 );
		sprintf(string, "帧频:%d", FPS);
		DrawText(string,p,rgb);

		p.x=0;
		p.y=40;
		rgb=RGB(0,255,0);
		ZeroMemory( string, 10 );
		sprintf(string, "刷新速度:%d", OneFps);
		DrawText(string,p,rgb);	
		
		p.x=0;
		p.y=80;
		rgb=RGB(255,0,0);
		ZeroMemory( string, 10);
		sprintf(string, "第%d关", file.MapIndex);
		DrawText(string,p,rgb);
	///////////////////////////////////////////////////////////
	//test
*/	
}

bool MyDDraw::LoadBmp()
{
	bitmap[0]=(HBITMAP)::LoadImage(NULL,"Bmp\\backwall.bmp",IMAGE_BITMAP,
                80,60,LR_LOADFROMFILE);  
	bitmap[1]=(HBITMAP)::LoadImage(NULL,"Bmp\\wall1.bmp",IMAGE_BITMAP,
                48,32,LR_LOADFROMFILE);  
	bitmap[2]=(HBITMAP)::LoadImage(NULL,"Bmp\\tanks.bmp",IMAGE_BITMAP,
                128,128,LR_LOADFROMFILE);
	bitmap[3]=(HBITMAP)::LoadImage(NULL,"Bmp\\TREE.bmp",IMAGE_BITMAP,
                30,30,LR_LOADFROMFILE);
	bitmap[4]=(HBITMAP)::LoadImage(NULL,"Bmp\\bullet.BMP",IMAGE_BITMAP,
                16,8,LR_LOADFROMFILE);
	bitmap[5]=(HBITMAP)::LoadImage(NULL,"Bmp\\blood.bmp",IMAGE_BITMAP,
                24,8,LR_LOADFROMFILE);
//===========================================
	bitmap[6]=(HBITMAP)::LoadImage(NULL,"Bmp\\bomb.BMP",IMAGE_BITMAP,
                224,32,LR_LOADFROMFILE);
	bitmap[7]=(HBITMAP)::LoadImage(NULL,"Bmp\\things.bmp",IMAGE_BITMAP,
                138,23,LR_LOADFROMFILE);
	bitmap[8]=(HBITMAP)::LoadImage(NULL,"Bmp\\seed.bmp",IMAGE_BITMAP,
                24,24,LR_LOADFROMFILE);
	bitmap[9]=(HBITMAP)::LoadImage(NULL,"Bmp\\piece.bmp",IMAGE_BITMAP,
                64,64,LR_LOADFROMFILE);
	bitmap[10]=(HBITMAP)::LoadImage(NULL,"Bmp\\bom.bmp",IMAGE_BITMAP,
                384,48,LR_LOADFROMFILE);
	bitmap[11]=(HBITMAP)::LoadImage(NULL,"Bmp\\splash.bmp",IMAGE_BITMAP,
                376,255,LR_LOADFROMFILE);
	bitmap[12]=(HBITMAP)::LoadImage(NULL,"Bmp\\over.bmp",IMAGE_BITMAP,
                403,64,LR_LOADFROMFILE);
	bitmap[13]=(HBITMAP)::LoadImage(NULL,"Bmp\\pause.bmp",IMAGE_BITMAP,
                90,28,LR_LOADFROMFILE);
	bitmap[14]=(HBITMAP)::LoadImage(NULL,"Bmp\\stage.bmp",IMAGE_BITMAP,
                95,44,LR_LOADFROMFILE);
	bitmap[15]=(HBITMAP)::LoadImage(NULL,"Bmp\\num.bmp",IMAGE_BITMAP,
                240,24,LR_LOADFROMFILE);
//==================================================

	for( i=0;i<BMPSOURCE;i++)
	{
		if(bitmap[i]==NULL)
		{
			MessageBox(GetFocus(),"无法载入位图!","错误!",MB_OK|MB_ICONHAND);
			return false;
		}
	}

    return true;
}

void MyDDraw::BitToHdc()
{
	hdc = ::CreateCompatibleDC(NULL);
//=======================BACK=================================
	for(i=0;i<BMPSOURCE;i++)
	{
	pOPlatemp[i]->GetSurfaceDesc(&desc);  //取得幕后暂存区的信息
	::SelectObject(hdc,bitmap[i]);  //设置hdc中的位图为bitmap
	pOPlatemp[i]->GetDC( &hdc1 );  //取得幕后暂存区的DC
	::BitBlt( hdc1 , 0 , 0 , desc.dwWidth, desc.dwHeight ,hdc , 0 , 0 , SRCCOPY );  
	pOPlatemp[i]->ReleaseDC( hdc1 );  //释放幕后暂存区的DC(必须的!)
	}
	/*
//=======================TILE=====================================
		pOPlatemp[0]->GetSurfaceDesc(&desc);  
        ::SelectObject(hdc,bitmap[1]);
		pOPlatemp[0]->GetDC( &hdc1 );
		::BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY );
		pOPlatemp[0]->ReleaseDC( hdc1 );
//=======================TREE=========================================
		pOPlatemp[1]->GetSurfaceDesc(&desc);  
        ::SelectObject(hdc,bitmap[2]);
		pOPlatemp[1]->GetDC( &hdc1 );
		::BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY );
		pOPlatemp[1]->ReleaseDC( hdc1 );
//=======================wall=========================================
		pOPlatemp[2]->GetSurfaceDesc(&desc);  
        ::SelectObject(hdc,bitmap[3]);
		pOPlatemp[2]->GetDC( &hdc1 );
		::BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY );
		pOPlatemp[2]->ReleaseDC( hdc1 );
//=======================wall2=========================================
		pOPlatemp[3]->GetSurfaceDesc(&desc);  
        ::SelectObject(hdc,bitmap[4]);
		pOPlatemp[3]->GetDC( &hdc1 );
		::BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY );
		pOPlatemp[3]->ReleaseDC( hdc1 );
//=======================wall3=========================================
		pOPlatemp[4]->GetSurfaceDesc(&desc);  
        ::SelectObject(hdc,bitmap[5]);
		pOPlatemp[4]->GetDC( &hdc1 );
		::BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY );
		pOPlatemp[4]->ReleaseDC( hdc1 );
//=======================wall4=========================================
		pOPlatemp[5]->GetSurfaceDesc(&desc);  
        ::SelectObject(hdc,bitmap[6]);
		pOPlatemp[5]->GetDC( &hdc1 );
		::BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY );
		pOPlatemp[5]->ReleaseDC( hdc1 );
//=======================wall5=========================================
		pOPlatemp[6]->GetSurfaceDesc(&desc);  
        ::SelectObject(hdc,bitmap[7]);
		pOPlatemp[6]->GetDC( &hdc1 );
		::BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY );
		pOPlatemp[6]->ReleaseDC( hdc1 );		
//=======================wall6=========================================
		pOPlatemp[7]->GetSurfaceDesc(&desc);  
        ::SelectObject(hdc,bitmap[8]);
		pOPlatemp[7]->GetDC( &hdc1 );
		::BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY );
		pOPlatemp[7]->ReleaseDC( hdc1 );
		*/
}

void MyDDraw::DrawBack()
{
	if(OneFps){}

//背景横向滚动
//	pBBuf->BltFast( 0 , 0 , pOPlatemp[0], &Rect(fps,0,800,600) , DDBLTFAST_WAIT );  
//	pBBuf->BltFast( 800-fps , 0 , pOPlatemp[0], &Rect(0,0,fps,600) , DDBLTFAST_WAIT );  
	short a=SCREEN_W/80;	
	short b=SCREEN_H/60;
	for(j=0;j<b+1;j++)
	{
		for(i=0;i<a+1;i++)
		{
	        pBBuf->BltFast(i*80, j*60, pOPlatemp[0], 
				&Rect(0,0,80,60) , DDBLTFAST_WAIT );
		}
	}

}

void MyDDraw::DrawMap()
{
	short x=0;
	short y=0;
    for(j=0;j<34;j++)
	{
	    for(i=0;i<42;i++)
		{
			if(Map[i][j]==3){continue ;}  //先不在这里画草地
			else if(Map[i][j]==0){x=0;y=0;} 
			else if(Map[i][j]==1){x=16;y=0;}
			else if(Map[i][j]==2){x=32;y=0;} 
			else if(Map[i][j]==4)
			{
				if(OneSecond){x=16;}else{x=32;}
				y=16;
			}
			else if(Map[i][j]==5)
			{
				if(OneSecond){x=32;}else{x=16;}
				y=16;
			}
          pBBuf->BltFast(i*16+GAMET_X ,j*16 , pOPlatemp[1], 
			   &Rect(x,y,x+16,y+16) , DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY ); 
		}

⌨️ 快捷键说明

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