📄 killframe.cpp
字号:
// KillFrame.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "KillFrame.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
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; //贴图位置
};
struct foods //食物
{
POINT p[4]; //碰撞点
int x; //X坐标
int y; //Y坐标
int type; //食物种类
int speed; //下落速度
BOOL exist; //是否显示
int state; //贴图位置
};
/////////////////////////////////////////////////////////////////////////////
// CKillFrame
IMPLEMENT_DYNCREATE(CKillFrame, CFrameWnd)
int i,j;
mon mon;//怪物
pig pig;//飞猪
foods food[20];//食物
int fcount;//食物计数
blood blood;//血
int source;
CKillFrame::CKillFrame()
{
//创建新窗体
Create(NULL,"抢食专家",WS_POPUP);
MoveWindow(0,0,640,480);
CClientDC dc(this);
//创建DC
mdc = new CDC;
mdc1 = new CDC;
mdc->CreateCompatibleDC(&dc);
mdc1->CreateCompatibleDC(&dc);
//加载背景图片
m_back = new CBitmap;
m_back->LoadBitmap(IDB_BACK);
//加载怪物图片
m_mon = new CBitmap;
m_monmask = new CBitmap;
m_mon->LoadBitmap(IDB_MON);
m_monmask->LoadBitmap(IDB_MONM);
//加载飞猪图片
m_pig = new CBitmap;
m_pigmask = new CBitmap;
m_pig->LoadBitmap(IDB_PIG);
m_pigmask->LoadBitmap(IDB_PIGM);
m_pigr = new CBitmap;
m_pigrmask = new CBitmap;
m_pigr->LoadBitmap(IDB_PIGR);
m_pigrmask->LoadBitmap(IDB_PIGRM);
//加载食物1图片
m_food1 = new CBitmap;
m_food1mask = new CBitmap;
m_food1->LoadBitmap(IDB_FOOD1);
m_food1mask->LoadBitmap(IDB_FOOD1M);
//加载食物2图片
m_food2 = new CBitmap;
m_food2mask = new CBitmap;
m_food2->LoadBitmap(IDB_FOOD2);
m_food2mask->LoadBitmap(IDB_FOOD2M);
//加载食物3图片
m_food3 = new CBitmap;
m_food3mask = new CBitmap;
m_food3->LoadBitmap(IDB_FOOD3);
m_food3mask->LoadBitmap(IDB_FOOD3M);
//加载食物4图片
m_food4 = new CBitmap;
m_food4mask = new CBitmap;
m_food4->LoadBitmap(IDB_FOOD4);
m_food4mask->LoadBitmap(IDB_FOOD4M);
//加载食物5图片
m_food5 = new CBitmap;
m_food5mask = new CBitmap;
m_food5->LoadBitmap(IDB_FOOD5);
m_food5mask->LoadBitmap(IDB_FOOD5M);
//加载血图片
m_blood = new CBitmap;
m_blood->LoadBitmap(IDB_BLOOD);
//加载结束图片
m_over = new CBitmap;
m_overmask = new CBitmap;
m_over ->LoadBitmap(IDB_OVER);
m_overmask ->LoadBitmap(IDB_OVERM);
//处理内存区
m_temp = new CBitmap;
m_temp->CreateCompatibleBitmap(&dc,640,480);
//怪物位置
mon.state=0;
mon.x=10;
mon.post=0;
mdc->SelectObject(m_temp);
//血的大小
blood.helth =350;
blood.state = 0;
blood.y = 30;
//纪录
source = 0;
}
//清空内存
CKillFrame::~CKillFrame()
{
delete mdc;
delete mdc1;
delete m_back;
delete m_temp;
delete m_mon;
delete m_monmask;
delete m_pig;
delete m_pigmask;
delete m_pigr;
delete m_pigrmask;
delete m_food1;
delete m_food1mask;
delete m_food2;
delete m_food2mask;
delete m_food3;
delete m_food3mask;
delete m_food4;
delete m_food4mask;
delete m_food5;
delete m_food5mask;
delete m_blood;
delete m_over;
delete m_overmask;
}
BEGIN_MESSAGE_MAP(CKillFrame, CFrameWnd)
//{{AFX_MSG_MAP(CKillFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CKillFrame message handlers
int CKillFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//开启时间计数棋
SetTimer(1,100,NULL);
return 0;
}
//时间回调函数
void CKillFrame::OnTimer(UINT nIDEvent)
{
CClientDC dc(this);
//画背景
mdc1->SelectObject(m_back);
mdc->BitBlt(0,0,640,480,mdc1,0,0,SRCCOPY);
//怪物移动
MonMove();
//怪物仍东西
CreateFood();
//画食物
FoodMove();
//画猪
PigMove();
//飞猪吃食物
EatFood();
//显示血
Blood();
//写纪录
CString str;
str.Format("分数:%d",source);
mdc->TextOut(0,0,str);
//输出到屏幕
dc.BitBlt(0,0,640,480,mdc,0,0,SRCCOPY);
CFrameWnd::OnTimer(nIDEvent);
}
//怪物移动
void CKillFrame::MonMove()
{
if(mon.state >= 8)
{
mon.state = 0;
}
//判断方向
if(mon.x>=442)
{
mon.post = 1;
}
if(mon.x<=10)
{
mon.post = 0;
}
if(mon.post == 0)
{
mon.x+=10;
}
if(mon.post == 1)
{
mon.x-=10;
}
//画怪物到内存
mdc1->SelectObject(m_monmask);
mdc->BitBlt(mon.x,0,98,120,mdc1,mon.state*98,0,SRCAND);
mdc1->SelectObject(m_mon);
mdc->BitBlt(mon.x,0,98,120,mdc1,mon.state*98,0,SRCPAINT);
mon.state++;
}
//画猪
void CKillFrame::PigMove()
{
if(pig.state >= 8)
{
pig.state = 0;
}
//画猪到内存
if(pig.post == 1)
{
mdc1->SelectObject(m_pigmask);
mdc->BitBlt(pig.x,360,120,120,mdc1,pig.state*120,0,SRCAND);
mdc1->SelectObject(m_pig);
mdc->BitBlt(pig.x,360,120,120,mdc1,pig.state*120,0,SRCPAINT);
}
else
{
mdc1->SelectObject(m_pigrmask);
mdc->BitBlt(pig.x,360,120,120,mdc1,pig.state*120,0,SRCAND);
mdc1->SelectObject(m_pigr);
mdc->BitBlt(pig.x,360,120,120,mdc1,pig.state*120,0,SRCPAINT);
}
pig.state++;
}
//飞猪移动
void CKillFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_LEFT)
{
if(pig.x <= 0)
{
pig.x = 0;
}
else
{
pig.x-= 20;
}
//设置碰撞点
pig.r.left = pig.x+38;
pig.r.right = pig.x+94;
pig.r.top = 417;
pig.r.bottom = 450;
pig.post = 0;
}
if(nChar == VK_RIGHT)
{
if(pig.x>=420)
{
pig.x = 420;
}
else
{
pig.x+=20;
}
//设置碰撞点
pig.r.left = pig.x+38;
pig.r.right = pig.x+94;
pig.r.top = 417;
pig.r.bottom = 450;
pig.post = 1;
}
//退出游戏
if(nChar == VK_SPACE)
{
PostMessage(WM_CLOSE);
}
CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
//食物移动
void CKillFrame::FoodMove()
{
for(i=0;i<20;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;
mdc1->SelectObject(m_food1mask);
mdc->BitBlt(food[i].x,food[i].y,40,40,mdc1,food[i].state*40,0,SRCAND);
mdc1->SelectObject(m_food1);
mdc->BitBlt(food[i].x,food[i].y,40,40,mdc1,food[i].state*40,0,SRCPAINT);
food[i].state++;
food[i].p[0].x = food[i].x+13;
food[i].p[0].y = food[i].y+38;
food[i].p[1].x = food[i].x+27;
food[i].p[1].y = food[i].y+38;
food[i].p[2].x = food[i].x+9;
food[i].p[2].y = food[i].y+12;
food[i].p[3].x = food[i].x+30;
food[i].p[3].y = food[i].y+12;
if(food[i].y>=480)
{
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;
mdc1->SelectObject(m_food2mask);
mdc->BitBlt(food[i].x,food[i].y,40,74,mdc1,food[i].state*40,0,SRCAND);
mdc1->SelectObject(m_food2);
mdc->BitBlt(food[i].x,food[i].y,40,74,mdc1,food[i].state*40,0,SRCPAINT);
food[i].state++;
food[i].p[0].x = food[i].x+20;
food[i].p[0].y = food[i].y+70;
food[i].p[1].x = food[i].x+5;
food[i].p[1].y = food[i].y+58;
food[i].p[2].x = food[i].x+35;
food[i].p[2].y = food[i].y+58;
food[i].p[3].x = food[i].x+20;
food[i].p[3].y = food[i].y+42;
if(food[i].y>=480)
{
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;
mdc1->SelectObject(m_food3mask);
mdc->BitBlt(food[i].x,food[i].y,40,52,mdc1,food[i].state*40,0,SRCAND);
mdc1->SelectObject(m_food3);
mdc->BitBlt(food[i].x,food[i].y,40,52,mdc1,food[i].state*40,0,SRCPAINT);
food[i].state++;
food[i].p[0].x = food[i].x+20;
food[i].p[0].y = food[i].y+37;
food[i].p[1].x = food[i].x+7;
food[i].p[1].y = food[i].y+25;
food[i].p[2].x = food[i].x+35;
food[i].p[2].y = food[i].y+27;
food[i].p[3].x = food[i].x+22;
food[i].p[3].y = food[i].y+17;
if(food[i].y>=480)
{
food[i].exist = FALSE;
blood.helth-=30;
fcount--;
}
break;
case 3: //食物4
//画图
if(food[i].state>=7)
{
food[i].state = 0;
}
food[i].y+=food[i].speed;
mdc1->SelectObject(m_food4mask);
mdc->BitBlt(food[i].x,food[i].y,40,40,mdc1,food[i].state*40,0,SRCAND);
mdc1->SelectObject(m_food4);
mdc->BitBlt(food[i].x,food[i].y,40,40,mdc1,food[i].state*40,0,SRCPAINT);
food[i].state++;
food[i].p[0].x = food[i].x+7;
food[i].p[0].y = food[i].y+32;
food[i].p[1].x = food[i].x+30;
food[i].p[1].y = food[i].y+32;
food[i].p[2].x = food[i].x+30;
food[i].p[2].y = food[i].y+8;
food[i].p[3].x = food[i].x+7;
food[i].p[3].y = food[i].y+9;
if(food[i].y>=480)
{
food[i].exist = FALSE;
blood.helth-=10;
fcount--;
}
break;
case 4: //食物5
//画图
if(food[i].state>=2)
{
food[i].state = 0;
}
food[i].y+=food[i].speed;
mdc1->SelectObject(m_food5mask);
mdc->BitBlt(food[i].x,food[i].y,40,50,mdc1,food[i].state*40,0,SRCAND);
mdc1->SelectObject(m_food5);
mdc->BitBlt(food[i].x,food[i].y,40,50,mdc1,food[i].state*40,0,SRCPAINT);
food[i].state++;
food[i].p[0].x = food[i].x+12;
food[i].p[0].y = food[i].y+40;
food[i].p[1].x = food[i].x+32;
food[i].p[1].y = food[i].y+40;
food[i].p[2].x = food[i].x+32;
food[i].p[2].y = food[i].y+9;
food[i].p[3].x = food[i].x+12;
food[i].p[3].y = food[i].y+9;
if(food[i].y>=480)
{
food[i].exist = FALSE;
blood.helth-=10;
fcount--;
}
break;
}
}
}
}
//怪物仍东西
void CKillFrame::CreateFood()
{
switch(rand()%((fcount+3)*10))
{
case 0:
for(i=0;i<20;i++)
{
if(!food[i].exist)
{
food[i].x = mon.x;
food[i].y = 40;
food[i].exist = TRUE;
food[i].type = 0;
food[i].state = 0;
food[i].speed = rand()%7+2;
fcount++;
return;
}
}
case 1:
for(i=0;i<20;i++)
{
if(!food[i].exist)
{
food[i].x = mon.x;
food[i].y = 40;
food[i].exist = TRUE;
food[i].type = 1;
food[i].state = 0;
food[i].speed = rand()%7+2;
fcount++;
return;
}
}
case 2:
for(i=0;i<20;i++)
{
if(!food[i].exist)
{
food[i].x = mon.x;
food[i].y = 40;
food[i].exist = TRUE;
food[i].type = 2;
food[i].state = 0;
food[i].speed = rand()%7+2;
fcount++;
return;
}
}
case 3:
for(i=0;i<20;i++)
{
if(!food[i].exist)
{
food[i].x = mon.x;
food[i].y = 40;
food[i].exist = TRUE;
food[i].type = 3;
food[i].state = 0;
food[i].speed = rand()%7+2;
fcount++;
return;
}
}
case 4:
for(i=0;i<20;i++)
{
if(!food[i].exist)
{
food[i].x = mon.x;
food[i].y = 40;
food[i].exist = TRUE;
food[i].type = 4;
food[i].state = 0;
food[i].speed = rand()%7+2;
fcount++;
return;
}
}
}
}
//显示血
void CKillFrame::Blood()
{
if(blood.state>=4)
{
blood.state = 0;
}
if(blood.helth>350)
{
blood.helth=350;
}
//游戏结束
if(blood.helth<=0)
{
KillTimer(1);
mdc1->SelectObject(m_overmask);
mdc->BitBlt(0,100,640,150,mdc1,0,0,SRCAND);
mdc1->SelectObject(m_over);
mdc->BitBlt(0,100,640,150,mdc1,0,0,SRCPAINT);
}
mdc1->SelectObject(m_blood);
mdc->BitBlt(600,blood.y,8,blood.helth,mdc1,blood.state*8,0,SRCCOPY);
blood.state++;
}
//飞猪吃食物
void CKillFrame::EatFood()
{
for(i=0;i<20;i++)
{
if(food[i].exist)
{
//开始监测碰撞
for(j=0;j<4;j++)
{
if(pig.r.PtInRect(food[i].p[j]))
{
switch(food[i].type)
{
case 0:
source+=1;
blood.helth+=5;
break;
case 1:
source+=2;
blood.helth+=10;
break;
case 2:
source+=5;
blood.helth+=20;
break;
case 3:
source+=10;
blood.helth-=150;
break;
case 4:
source+=5;
blood.helth-=100;
break;
}
food[i].exist = FALSE;
fcount--;
break;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -