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

📄 manview.cpp

📁 c++写的游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// manView.cpp : implementation of the CManView class
//

#include "stdafx.h"
#include "man.h"

#include "manDoc.h"
#include "manView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CManView


IMPLEMENT_DYNCREATE(CManView, CView)

BEGIN_MESSAGE_MAP(CManView, CView)
	//{{AFX_MSG_MAP(CManView)
	ON_WM_TIMER()
	ON_COMMAND(ID_killtimer, Onkilltimer)
	ON_COMMAND(ID_start, Onstart)
	ON_COMMAND(ID_speedup, Onspeedup)
	ON_COMMAND(ID_lowdown, Onlowdown)
	ON_WM_KEYDOWN()
	ON_WM_KEYUP()
	ON_COMMAND(ID_restart, Onrestart)
	ON_WM_LBUTTONDOWN()
	ON_COMMAND(ID_Middle, OnMiddle)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CManView construction/destruction

CManView::CManView()
{
	// TODO: add construction code here
	pler=new Player();
	srand( (unsigned)time( NULL ) );
	tag=0;
	speed=MIDDLE/13;
	rect.bottom=480;
	rect.top=0;
	rect.left=0;
	rect.right=640;
	for(int i=7,y=352;i>0;i--,y=y-48)
	{
		int x=rand()%288+40;
		int secu=rand()%6;
		switch(secu)
		{
		case 0:bfl[i]=new Buffle(x,y,pler);break;
		case 1:bfl[i]=new Skate(x,y,pler);break;
		case 2:bfl[i]=new Spring(x,y,pler);break;
		case 3:bfl[i]=new Nailboard(x,y,pler);break;
		case 4:bfl[i]=new Roll_left(x,y,pler);break;
		case 5:bfl[i]=new Roll_right(x,y,pler);break;
		}
	}
	bfl[0]=new Buffle(130,400,pler);

	nIdbforpfr[0]=IDB_br;
	nIdbforpfr[1]=IDB_r;
	nIdbforpfr[2]=IDB_rr;
	nIdbforpfr[3]=IDB_rf4;
	nIdbforpfl[0]=IDB_bl;
	nIdbforpfl[1]=IDB_leftmiddle;
	nIdbforpfl[2]=IDB_ll;
	nIdbforpfl[3]=IDB_lf4;
	nIdbforbound[0]=IDB_ldown;
	nIdbforbound[1]=IDB_mdown;
	nIdbforbound[2]=IDB_udown;	
	nIdbforbound[3]=IDB_mdown;

	idbforboundl[0]=IDB_leftdown;
	idbforboundl[1]=IDB_lldown;
	idbforboundl[2]=IDB_leftdown;
	idbforboundl[3]=IDB_ludown;

	idbforboundr[0]=IDB_rightdown;
	idbforboundr[1]=IDB_rldown;
	idbforboundr[2]=IDB_rightdown;
	idbforboundr[3]=IDB_uprdown;

	nIdbforredfl[0]=IDB_redlm;
	nIdbforredfl[1]=IDB_redll;
	nIdbforredfl[2]=IDB_redlm;
	nIdbforredfl[3]=IDB_redlb;

	nIdbforredfr[0]=IDB_redrm;
	nIdbforredfr[1]=IDB_redrr;
	nIdbforredfr[2]=IDB_redrm;
	nIdbforredfr[3]=IDB_redrb;

	nIdbforreddownl[0]=IDB_redfordownlm;
	nIdbforreddownl[1]=IDB_redfordownlu;
	nIdbforreddownl[2]=IDB_redfordownlm;
	nIdbforreddownl[3]=IDB_redfordownll;

	nIdbforreddownr[0]=IDB_redfordownr;
	nIdbforreddownr[1]=IDB_redfordownru;
	nIdbforreddownr[2]=IDB_redfordownr;
	nIdbforreddownr[3]=IDB_redfordownrl;

	nIdbforreddownm[0]=IDB_redfordownmm;
	nIdbforreddownm[1]=IDB_redfordownmu;
	nIdbforreddownm[2]=IDB_redfordownmm;
	nIdbforreddownm[3]=IDB_redfordownml;
	flex=8; 
	record_highest=0;
	state=ACTIVE;
	delay=2;
	m_y=66;
	m_yw=66;
}

CManView::~CManView()
{
	delete pler;
	for(int j=0;j<8;j++)
		delete bfl[j];
	mciSendCommand(MCI_ALL_DEVICE_ID,MCI_CLOSE,1,NULL);
}

