📄 canvasframe.cpp
字号:
// canvasFrame.cpp : implementation file
//
#include "stdafx.h"
#include "canvasr.h"
#include "canvasFrame.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// canvasFrame
IMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)
//声明 DirectDraw 变量
LPDIRECTDRAW7 DD;
LPDIRECTDRAWSURFACE7 DDSur;
LPDIRECTDRAWSURFACE7 DDBuf;
LPDIRECTDRAWSURFACE7 DDPla[40];
DDSCAPS2 DDcaps;
DDSURFACEDESC2 DDde;
HRESULT result;
DDCOLORKEY key;
//声明 DirectInput 变量
LPDIRECTINPUT7 pDI;
LPDIRECTINPUTDEVICE7 pDKB;
LPDIRECTINPUT7 DI;
LPDIRECTINPUTDEVICE7 DIms;
DIMOUSESTATE2 DImstate;
int canshu=4;
//定义CLASS
class SCORE
{
public:
int i;
int j;
int k;
int x;//帖图的X坐标
int y;//帖图的Y坐标
int h;//帖图的gao
int w;//kuan
int bgx1;
int bgx2;
int bgx3;
int bgx4;
SCORE::SCORE():i(0),j(0),k(0),h(40),w(30),bgx1(0),bgx2(0),bgx3(0),bgx4(0),x(240),y(25)
{}
//int roll();
//int upbit();
void paste1();
void paste2();
void paste3();
void paste4();
void sumup();
};
SCORE score;
/*int SCORE::roll()
{
i++;
if(!(i%5000))
return 4;
if(!(i%500))
return 3;
if(!(i%50))
return 2;
if(!(i%5))
return 1;
return 0;
}*/
void SCORE::paste1()
{
i++;
bgx1+=2;
if(i<=100)
{
bgx1-=2;
DDBuf->BltFast(x,y,DDPla[37],CRect(0,bgx1,w,bgx1+h),
DDBLTFAST_WAIT);
}
if(i>100 && i<=120)
{
DDBuf->BltFast(x,y,DDPla[37],CRect(0,bgx1,w,bgx1+h),
DDBLTFAST_WAIT);
if(i==120)
i=0;
if(bgx1==10*h)
bgx1=0;
}
}
void SCORE::paste2()
{
j++;
bgx2+=2;
if(j<=1180)
{
bgx2-=2;
DDBuf->BltFast(x-30,y,DDPla[37],CRect(0,bgx2,w,bgx2+h),
DDBLTFAST_WAIT);
}
if(j>1180 && j<=1200)
{
DDBuf->BltFast(x-30,y,DDPla[37],CRect(0,bgx2,w,bgx2+h),
DDBLTFAST_WAIT);
if(j==1200)
j=0;
if(bgx2==10*h)
bgx2=0;
}
}
void SCORE::paste3()
{
k++;
bgx3+=2;
if(k<=11980)
{
bgx3-=2;
DDBuf->BltFast(x-60,y,DDPla[37],CRect(0,bgx3,w,bgx3+h),
DDBLTFAST_WAIT);
}
if(k>11980 && k<=12000)
{
DDBuf->BltFast(x-60,y,DDPla[37],CRect(0,bgx3,w,bgx3+h),
DDBLTFAST_WAIT);
if(k==12000)
k=0;
if(bgx3==10*h)
bgx3=0;
}
}
void SCORE::paste4()
{
DDBuf->BltFast(x-90,y,DDPla[37],CRect(0,0,w,h),
DDBLTFAST_WAIT);
}
void SCORE::sumup()
{
paste1();
paste2();
paste3();
paste4();
}
class LIFE//生命牌
{
public:
int x;//帖图坐标
int y;
LIFE():x(0),y(0),i(12){}
void paste();//帖图函数
int i;//生命值
};
void LIFE::paste()
{
DDBuf->BltFast(x , y,//贴空架子
DDPla[17], CRect(0,0,96,34),
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
for(int k=0;k<i;k++)//依据生命值的多少来帖
DDBuf->BltFast(x+k*8 , y+18 ,
DDPla[18], CRect(0,0,8,16),
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
}
class PERSON
{
public:
int x; //帖图的X坐标
int y; //帖图的Y坐标
int vy; //用于加速运动
int i1; //用于帖上弹图
int on_type;//所在石头的类型
int c; //用于连续贴弹跳图
int xp; //同上
int cp; //同上
int d; //用于连续贴跑图
int blood; //用于钉板贴图
int stonum; //石头号码
bool onstone;//在不在石头上
bool onperson;//在不在人头上
bool onleft;//在不在人左边
bool onright;//在不在人右边
bool so1,so2,so3,so4;
bool exist;
int zhuangtai1,zhuangtai2,zhuangtai3;
int land_line,person_line,right_line,left_line;
LIFE life;//CLASS 成员
PERSON():x(0),y(0),onstone(false),vy(0),on_type(0),i1(0)
,c(0),xp(0),cp(0),d(0),blood(0),stonum(-1),onperson(false)
,onleft(false),onright(false),zhuangtai1(0),zhuangtai2(0),
zhuangtai3(0),land_line(0),so1(false),so2(false),so3(false),
so4(false),person_line(500),right_line(-1),left_line(410),exist(false){}
virtual void paste()=0; //主贴图函数
virtual void paste_r()=0; //贴跑动图
virtual void paste_j()=0;//贴弹跳图
virtual void p_blood()=0;//贴受伤图
void judge_onstone(); //判断是否在石头上
virtual void judge_onperson()=0;//判断是否在人头上
virtual void judge_onright()=0;
virtual void judge_onleft()=0;
virtual void set()=0; //开始是设定人的坐
void set_zhuangtai();
bool should_onstone();
virtual bool should_onperson()=0;
virtual bool should_onright()=0;
virtual bool should_onleft()=0;
};
void PERSON::set_zhuangtai()
{
zhuangtai1=zhuangtai2=zhuangtai3=0;
}
class PERSON2:public PERSON
{
public:
void paste();
void paste_r(); //贴跑动图
void paste_j();//贴弹跳图
void p_blood();//贴受伤图
void set();
bool should_onperson();
void judge_onperson();
bool should_onright();
bool should_onleft();
void judge_onright();
void judge_onleft();
};
PERSON2 person2;
class PERSON1:public PERSON
{
public:
void paste();
void paste_r(); //贴跑动图
void paste_j();//贴弹跳图
void p_blood();//贴受伤图
void set();
bool should_onperson();
bool should_onright();
bool should_onleft();
void judge_onperson();
void judge_onright();
void judge_onleft();
};
PERSON1 person1;
class STONE
{
public:
int x; //贴图的 X 坐标
int y; //贴图的 Y 坐标
BOOL exist; //石头是否存在
STONE():x(0),y(0),exist(false){}
void generate() //石头生成函数
{
y=480;
x=rand()%420;
if(x>407-16-95)
x=407-16-95;
if(x<16)
x=16;
exist=true;
}
};
class STONE1:public STONE//不动的石头
{
public:
void paste();
};
void STONE1::paste()
{
y-=canshu;
DDBuf->BltFast(x,y,DDPla[8],CRect(0,0,95,15),
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
if(y<80)
exist=false;
}
class STONE2:public STONE//翻滚石
{
int c,xp;
public:
STONE2():c(0),xp(0),d(9){}
void paste_1();
void paste_2();
int d;
};
void STONE2::paste_1()
{
y-=canshu;
d--; //用以实现此函数连续执行4次
if(c==9)c=0;
xp=30*c;
DDBuf->BltFast(x , y ,
DDPla[10], CRect(0,xp,95,xp+30),
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
c++;
if(y<80)
exist=false;
}
void STONE2::paste_2()
{
y-=canshu;
DDBuf->BltFast(x,y,DDPla[9],CRect(0,0,95,15),
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//贴翻滚石的全图
d=9; //重置为4使下一次也连续贴四次
if(y<80)
exist=false;
}
class STONE3:public STONE//弹簧
{
public:
void paste_1();
void paste_2();
};
void STONE3::paste_1()
{
y-=canshu;
DDBuf->BltFast(x,y,DDPla[12],CRect(0,0,95,15),
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);//弹石的半图
if(y<80)exist=false;
}
void STONE3::paste_2()
{
y-=canshu;
DDBuf->BltFast(x,y,DDPla[11],CRect(0,0,95,15),
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
if(y<80)exist=false; //弹簧的全图
}
class STONE4:public STONE//钉板
{
public:
void paste();
};
void STONE4::paste()
{
y-=canshu;
DDBuf->BltFast(x,y,DDPla[13],CRect(0,0,95,15),
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
DDBuf->BltFast(x,y-15,DDPla[14],CRect(0,0,95,15),
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
if(y<95)exist=false;
}
class STONE5:public STONE//向右滚的石头
{
int c,xp;
public:
STONE5():c(0),xp(0){}
void paste();
};
void STONE5::paste()
{
y-=canshu;
if(c==2)c=0;
xp=15*c;
DDBuf->BltFast(x , y ,
DDPla[16], CRect(0,xp,95,xp+15),
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
c++;
if(y<80)exist=false;
}
class STONE6:public STONE//向左滚的石头
{
int c,xp;
public:
STONE6():c(0),xp(0){}
void paste();
};
void STONE6::paste()
{
y-=canshu;
if(c==2)c=0;
xp=15*c;
DDBuf->BltFast(x , y ,
DDPla[15], CRect(0,xp,95,xp+15),
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
c++;
if(y<80)exist=false;
}
//声明其它变量
HDC hdc,dhdc;
HBITMAP bitmap;
int bgx; //用于卷动背景
//int t,f; //控制屏幕贴图
//int score=0; //分数
bool over=true; //是否结束
STONE1 S1[10]; //石头数组
STONE2 S2[5];
STONE3 S3[5];
STONE4 S4[5];
STONE5 S5[5];
STONE6 S6[5];
//char str[20];
char buffer[256]; //接受键盘输入用的缓冲区
int g=2; //重力加速度设为15
//int i0=1,i1=1,i2=1,vy; //用于控制贴跑跳图时产生的连续效果
int x=0;//用于贴START QUIT 的坐标
int y=250;//帖第一屏时Y的初值
int y1=110;//帖第二屏时Y的初值
int p_what=1;//选择贴第几个屏幕
int player=1;//单打或是双打
bool fast=false;//一开始速度为慢各种石头都有
bool slow=true;
bool sto2=true;
bool sto3=true;
bool sto5=true;
int ge=0;
//int canshu=4;//用于调节速度
void canvasFrame::generate_1()//什么石头都有
{
int i;
if(ge!=0)
{
switch(rand()%10)
{
case 0:
case 1:
case 2:
case 3:
for(i=0;i<10;i++)
{
if(!S1[i].exist)
{
S1[i].generate();
break;
}
}
break;
case 4:
case 5:
for(i=0;i<5;i++)
{
if(!S2[i].exist)
{
S2[i].generate();
break;
}
}
break;
case 6:
for(i=0;i<5;i++)
{
if(!S3[i].exist)
{
S3[i].generate();
break;
}
}
break;
case 7:
for(i=0;i<5;i++)
{
if(!S4[i].exist)
{
S4[i].generate();
break;
}
}
break;
case 8:
for(i=0;i<5;i++)
{
if(!S5[i].exist)
{
S5[i].generate();
break;
}
}
break;
case 9:
for(i=0;i<5;i++)
{
if(!S6[i].exist)
{
S6[i].generate();
break;
}
}
break;
}
}
ge=1;
}
void canvasFrame::generate_2()//没有翻滚石
{
int i;
if(ge!=0)
{
switch(rand()%10)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
for(i=0;i<10;i++)
{
if(!S1[i].exist)
{
S1[i].generate();
break;
}
}
break;
case 6:
for(i=0;i<5;i++)
{
if(!S3[i].exist)
{
S3[i].generate();
break;
}
}
break;
case 7:
for(i=0;i<5;i++)
{
if(!S4[i].exist)
{
S4[i].generate();
break;
}
}
break;
case 8:
for(i=0;i<5;i++)
{
if(!S5[i].exist)
{
S5[i].generate();
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -