📄 myddraw.cpp
字号:
// 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 + -