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