📄 canvasframe.cpp
字号:
CreateDDPla(95,15,"s_4_1.bmp",13);
CreateDDPla(95,15,"s_4_2.bmp",14);
CreateDDPla(95,30,"s_6.bmp",15);
CreateDDPla(95,30,"s_5.bmp",16);
CreateDDPla(96,34,"life_0.bmp",17);
CreateDDPla(8,16,"life_element.bmp",18);
CreateDDPla(195,55,"OPTION.bmp",19);
CreateDDPla(125,55,"FAST.bmp",20);
CreateDDPla(147,55,"SLOW.bmp",21);
CreateDDPla(268,55,"QUIT.bmp",22);
CreateDDPla(211,55,"TRUE.bmp",23);
CreateDDPla(144,55,"BACK.bmp",24);
CreateDDPla(375,15,"dingban.bmp",25);
CreateDDPla(31,62,"p2_j.bmp",26);
CreateDDPla(124,31,"p2_r_r.bmp",27);
CreateDDPla(124,31,"p2_r_l.bmp",28);
CreateDDPla(31,62,"b_p_j.bmp",29);
CreateDDPla(124,31,"b_p_r_r.bmp",30);
CreateDDPla(124,31,"b_p_r_l.bmp",31);
CreateDDPla(31,31,"b_p_z.bmp",32);
CreateDDPla(31,31,"p2_z.bmp",33);
CreateDDPla(31,31,"p2_z.bmp",34);
CreateDDPla(466,240,"titu.bmp",35);
CreateDDPla(466,240,"stairs.bmp",36);
CreateDDPla(30,440,"score.bmp",37);
CreateDDPla(640,480,"sunset.bmp",38);
CreateDDPla(240,480,"wallpaper.bmp",39);
for(int i=1;i<=39;i++)//设定颜色键
ColorKey(i);
person1.set();
person2.set();
}
canvasFrame::~canvasFrame()
{
delete bitmap;
delete hdc;
delete dhdc;
DD->Release();
DDSur->Release();
for(int i=0;i<=39;i++)
DDPla[i]->Release();
pDI->Release();
pDKB->Release();
DI->Release();
DIms->Release();
}
BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd)
//{{AFX_MSG_MAP(canvasFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// canvasFrame message handlers
int canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
InitDD();
InitDI();
SetTimer(1,50,NULL);//主计时器
SetTimer(2,600,NULL);//生成石头的计时器
SetTimer(3,900,NULL);
SetTimer(4,0,NULL);
SetTimer(5,300,NULL);
SetTimer(6,0,NULL);
SetTimer(7,350,NULL);
// TODO: Add your specialized creation code here
return 0;
}
void canvasFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(over)//游戏没开始
{
ge=0;
reset_sto();
S1[0].exist=true;
S1[0].x=156;
S1[0].y=480-15;
person1.set();
person2.set();
if(nIDEvent==1)
{
if(p_what==1)//贴选择单打或双打的屏幕
{
DDBuf->BltFast( 0 , 0 , DDPla[0], CRect(0,0,640,480) , DDBLTFAST_WAIT);
DDBuf->BltFast( 87, 0 , DDPla[35], CRect(0,0,466,240) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
DDBuf->BltFast( 87, 0 , DDPla[36], CRect(0,0,466,240) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
DDBuf->BltFast( 0, 0 , DDPla[38], CRect(0,0,640,480) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
DDBuf->BltFast( 320-124 , 240 , DDPla[6], CRect(0,0,247,55) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖1-PLAYER
DDBuf->BltFast( 320-124 , 240+55 , DDPla[7],
CRect(0,0,248,55) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖2-PLAYER
DDBuf->BltFast( 320-124 , 240+55+55 , DDPla[19],
CRect(0,0,195,55) , DDBLTFAST_WAIT|
DDBLTFAST_SRCCOLORKEY);//帖OPTION
DDBuf->BltFast( 320-124 , 240+55+55+55 ,
DDPla[22], CRect(0,0,268,55) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖QUIT
DDBuf->BltFast(320-124-5-31-10 , y ,DDPla[2], CRect(0,0,31,31),
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖人
}
if(p_what==2)//按下OPTION后贴选择速度和石头的屏幕
{
DDBuf->BltFast( 0 , 0 , DDPla[0], CRect(0,0,640,480) , DDBLTFAST_WAIT);//帖背景
DDBuf->BltFast( 320-80 , 100 , DDPla[20], CRect(0,0,125,55) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖FAST
if(fast==true)
DDBuf->BltFast( 320-80+147+20 , 100 ,
DDPla[23], CRect(0,0,211,55) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//在FAST后帖钩
else
DDBuf->BltFast( 320-80+147+20 , 100 , DDPla[34],
CRect(0,0,211,55) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
DDBuf->BltFast( 320-80 , 100+55 , DDPla[21],
CRect(0,0,147,55) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖SLOW
if(slow==true)
DDBuf->BltFast( 320-80+147+20 , 100+55 ,
DDPla[23], CRect(0,0,211,55) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖SLOW后帖钩
else
DDBuf->BltFast( 320-80+147+20 , 100+55 ,
DDPla[34], CRect(0,0,211,55) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
DDBuf->BltFast( 320-80 , 100+55+55+20 ,
DDPla[9], CRect(0,0,95,15) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖翻滚石
if(sto2==true)
DDBuf->BltFast( 320-80+147+20 ,
100+55+55 , DDPla[23], CRect(0,0,211,55) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖翻滚石后钩
else
DDBuf->BltFast( 320-80+147+20 , 100+55+55 , DDPla[34], CRect(0,0,211,55) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
DDBuf->BltFast( 320-80 , 100+55+55+55+20 ,
DDPla[11], CRect(0,0,95,15) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖弹簧
if(sto3==true)
DDBuf->BltFast( 320-80+147+20 , 100+55+55+55 ,
DDPla[23], CRect(0,0,211,55) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖弹簧后钩
else
DDBuf->BltFast( 320-80+147+20 , 100+55+55+55 , DDPla[34], CRect(0,0,211,55) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
DDBuf->BltFast( 320-80 , 100+55+55+55+55+20 , DDPla[16], CRect(0,0,95,15) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖履带
if(sto5==true)
DDBuf->BltFast( 320-80+147+20 ,
100+55+55+55+55 , DDPla[23], CRect(0,0,211,55) ,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖履带后钩
else
DDBuf->BltFast( 320-80+147+20 , 100+55+55+55+55 , DDPla[34], CRect(0,0,211,55) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
DDBuf->BltFast(320-80-5-31-10 , y1 ,DDPla[2], CRect(0,0,31,31),DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//帖人
}
DDSur->Flip( NULL , DDFLIP_WAIT );
}
}
if(!over)//游戏开始
{
if(nIDEvent==1)//帖背景
{
result=pDKB->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
if(result!=DI_OK)
MessageBox("取得键盘状态失败!");
DDBuf->BltFast( 0 , 0 , DDPla[0],CRect(0,0,640,480) , DDBLTFAST_WAIT);//大背景为黑色
DDBuf->BltFast( 0 , 80 , DDPla[1], CRect(0,bgx,407,400) , DDBLTFAST_WAIT);//小背景卷动的
DDBuf->BltFast( 0 , 480-bgx , DDPla[1], CRect(0,0,407,bgx) , DDBLTFAST_WAIT);
DDBuf->BltFast( 400,0, DDPla[39], CRect(0,0,240,480) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
DDBuf->BltFast( 16 , 80 , DDPla[25],CRect(0,0,375,15) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
if(player==1)//单打时的帖图
{
if(buffer[DIK_RIGHT]&0x80)
person1.zhuangtai1+=9;
if(buffer[DIK_LEFT]&0x80)
person1.zhuangtai2+=9;
if(buffer[DIK_UP]&0x80)
person1.zhuangtai3+=9;
person1.so1=person1.should_onstone();
person1.judge_onstone();
pastesto();
if(person1.exist)
{
person1.paste();
person1.life.paste();
}
person1.zhuangtai1=person1.zhuangtai2=person1.zhuangtai3=0;
}
if(player==2)//双打时的帖图
{
if(buffer[DIK_RIGHT]&0x80)
person1.zhuangtai1+=9;
if(buffer[DIK_LEFT]&0x80)
person1.zhuangtai2+=9;
if(buffer[DIK_UP]&0x80)
person1.zhuangtai3+=9;
if(buffer[DIK_X]&0x80)
person2.zhuangtai1+=9;
if(buffer[DIK_Z]&0x80)
person2.zhuangtai2+=9;
if(buffer[DIK_A]&0x80)
person2.zhuangtai3+=9;
person1.so2=person1.should_onperson();
person1.so1=person1.should_onstone();
person1.so3=person1.should_onright();
person1.so4=person1.should_onleft();
person2.so2=person2.should_onperson();
person2.so1=person2.should_onstone();
person2.so3=person2.should_onright();
person2.so4=person2.should_onleft();
person1.judge_onperson();
person1.judge_onstone();
person1.judge_onright();
person1.judge_onleft();
person2.judge_onperson();
person2.judge_onstone();
person2.judge_onright();
person2.judge_onleft();
pastesto();
if(person1.exist)
{
person1.paste();
person1.life.paste();
}
if(person2.exist)
{
person2.paste();
person2.life.paste();
}
person1.set_zhuangtai();
person2.set_zhuangtai();
}
bgx+=canshu;//背景卷动
if(bgx>=400)
bgx=0;
score.sumup();
DDSur->Flip( NULL , DDFLIP_WAIT );
}
if(nIDEvent==2&&slow)
{
if(!over)
{
if(sto2==true&&sto3==true&&sto5==true)//什么石头都有
generate_1();
if(sto2==false&&sto3==true&&sto5==true)//没有翻滚石
generate_2();
if(sto2==true&&sto3==false&&sto5==true)//没有弹簧
generate_3();
if(sto2==true&&sto3==true&&sto5==false)//没有履带
generate_4();
if(sto2==false&&sto3==false&&sto5==true)//没有翻滚石弹簧
generate_5();
if(sto2==false&&sto3==true&&sto5==false)//没有翻滚石履带
generate_6();
if(sto2==true&&sto3==false&&sto5==false)//没有弹簧履带
generate_7();
if(sto2==false&&sto3==false&&sto5==false)//只有钉板不动石
generate_8();
}
}
if(nIDEvent==7&&fast)
{
if(!over)
{
if(sto2==true&&sto3==true&&sto5==true)//什么石头都有
generate_1();
if(sto2==false&&sto3==true&&sto5==true)//没有翻滚石
generate_2();
if(sto2==true&&sto3==false&&sto5==true)//没有弹簧
generate_3();
if(sto2==true&&sto3==true&&sto5==false)//没有履带
generate_4();
if(sto2==false&&sto3==false&&sto5==true)//没有翻滚石弹簧
generate_5();
if(sto2==false&&sto3==true&&sto5==false)//没有翻滚石履带
generate_6();
if(sto2==true&&sto3==false&&sto5==false)//没有弹簧履带
generate_7();
if(sto2==false&&sto3==false&&sto5==false)//只有钉板不动石
generate_8();
}
}
if(nIDEvent==3)
{
if(player==1)//单打时的情况
if(person1.life.i<12)
person1.life.i++;//改生命值
if(player==2)//双打时的情况
{
if(person1.life.i<12)
person1.life.i++;
if(person2.life.i<12)
person2.life.i++;
}
}
if(nIDEvent==4)
{
if(player==1)
if(person1.exist==false)
over=true;
if(player==2)
if(person1.exist==false&&person2.exist==false)
over=true;
}
}
CFrameWnd::OnTimer(nIDEvent);
}
void canvasFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if(nChar==VK_ESCAPE)
{//PostMessage(WM_CLOSE);
if(p_what==2)
p_what=1;
else
over=true;
}
if(over)
{
if(nChar==VK_RETURN)
{
if(p_what==1)
{
if(y<240+55)//如果按1—PLAYER
{
over=false;
player=1;
}
if(y>240+55&&y<240+110)//按2—PLAYER
{
over=false;
player=2;
}
if(y>240+110&&y<240+110+55)//按OPTION
{
p_what=2;
}
if(y>240+110+55)//按QUIT
PostMessage(WM_CLOSE);
}
if(p_what==2)
{
if(y1>100&&y1<100+55)//按下FAST
{
if(fast==true)
{
fast=false;
slow=true;
canshu=4;
}
else
{
fast=true;
slow=false;
canshu=7;
}
}
if(y1>100+55&&y1<100+110)//按下SLOW
{
if(slow==true)
{
slow=false;
fast=true;
canshu=7;
}
else
{
slow=true;
fast=false;
canshu=4;
}
}
if(y1>100+110&&y1<100+55+55+55)//是否取消翻滚石
{
if(sto2==true)
sto2=false;
else sto2=true;
}
if(y1>100+55+55+55&&y1<100+55+55+55+55)//是否取消弹簧
{
if(sto3==true)
sto3=false;
else sto3=true;
}
if(y1>100+55+55+55+55&&y1<100+55+55+55+55+55)//是否取消履带
{
if(sto5==true)
sto5=false;
else sto5=true;
}
if(y1>100+55+55+55+55+55)
p_what=1;
}
}
if(nChar==VK_UP)
{
if(p_what==1)
y-=55;
if(y<250)
y=250;
if(p_what==2)
y1-=55;
if(y1<110)
y1=110;
}
if(nChar==VK_DOWN)
{
if(p_what==1)
y+=55;
if(y>250+55+55+55)
y=250+55+55+55;
if(p_what==2)
y1+=55;
if(y1>110+55+55+55+55)
y1=110+55+55+55+55;
}
}
CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
void canvasFrame::InitDD()
{
//建立 DirectDraw(对象
result = DirectDrawCreateEx(NULL, (VOID**)&DD, IID_IDirectDraw7, NULL);
if (result != DD_OK)
{
MessageBox("建立DirectDraw对象失败!");
return;
}
//设定协调层级
result = DD->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT );
if(result !=DD_OK)
{
MessageBox("设定程序协调层级失败!");
return;
}
//设定显示模式
result = DD->SetDisplayMode(640,480,16,0,DDSDM_STANDARDVGAMODE);
if(result !=DD_OK)
{
MessageBox("设定屏幕显示模式失败!");
return;
}
//建立主绘图页
memset(&DDde,0,sizeof(DDde));
DDde.dwSize = sizeof(DDde);
DDde.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
DDde.dwBackBufferCount = 1;
DDde.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
result = DD->CreateSurface(&DDde,&DDSur,NULL);
if(result !=DD_OK)
{
MessageBox("建立主绘图页失败!");
return;
}
//连结后缓冲区
DDcaps.dwCaps = DDSCAPS_BACKBUFFER;
result = DDSur->GetAttachedSurface(&DDcaps,&DDBuf);
if(result !=DD_OK)
{
MessageBox("连接后缓冲区失败!");
return;
}
//声明幕后幕存区的共同特性
memset(&DDde,0,sizeof(DDde));
DDde.dwSize = sizeof(DDde);
DDde.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
DDde.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
}
void canvasFrame::CreateDDPla(int width,int height,char* filename,int num)
{
DDde.dwWidth = width;
DDde.dwHeight = height;
result = DD->CreateSurface(&DDde, &DDPla[num], NULL);
if(result !=DD_OK)
{
MessageBox("建立幕后内存区失败!");
return;
}
bitmap = (HBITMAP)::LoadImage(NULL,filename,IMAGE_BITMAP,width,height,LR_LOADFROMFILE);
if(bitmap==NULL)
{
MessageBox("无法加载位图!");
return;
}
::SelectObject(hdc,bitmap);
DDPla[num]->GetDC( &dhdc );
::BitBlt( dhdc , 0 , 0 ,width,height, hdc , 0 , 0 , SRCCOPY );
DDPla[num]->ReleaseDC(dhdc);
}
void canvasFrame::ColorKey(int num)
{
key.dwColorSpaceHighValue = 0;
key.dwColorSpaceLowValue = 0;
DDPla[num]->SetColorKey(DDCKEY_SRCBLT,&key);
}
void canvasFrame::InitDI()
{
//建立 DirectInput 对象
HINSTANCE hinst = AfxGetInstanceHandle();
result = DirectInputCreateEx(hinst, DIRECTINPUT_VERSION,IID_IDirectInput7, (void**)&pDI, NULL);
if(result != DI_OK)
{
MessageBox("建立 DirectInput 对象失败!");
return;
}
//建立输入装置对象
result = pDI->CreateDeviceEx(GUID_SysKeyboard, IID_IDirectInputDevice7,(void**)&pDKB, NULL);
if(result != DI_OK)
{
MessageBox("建立键盘输入装置失败!");
return;
}
//设定数据格式
result =pDKB->SetDataFormat(&c_dfDIKeyboard);
if(result != DI_OK)
{
MessageBox("设定数据格式失败!");
return;
}
//设定协调层级
result = pDKB->SetCooperativeLevel(m_hWnd,DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
if(result != DI_OK)
{
MessageBox("设定程序协调层级失败!");
return;
}
//取用输入装置
result = pDKB->Acquire();
if(result != DI_OK)
{
MessageBox("取用输入装置失败!");
return;
}
//HINSTANCE hinst = AfxGetInstanceHandle();
result = DirectInputCreateEx(hinst, DIRECTINPUT_VERSION,IID_IDirectInput7, (void**)&DI, NULL);
if(result != DI_OK)
{
MessageBox("建立 DirectInput 对象失败!");
return;
}
//建立输入装置对象
result = DI->CreateDeviceEx(GUID_SysMouse, IID_IDirectInputDevice7,(void**)&DIms, NULL);
if(result != DI_OK)
{
MessageBox("建立鼠标输入装置失败!");
return;
}
//设定数据格式
result = DIms->SetDataFormat(&c_dfDIMouse2);
if(result != DI_OK)
{
MessageBox("设定数据格式失败!");
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -