// MyDDraw.cpp: implementation of the MyDDraw class.
#include <stdio.h>
#include "externvar.h"
#include "Bullet.h"
#include "Player.h"
#include "Bomb.h"
CBomb bomb;
extern bool beginthegame;
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];
CMyDDraw::CMyDDraw()
{
setdoop=false;
fps=0;
bitmap=new HBITMAP[22];
pOPlatemp=new LPDIRECTDRAWSURFACE7[22];
}
CMyDDraw::~CMyDDraw()
{
pDD7->Release();
pPSur->Release();
for(i=0;i<22;i++)
pOPlatemp[i]->Release();
delete []bitmap;
delete []pOPlatemp;
}
bool CMyDDraw::InitDDraw(HWND ghWnd)
{
result = DirectDrawCreateEx(NULL, (VOID**)&pDD7,
IID_IDirectDraw7, NULL);
if (result != DD_OK)
{
MessageBox(GetFocus(),"建立DirectDraw对象失败!","错误!",MB_OK|MB_ICONHAND);
return false;
}
result = pDD7->SetCooperativeLevel(ghWnd,DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN|
DDSCL_ALLOWREBOOT );
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.dwBackBufferCount = 1;
desc.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE| DDSCAPS_COMPLEX |
DDSCAPS_FLIP;
result = pDD7->CreateSurface(&desc,&pPSur,NULL);
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.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
//存区
desc.dwWidth = 800;
desc.dwHeight = 600;
for(i=0;i<22;i++)
{
result =pDD7->CreateSurface(&desc, &pOPlatemp[i], NULL);
}
if(result !=DD_OK)
{
MessageBox(GetFocus(),"建立幕后暂存区失败!","错误!",MB_OK|MB_ICONHAND);
return false;
}
//=========================================================================================
SetColorKey(key); //设置颜色键(0为黑色)
LoadBmp();
BitToHdc();
::ShowCursor(FALSE); //设置鼠标位置
return true;
}
void CMyDDraw::SetColorKey(DDCOLORKEY &ColorKey)
{
key.dwColorSpaceLowValue=RGB(255, 0, 255); //紫色
key.dwColorSpaceHighValue=RGB(255, 0, 255);
key2.dwColorSpaceHighValue=RGB(0,0,0); //黑色
key2.dwColorSpaceLowValue=RGB(0,0,0);
key3.dwColorSpaceHighValue = RGB(255,255,255); //白色
key3.dwColorSpaceLowValue = RGB(255,255,255);
pOPlatemp[1]->SetColorKey(DDCKEY_SRCBLT,&key2);
pOPlatemp[2]->SetColorKey(DDCKEY_SRCBLT,&key2);
pOPlatemp[3]->SetColorKey(DDCKEY_SRCBLT,&key2);
for (i=4;i<=6;i++)
{
pOPlatemp[i]->SetColorKey(DDCKEY_SRCBLT,&key);
}
pOPlatemp[7]->SetColorKey(DDCKEY_SRCBLT,&key2);
for(i=8;i<=10;i++)
{
pOPlatemp[i]->SetColorKey(DDCKEY_SRCBLT,&key);
}
for (i=11;i<17;i++)
{
pOPlatemp[i]->SetColorKey(DDCKEY_SRCBLT,&key2);
}
pOPlatemp[17]->SetColorKey(DDCKEY_SRCBLT,&key3);
for (i=18;i<21;i++)
{
pOPlatemp[i]->SetColorKey(DDCKEY_SRCBLT,&key2);
}
pOPlatemp[21]->SetColorKey(DDCKEY_SRCBLT,&key3);
}
void CMyDDraw::Render()
{
fps++;
if(fps>=800){fps=0;}
//-----------------------------------------------------------------
DrawBack();
DrawMainMenu(); //MainMenu
if(ShowStage) //stage
{
DrawStageBmp();
DrawGame=false;
static int tt;
if(OneSecond){tt++;}
if(tt>=5)
{
playsound[9]=true;
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();
DrawHeart(life);
//-----------------------------------------------------------------
// static int jj;
// if(OneSecond) jj++;
// if(jj==5) jj=0;
if(!SetPause)
{
if(!spider[0].dead)
{
spider[0].GetSpiderRect();
DrawPlayer(player.ScreenXY, flash);
DrawBlood(spider[0].ScreenXY,spider[0].blood,spider[0].way);
DrawPlayerBullet(spider[0].way);
DrawHit(player.ScreenXY,flash);
if(bullete[0].ShowBomb){DrawHitBomb(HitBomb[0],0);}
if(spider[0].showrect){int a=0;DrawRect(a);}
}
else{if(spider[0].BoomNow){DrawBomb(spider[0].ScreenXY,0);}}
//------------------------------------------------------------------
for(i=1;i<11;i++)
{
if(!spider[i].dead)
{
spider[i].GetSpiderRect();
if(spider[i].MoveStop)
{
static int ts[11];
if(OneSecond)
{
ts[i]++;
if(ts[i]>=8)
{
ts[i]=0;
spider[i].MoveStop=false;
}
}
}
DrawEnemy(spider[i].ScreenXY,flash,i);
DrawBlood(spider[i].ScreenXY,spider[i].blood,spider[i].way);
DrawEnemyBullet(spider[i].way,i);
if(bullete[i].ShowBomb){DrawHitBomb(HitBomb[i],i);}
if(spider[i].showrect){DrawRect(i);}
}
else //画物品
{
if(spider[i].things.kind!=0 && spider[i].things.LiveTime>0)
{
spider[i].things.show=true;
spider[i].things.ScreenXY.x=spider[i].ScreenXY.x+2;
spider[i].things.ScreenXY.y=spider[i].ScreenXY.y+2;
DrawThings(spider[i].things.ScreenXY,spider[i].things.kind);
if(OneSecond){spider[i].things.LiveTime--;}
}else{spider[i].things.show=false;}
if(!bullete[i].BulleteHit){DrawEnemyBullet(spider[i].way,i);}
if(bullete[i].ShowBomb){DrawHitBomb(HitBomb[i],i);}
POINT dp={spider[i].ScreenXY.x,spider[i].ScreenXY.y};
if(spider[i].BoomNow){DrawBomb(dp,i);} //爆炸效果
}
}
if(showdoop){DrawDoop();}
//--------------------------------------------------------------
DrawGress(); //最后画草地
}
else{DrawGress();DrawPauseBmp();}
}
if((spider[0].dead || dead)&& DrawGame){DrawGameOver();}
pPSur->Flip( NULL , DDFLIP_WAIT ); //翻页
}
bool CMyDDraw::LoadBmp()
{
bitmap[0]=(HBITMAP)::LoadImage(NULL,"Bmp\\beijing.bmp",IMAGE_BITMAP,
800,600,LR_LOADFROMFILE);
bitmap[1]=(HBITMAP)::LoadImage(NULL,"Bmp\\wall1.bmp",IMAGE_BITMAP,
48,32,LR_LOADFROMFILE);
bitmap[2]=(HBITMAP)::LoadImage(NULL,"Bmp\\zhizhu.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]
VC++实现小型单机游戏的设计源码
5星 · 超过95%的资源 需积分: 14 196 浏览量
2009-09-07
19:47:56
上传
评论 1
收藏 6.12MB RAR 举报
meng8861
- 粉丝: 42
- 资源: 42