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

📄 mainfrm.cpp

📁 Windows CE 下Kill 游戏的源代码。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "Kill.h"

#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//定义窗体
#define SCREENHEIGHT 480
#define SCREENWIDTH 640
//定义怪物
#define MON_SCREENRIGHT  442
#define MON_SCREENLEFT  10
#define MON_STEP  15
#define MON_WIDTH  98
#define MON_HEIGHT  120
//定义飞猪
#define PIG_HEIGHT  120
#define PIG_WIDTH  120
#define PIG_TOP  360
#define PIG_STEP 20
#define PIG_LEFT 0
#define PIG_RIGHT 420
#define PIG_BOOM_POINT_LEFT 38
#define PIG_BOOM_POINT_TOP 57
#define PIG_BOOM_POINT_WIDTH 56
#define PIG_BOOM_POINT_HEIGHT 33
//定义食物通用宏
//定义食物1
#define FOOD1_HEIGHT 40
#define FOOD1_WIDTH 40
#define FOOD1_BOOM_POINT_X1 13
#define FOOD1_BOOM_POINT_Y1 38
#define FOOD1_BOOM_POINT_X2 27
#define FOOD1_BOOM_POINT_Y2 38
#define FOOD1_BOOM_POINT_X3 9
#define FOOD1_BOOM_POINT_Y3 12
#define FOOD1_BOOM_POINT_X4 30
#define FOOD1_BOOM_POINT_Y4 12
//定义食物2
#define FOOD2_HEIGHT 74
#define FOOD2_WIDTH 40
#define FOOD2_BOOM_POINT_X1 20
#define FOOD2_BOOM_POINT_Y1 70
#define FOOD2_BOOM_POINT_X2 5
#define FOOD2_BOOM_POINT_Y2 58
#define FOOD2_BOOM_POINT_X3 35
#define FOOD2_BOOM_POINT_Y3 58
#define FOOD2_BOOM_POINT_X4 20
#define FOOD2_BOOM_POINT_Y4 42
//定义食物3
#define FOOD3_WIDTH 40
#define FOOD3_HEIGHT 52
#define FOOD3_BOOM_POINT_X1 20
#define FOOD3_BOOM_POINT_Y1 37
#define FOOD3_BOOM_POINT_X2 7
#define FOOD3_BOOM_POINT_Y2 25
#define FOOD3_BOOM_POINT_X3 35
#define FOOD3_BOOM_POINT_Y3 27
#define FOOD3_BOOM_POINT_X4 22
#define FOOD3_BOOM_POINT_Y4 17
//定义食物4
#define FOOD4_WIDTH 40
#define FOOD4_HEIGHT 40
#define FOOD4_BOOM_POINT_X1 7
#define FOOD4_BOOM_POINT_Y1 32
#define FOOD4_BOOM_POINT_X2 30
#define FOOD4_BOOM_POINT_Y2 32
#define FOOD4_BOOM_POINT_X3 30
#define FOOD4_BOOM_POINT_Y3 8
#define FOOD4_BOOM_POINT_X4 7
#define FOOD4_BOOM_POINT_Y4 9
//定义食物5
#define FOOD5_WIDTH 40
#define FOOD5_HEIGHT 50
#define FOOD5_BOOM_POINT_X1 12
#define FOOD5_BOOM_POINT_Y1 40
#define FOOD5_BOOM_POINT_X2 32
#define FOOD5_BOOM_POINT_Y2 40
#define FOOD5_BOOM_POINT_X3 32
#define FOOD5_BOOM_POINT_Y3 9
#define FOOD5_BOOM_POINT_X4 12
#define FOOD5_BOOM_POINT_Y4 9
//定义血
#define BLOOD_WIDTH 8
#define BLOOD_HEIGHT 350
#define BLOOD_LEFT 600
//定义爆炸图
#define BOOM_WIDTH 64
#define BOOM_HEIGHT 64
//定义结束
#define OVER_TOP 100
#define OVER_WIDTH 640
#define OVER_HEIGHT 150
//定义心脏
#define HEART_WIDTH 40
#define HEART_HEIGHT 40
/////////////////////////////////////////////////////////////////////////
//声明各个结构体
#define ZONE_ERROR  1
#define ZONE_TEMP   1
struct _TFourCC
{
	char	name[4];
	int operator ==(_TFourCC other )
	{
		return (*(unsigned long UNALIGNED *)this) == (*(unsigned long UNALIGNED *)&other);
	}
	int operator !=(_TFourCC other )
	{
		return !((*this)==(other));
	}
};
typedef struct _TFourCC TFourCC;


struct SRiffHeader
{
	TFourCC	RiffCC;
	unsigned long remainingBytes;
};

struct SWaveHeader
{
	TFourCC	WaveCC;
	TFourCC	FmtCC;
	unsigned long ckSize;
	PCMWAVEFORMAT pcmwf;
};

struct SMiscHeader
{
	TFourCC MiscCC;
	unsigned long ckSize;
};

struct SDataHeader
{
	TFourCC DataCC;
	unsigned long dataSize;
	unsigned char data;
};
struct mon          //怪物
{
	int x;          //贴图的 X 坐标
	int post;          //方向
	int state;      //贴图位置
};
struct pig          //飞猪
{
	int x;          //X坐标
	int y;          //Y坐标
	int post;       //方向
	int state;      //贴图位置
	CRect r;        //碰撞点
};
struct blood        //血
{
	int helth;      //血的数量
	int y;          //骷髅位置
	int state;      //贴图位置
	int hstate;     //心脏贴图位置
};
struct foods          //食物
{
	POINT p[4];     //碰撞点
	int x;          //X坐标
	int y;          //Y坐标
	int type;       //食物种类
	int speed;      //下落速度
	BOOL exist;     //是否显示
	int state;      //贴图位置
};
TFourCC riffCC = { 'R', 'I', 'F', 'F'  };
TFourCC dataCC = { 'd', 'a', 't', 'a'  };
TFourCC waveCC = { 'W', 'A', 'V', 'E'  };
TFourCC fmtCC  = { 'f', 'm', 't', ' '  };
#define NELEMS(a) (sizeof(a)/sizeof((a)[0]))
////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
LPDIRECTDRAW4               g_pDD = NULL;        // DirectDraw object
LPDIRECTDRAWSURFACE4        g_pDDSPrimary = NULL;// DirectDraw primary surface
LPDIRECTDRAWSURFACE4        g_pDDSBack = NULL;   // DirectDraw back surface
LPDIRECTDRAWSURFACE4        g_pDDSOne[13];    // Offscreen surface 13
DDCOLORKEY                  key;
DDSURFACEDESC2              ddsd;
DDSCAPS2                    ddscaps;
HRESULT                     hRet;
LPDIRECTDRAW                pDD;
int i,j;
mon mon;//怪物
pig pig;//飞猪
foods food[30];//食物
int fcount;//食物计数
blood blood;//血
int source;//分数
int level;//难度
int oldlevel;
//
// Global data - for simplicity
//
SCODE sc;
LPDIRECTSOUND pDS=0;
LPDIRECTSOUNDBUFFER pDSB=0;
LPDIRECTSOUNDBUFFER pSBuf[4];  //声明次缓冲区
SWaveHeader UNALIGNED *pWaveHeader=0;
SMiscHeader UNALIGNED *pMiscHeader=0;
SDataHeader UNALIGNED *pDataHeader=0;
DSBUFFERDESC dsbdesc={0};
SRiffHeader  riffHeader={0};
unsigned char *bufferPtr=0, *fileBuffer=0;
unsigned char *dataPtr1=0, *dataPtr2=0;
unsigned long count1=0, count2=0;
unsigned long dsStatus=0;
BYTE * pBuffer=NULL;
int nLoops=0;
HRESULT result;                   //声明HRESULT类型变量
///////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_WM_KEYUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


CMainFrame::CMainFrame()
{

	//创建新窗体
	Create(NULL,_T("抢食专家"),WS_POPUP);
	MoveWindow(0,0,SCREENWIDTH,SCREENHEIGHT);
	//载入图片
    LoadBitmap();
	//设掩码
	ColorKey(1);
	ColorKey(2);
	ColorKey(3);
	ColorKey(4);
	ColorKey(5);
	ColorKey(6);
	ColorKey(7);
	ColorKey(8);
	ColorKey(10);
	ColorKey(11);
	ColorKey(12);
	//怪物位置
	mon.state=0;
	mon.x=10;
	mon.post=0;

	//血的大小
	blood.helth =350;
	blood.state = 0;
	blood.y = 30;
	//纪录
	source = 0;
	level=oldlevel=0;
	//开启时间计数棋
	LoadSound();
	SetTimer(1,100,NULL);
	pSBuf[0]->Play(0,0,1);
}

CMainFrame::~CMainFrame()
{
    if (pDSB)
    {
        pDSB->Release();
        pDSB = NULL;
    }

    if (pDS)
    {
        pDS->Release();
        pDS = NULL;
    }

    if (fileBuffer)
    {
        LocalFree(fileBuffer);
        fileBuffer = NULL;
    }
	int i;
	for(i=0;i<=4;i++)
	{
		if(pSBuf[i])
		{
			pSBuf[i]->Release();
			pSBuf[i]=NULL;
		}
	}
    if (g_pDDSBack) 
	{
        g_pDDSBack->Release();
        g_pDDSBack = NULL;
    }

    if (g_pDDSPrimary) 
	{
        g_pDDSPrimary->Release();
        g_pDDSPrimary = NULL;
    }

    if (g_pDD) 
	{
        g_pDD->Release();
        g_pDD = NULL;
    }
	for(i=0;i<=12;i++)
	{
		if(g_pDDSOne[i])
		{
			g_pDDSOne[i]->Release();
			g_pDDSOne[i] = NULL;
		}
	}
}

//初始化
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	//建立DirectDraw
	CreateDirectDraw();
	//建立DirectSound
	CreateDirectShoud();
	return 0;
}
//时间回调函数
void CMainFrame::OnTimer(UINT nIDEvent) 
{
	if(nIDEvent == 1)
	{
	    //画背景
        g_pDDSBack->BltFast( 0 , 0 , g_pDDSOne[0], CRect(0,0,SCREENWIDTH,SCREENHEIGHT) , DDBLTFAST_WAIT);
        //怪物移动
        MonMove();
	    //怪物仍东西
        CreateFood();
	    //画食物
        FoodMove();
	    //画猪
        PigMove();
	    //飞猪吃食物
        EatFood();
        //显示血
        Blood();
	    //写纪录
		CString str;
		str.Format(_T("分数:%d 难度:%d"),source,level);
		g_pDDSBack->GetDC( &hdc );           
		::ExtTextOut(hdc,0,0,ETO_CLIPPED,NULL,str,lstrlen(str),NULL);
		g_pDDSBack->ReleaseDC( hdc);
        //输出到屏幕
	    g_pDDSPrimary->Flip( NULL , DDFLIP_WAIT );
	}
	    CFrameWnd::OnTimer(nIDEvent);
}

void CMainFrame::MonMove()
{
	
	if(mon.state >= 8)
	{
		mon.state = 0;
	}
	//判断方向
	if(mon.x>=MON_SCREENRIGHT)
	{
		mon.post = 1;
	}
	if(mon.x<=MON_SCREENLEFT)
	{
		mon.post = 0;
	}
	if(mon.post == 0)
	{
		mon.x+=MON_STEP;
	}
	if(mon.post == 1)
	{
		mon.x-=MON_STEP;
	}
    //画怪物到内存
	g_pDDSBack->BltFast(mon.x,0, g_pDDSOne[1],CRect(mon.state*MON_WIDTH,0,mon.state*MON_WIDTH+MON_WIDTH,MON_HEIGHT) , DDBLTFAST_WAIT |DDBLTFAST_SRCCOLORKEY);
	mon.state++;
}

void CMainFrame::PigMove()
{
	if(pig.state >= 8)
	{
		pig.state = 0;
	}

	//画猪到内存
	if(pig.post == 1)
	{
        g_pDDSBack->BltFast( pig.x , PIG_TOP , g_pDDSOne[2], CRect(pig.state*PIG_WIDTH,0,pig.state*PIG_WIDTH+PIG_WIDTH,PIG_HEIGHT) ,DDBLTFAST_WAIT |DDBLTFAST_SRCCOLORKEY);
	}
	else
	{
	    g_pDDSBack->BltFast( pig.x , PIG_TOP , g_pDDSOne[3], CRect(pig.state*PIG_WIDTH,0,pig.state*PIG_WIDTH+PIG_WIDTH,PIG_HEIGHT) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
	}
	    pig.state++;
}

void CMainFrame::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if(nChar == VK_LEFT)
	{
		if(pig.x <= PIG_LEFT)
		{
			pig.x = PIG_LEFT;
		}
		else
		{
		    pig.x-= PIG_STEP;
		}
		//设置碰撞点
		pig.r.left = pig.x + PIG_BOOM_POINT_LEFT;
		pig.r.right = pig.r.left + PIG_BOOM_POINT_WIDTH;
		pig.r.top = PIG_TOP + PIG_BOOM_POINT_TOP;
		pig.r.bottom = pig.r.top + PIG_BOOM_POINT_HEIGHT;

		pig.post = 0;
	}
	if(nChar == VK_RIGHT)
	{
		if(pig.x>=PIG_RIGHT)
		{
			pig.x = PIG_RIGHT;
		}
		else
		{
		    pig.x+=PIG_STEP;
		}
	    //设置碰撞点
		pig.r.left = pig.x + PIG_BOOM_POINT_LEFT;
		pig.r.right = pig.r.left + PIG_BOOM_POINT_WIDTH;
		pig.r.top = PIG_TOP + PIG_BOOM_POINT_TOP;
		pig.r.bottom = pig.r.top + PIG_BOOM_POINT_HEIGHT;

		pig.post = 1;
	}
	//退出游戏
	if(nChar == VK_ESCAPE)
	{
		PostMessage(WM_CLOSE);
	}	
	CFrameWnd::OnKeyUp(nChar, nRepCnt, nFlags);
}

void CMainFrame::FoodMove()
{

	for(i=0;i<30;i++)
	{
		if(food[i].exist)
		{
			switch(food[i].type)
			{
			case 0:                     //食物1
				//画图
				if(food[i].state>=8)
				{
					food[i].state = 0;
				}

				food[i].y+=food[i].speed;
				
				g_pDDSBack->BltFast( food[i].x, food[i].y, g_pDDSOne[4], CRect(food[i].state*FOOD1_WIDTH,0,food[i].state*FOOD1_WIDTH+FOOD1_WIDTH,FOOD1_HEIGHT) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
                food[i].state++;

				food[i].p[0].x = food[i].x+FOOD1_BOOM_POINT_X1;
				food[i].p[0].y = food[i].y+FOOD1_BOOM_POINT_Y1;
				food[i].p[1].x = food[i].x+FOOD1_BOOM_POINT_X2;
				food[i].p[1].y = food[i].y+FOOD1_BOOM_POINT_Y2;
				food[i].p[2].x = food[i].x+FOOD1_BOOM_POINT_X3;
				food[i].p[2].y = food[i].y+FOOD1_BOOM_POINT_Y3;
				food[i].p[3].x = food[i].x+FOOD1_BOOM_POINT_X4;
				food[i].p[3].y = food[i].y+FOOD1_BOOM_POINT_Y4;
				if(food[i].y>=SCREENHEIGHT)
				{
					food[i].exist = FALSE;
					blood.helth-=30;
					fcount--;
				}
				break;
			case 1:                    //食物2
				//画图
				if(food[i].state>=4)
				{
					food[i].state = 0;
				}
				food[i].y+=food[i].speed;

				g_pDDSBack->BltFast( food[i].x, food[i].y, g_pDDSOne[5], 
					                 CRect(food[i].state*FOOD2_WIDTH,0
									 ,food[i].state*FOOD2_WIDTH+FOOD2_WIDTH,FOOD2_HEIGHT) 
									 , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
				food[i].state++;

				food[i].p[0].x = food[i].x+FOOD2_BOOM_POINT_X1;
				food[i].p[0].y = food[i].y+FOOD2_BOOM_POINT_Y1;
				food[i].p[1].x = food[i].x+FOOD2_BOOM_POINT_X2;
				food[i].p[1].y = food[i].y+FOOD2_BOOM_POINT_Y2;
				food[i].p[2].x = food[i].x+FOOD2_BOOM_POINT_X3;
				food[i].p[2].y = food[i].y+FOOD2_BOOM_POINT_Y3;
				food[i].p[3].x = food[i].x+FOOD2_BOOM_POINT_X4;
				food[i].p[3].y = food[i].y+FOOD2_BOOM_POINT_Y4;
				if(food[i].y>=SCREENHEIGHT)
				{
					food[i].exist = FALSE;
					blood.helth-=30;
					fcount--;
				}
				break;
			case 2:                   //食物3
				//画图
				if(food[i].state>=3)
				{
					food[i].state = 0;
				}
				food[i].y+=food[i].speed;

				g_pDDSBack->BltFast( food[i].x, food[i].y, g_pDDSOne[6], 
					        CRect(food[i].state*FOOD3_WIDTH,0,
							food[i].state*FOOD3_WIDTH+FOOD3_WIDTH,FOOD3_HEIGHT) ,
							DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
				food[i].state++;

				food[i].p[0].x = food[i].x+FOOD3_BOOM_POINT_X1;
				food[i].p[0].y = food[i].y+FOOD3_BOOM_POINT_Y1;
				food[i].p[1].x = food[i].x+FOOD3_BOOM_POINT_X2;
				food[i].p[1].y = food[i].y+FOOD3_BOOM_POINT_Y2;
				food[i].p[2].x = food[i].x+FOOD3_BOOM_POINT_X3;
				food[i].p[2].y = food[i].y+FOOD3_BOOM_POINT_Y3;
				food[i].p[3].x = food[i].x+FOOD3_BOOM_POINT_X4;
				food[i].p[3].y = food[i].y+FOOD3_BOOM_POINT_Y4;
				if(food[i].y>=SCREENHEIGHT)

⌨️ 快捷键说明

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