📄 manview.cpp
字号:
// 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 + -