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

📄 canvasframe.cpp

📁 用C++实现的名为下楼小游戏
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// 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 + -