BOOL CManView::PreCreateWindow(CREATESTRUCT& cs)
{
//	cs.lpszClass=::AfxRegisterWndClass(CS_CLASSDC ,  0,  (HBRUSH)::GetStockObject(BLACK_BRUSH) ,0);
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CManView drawing
UINT CManView::music(char* sound)
{
	mciOpenParms.lpstrElementName=TEXT(sound);
	mciSendCommand(0,MCI_OPEN,MCI_WAIT|MCI_OPEN_ELEMENT,
	(DWORD)(LPMCI_OPEN_PARMS)&mciOpenParms);		
	UINT m_wDeviceID=mciOpenParms.wDeviceID;
	mciPlayParms.dwCallback=(DWORD)GetSafeHwnd();
	mciPlayParms.dwFrom=0;
	mciPlayParms.dwTo=0;
    mciSendCommand(m_wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPMCI_OPEN_PARMS)&mciPlayParms);
	return m_wDeviceID;
}
void transparence(int x,int y,CDC* pDC,UINT id)					//贴透明的图
{
	COLORREF crOldBack=pDC->SetBkColor(RGB(255,255,255));
	COLORREF crOldText=pDC->SetTextColor(RGB(0,0,0));
	CDC dcImage, dcMask;
	CBitmap bmp; 	
	bmp.LoadBitmap(id);
	BITMAP bm;bmp.GetBitmap(&bm);
	int nWidth=bm.bmWidth,nHeight=bm.bmHeight;
	dcImage.CreateCompatibleDC(pDC);
	dcMask.CreateCompatibleDC(pDC);
	CBitmap* pOldBitmapImage=dcImage.SelectObject(&bmp);
	CBitmap bitmapMask;
	bitmapMask.CreateBitmap(nWidth, nHeight, 1, 1, NULL);
	CBitmap* pOldBitmapMask=dcMask.SelectObject(&bitmapMask);
	dcImage.SetBkColor(RGB(0,0,0));	
	dcMask.BitBlt(0, 0, nWidth, nHeight, &dcImage,0,0,SRCCOPY);
	pDC->BitBlt(x, y, nWidth, nHeight, &dcImage,0,0,SRCINVERT);
	pDC->BitBlt(x, y, nWidth, nHeight, &dcMask,0,0,SRCAND);
	pDC->BitBlt(x, y,nWidth,nHeight,&dcImage,0,0,SRCINVERT);
	dcImage.SelectObject(pOldBitmapImage);
	dcMask.SelectObject(pOldBitmapMask);
	pDC->SetBkColor(crOldBack);
	pDC->SetTextColor(crOldText);
}
void stick(int x,int y,CDC* mdc,UINT id)				//贴图
{
	CDC dcImage;
	CBitmap bmp; 	
	bmp.LoadBitmap(id);
	BITMAP bm;bmp.GetBitmap(&bm);
	int nWidth=bm.bmWidth,nHeight=bm.bmHeight;
	dcImage.CreateCompatibleDC(mdc);
	CBitmap* pOldBitmapImage=dcImage.SelectObject(&bmp);
	mdc->BitBlt(x, y, nWidth, nHeight, &dcImage,0,0,SRCCOPY);
	dcImage.SelectObject(pOldBitmapImage);
}
void CManView::OnDraw(CDC* pDC)
{
	CManDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CDC mDC;				//缓冲
	CBitmap *OldBitmap;
	CBitmap mBitmap;
	BITMAP mBitmapInfo;
	mDC.CreateCompatibleDC(pDC);
	mBitmap.LoadBitmap(IDB_BACK);	//全局背景图
	mBitmap.GetBitmap(&mBitmapInfo);		
	OldBitmap=mDC.SelectObject(&mBitmap);
	if(tag==0)
	{	
		SetTimer(ID_time,19,NULL);		//游戏开始
	}
	else
	{
		if(delay==0)
		{
			decre_y(speed);
		}
		stick(40,m_y,&mDC,IDB_mobile);	//移动背景
		if(m_y<66)
			stick(40,m_y+352,&mDC,IDB_mobile);
		else
			stick(40,m_y-352,&mDC,IDB_mobile);
		
		stick(24,m_yw,&mDC,IDB_wall);
		stick(426,m_yw,&mDC,IDB_wall);
		if(m_yw<66)
		{
			stick(24,m_yw+352,&mDC,IDB_wall);
			stick(426,m_yw+352,&mDC,IDB_wall);
		}
		else
		{
			stick(24,m_yw-352,&mDC,IDB_wall);
			stick(426,m_yw-352,&mDC,IDB_wall);
		}
		
		for(int i=0;i<=7;i++)
		{
			if(bfl[i]->Buffle::get_y()==47)	//销毁溢出板块,并重建
			{
				delete bfl[i];
				int x=rand()%288+40;
				int secu=rand()%6;
				switch(secu)
				{
				case 0:bfl[i]=new Buffle(x,431,pler);break;
				case 1:bfl[i]=new Skate(x,431,pler);break;
				case 2:bfl[i]=new Spring(x,431,pler);break;
				case 3:bfl[i]=new Nailboard(x,431,pler);break;
				case 4:bfl[i]=new Roll_left(x,431,pler);break;
				case 5:bfl[i]=new Roll_right(x,431,pler);break;
				}
			}
			if(bfl[i]->getProcess()>0)			//控制可变板块的变化
			{
				bfl[i]->decre_delay();
				if(bfl[i]->getDelay()==0)
				{
					bfl[i]->setDelay();
					bfl[i]->decreProcess();
				}
			}			
			transparence(bfl[i]->get_x(),bfl[i]->get_y(),&mDC,bfl[i]->getImage(bfl[i]->getProcess()));	
		}
		transparence(40,64,&mDC,IDB_teeth);	//天花齿钉
		
		if(pler->get_y()==66||pler->get_y()==418)	//撞天花齿钉或跌出画面
		{
			
			if(pler->get_y()==66)		//撞天花齿钉
			{
				pler->decre_life();
				if(pler->IsLife_left())
				{	
					pler->setState(DECLINE);
					if(bfl[0]->m_wDeviceID)
					{
						mciSendCommand(bfl[0]->m_wDeviceID,MCI_CLOSE,1,NULL);
						bfl[0]->m_wDeviceID=music("nail.wav");
					}
					else
					{
						bfl[0]->m_wDeviceID=music("nail.wav");
					}
					for(i=0;i<=2;i++)
					{
						pler->mov_y(-1);
						for(int j=0,k=0;j<=7;j++)
							if(bfl[j]->isIn_x(pler->get_x())&&bfl[j]->isEqu_y(pler->get_y()))
							{
								k=1;
								break;
							}
							
							if(k==1)
								break;
					}
					pler->set_inertia(COMMON);
				}
				else
				{					
					pler->setState(DECLINE);					
				}
			}
			else		//跌出画面
			{
				
				state=DEAD;
				func_infor(&mDC);
				pDC->BitBlt(0,0,mBitmapInfo.bmWidth,mBitmapInfo.bmHeight,&mDC,0,0,SRCCOPY);
				mDC.SelectObject(OldBitmap);
				return;
			}
		}
		else						//正常情况
		{
			for(i=0;i<=7;i++)		//检查player是否在板上
			{
				if(bfl[i]->isIn_x(pler->get_x())&&bfl[i]->isEqu_y(pler->get_y()))
				{
					int reg=i-pler->getAssist();//准备计算积分
					if(reg<0)
						reg+=8;
					pler->setAssist(i);
					bfl[i]->when_landing(reg,GetSafeHwnd());//板上处理
					break;//********************************************
				}
			}			
			if(i>7)								//板外
			{
				if(pler->getState()!=BOUNCE&&pler->getState()!=DECLINE)	//是否弹跳中或被天花推落中
				{
				 	pler->setState(FALLING);
				}
				pler->decre_inertia();		//减少惯性系数
				if(!pler->IsInertia_left())				//惯性是否用完
				{	
					if(pler->getState()==BOUNCE)//将弹跳变成下跌
					{
						pler->setState(FALLING);
						pler->set_inertia(COMMON);//延迟下跌
					}
			
					if(!pler->IsInertia_left())
					{
						for(i=0;i<=10;i++)			//加速下跌并检查是否落在板上
						{
							for(int j=0,k=0;j<=7;j++)
								if(bfl[j]->isIn_x(pler->get_x())&&bfl[j]->isEqu_y(pler->get_y()))
								{
									k=1;
									break;
								}
								
								if(k==1)
									break;
								pler->mov_y(-1);
								if(pler->get_y()==418)
								{							
									state=DEAD;
									func_infor(&mDC);
									pDC->BitBlt(0,0,mBitmapInfo.bmWidth,mBitmapInfo.bmHeight,&mDC,0,0,SRCCOPY);
									mDC.SelectObject(OldBitmap);						
									return;
								}
						}
					}
				}
			}
		}
		
		switch(pler->getState())//根据之前计算好的状态数据贴图
		{
		case SKATING://下滑
		case SAFE:	//安全板上			
			switch(pler->getDirect())
			{
			case MID:
				transparence(pler->get_x(),pler->get_y(),&mDC,IDB_player);
				break;
			case RIGHT:
				pler->mov_x(5);
				transparence(pler->get_x(),pler->get_y(),&mDC,nIdbforpfr[pler->getProcess()]);
				break;
			case LEFT:
				pler->mov_x(-5);
				transparence(pler->get_x(),pler->get_y(),&mDC,nIdbforpfl[pler->getProcess()]);
				break;					
			} 		
			break;
			
		case FALLING:			//下跌
			for(i=0;i<=3;i++)
			{				
				for(int j=0,k=0;j<=7;j++)
				if(bfl[j]->isIn_x(pler->get_x())&&bfl[j]->isEqu_y(pler->get_y()))
				{
					k=1;
					break;
				}	
				if(k==1)
					break;
				pler->mov_y(-1);	
				if(pler->get_y()==418)												
					break;				
			}
			switch(pler->getDirect())

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -