// PcmanFrame.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "PcmanFrame.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// PcmanFrame
char buff[20];
IMPLEMENT_DYNCREATE(PcmanFrame, CFrameWnd)
PcmanFrame::PcmanFrame()
{
//建立窗口
CRect rect;
Create(NULL,"PCMAN V1.0",WS_MINIMIZEBOX | WS_SYSMENU | WS_BORDER,CRect(0,0,780+12,500+11));
// Create(NULL,"PCMAN V1.0",WS_MINIMIZEBOX | WS_SYSMENU | WS_BORDER,CRect(0,0,390+12,250+11));
CClientDC dc(this);
int width=dc.GetDeviceCaps(HORZRES);
int height=dc.GetDeviceCaps(VERTRES);
GetWindowRect(&rect);
width=(width-(rect.right -rect.left ))/2;
height=(height-(rect.bottom -rect.top ))/2;
MoveWindow(width,height,(rect.right -rect.left ),(rect.bottom -rect.top),TRUE);
HICON m_hicon;
m_hicon=AfxGetApp()->LoadIcon(IDI_ICON1);
SetIcon(m_hicon,TRUE);
GetClientRect(&rect);
//重置各项参数
ResetGame();
//建立画布
mdc=new CDC;
mdc1=new CDC;
//调入各项位图
bgbmp=new CBitmap;
tempbmp=new CBitmap;
pcbmp=new CBitmap;
beanbmp=new CBitmap;
monsterbmp=new CBitmap;
startbmp=new CBitmap;
endbmp=new CBitmap;
fontbmp=new CBitmap;
successbmp=new CBitmap;
mdc->CreateCompatibleDC(&dc);
mdc1->CreateCompatibleDC(&dc);
tempbmp->CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
pcbmp->m_hObject=(HBITMAP)::LoadImage(NULL,"bmp/pcman.bmp",IMAGE_BITMAP,243,63,LR_LOADFROMFILE);
bgbmp->m_hObject=(HBITMAP)::LoadImage(NULL,"bmp/bground.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);
beanbmp->m_hObject=(HBITMAP)::LoadImage(NULL,"bmp/bean.bmp",IMAGE_BITMAP,16,16,LR_LOADFROMFILE);
monsterbmp->m_hObject=(HBITMAP)::LoadImage(NULL,"bmp/monster.bmp",IMAGE_BITMAP,83,63,LR_LOADFROMFILE);
startbmp->m_hObject=(HBITMAP)::LoadImage(NULL,"bmp/start.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);
endbmp->m_hObject=(HBITMAP)::LoadImage(NULL,"bmp/end.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);
successbmp->m_hObject=(HBITMAP)::LoadImage(NULL,"bmp/success.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);
fontbmp->m_hObject=(HBITMAP)::LoadImage(NULL,"bmp/font.bmp",IMAGE_BITMAP,270,90,LR_LOADFROMFILE);
//将背景图中的各点像素颜色值保存
bgbmp->GetObject(sizeof(BITMAP),&bm);
bg=new unsigned char[bm.bmHeight*bm.bmWidthBytes];
bgbmp->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,bg);
mdc->SelectObject(tempbmp);
start=FALSE;end=FALSE;
SetTimer(2,500,NULL);
}
PcmanFrame::~PcmanFrame()
{
delete mdc;
delete mdc1;
delete tempbmp;
delete pcbmp;
delete bgbmp;
delete beanbmp;
delete monsterbmp;
delete startbmp;
delete endbmp;
delete fontbmp;
delete successbmp;
KillTimer(1);
}
BEGIN_MESSAGE_MAP(PcmanFrame, CFrameWnd)
//{{AFX_MSG_MAP(PcmanFrame)
ON_WM_PAINT()
ON_WM_KEYDOWN()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// PcmanFrame message handlers
void PcmanFrame::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rect;
GetClientRect(&rect);
if(success)
{
mdc1->SelectObject(successbmp);
mdc->BitBlt(0,0,rect.right,rect.bottom,mdc1,0,0,SRCCOPY);
}
else if((!start)&&(!end))
{
mdc1->SelectObject(startbmp);
mdc->BitBlt(0,0,rect.right,rect.bottom,mdc1,0,0,SRCCOPY);
}
else if((start)&&(!end))
{
mdc1->SelectObject(bgbmp);
mdc->BitBlt(0,0,rect.right,rect.bottom,mdc1,0,0,SRCCOPY);
}
else if((start)&&(end))
{
mdc1->SelectObject(endbmp);
mdc->BitBlt(0,0,rect.right,rect.bottom,mdc1,0,0,SRCCOPY);
mdc->TextOut(0,0,buff);
}
dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);
// Do not call CFrameWnd::OnPaint() for painting messages
}
void PcmanFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if(success)
{
end=FALSE;
start=FALSE;
success=FALSE;
Invalidate();
}
else if((!start)&&(!end))
{
start=TRUE;
KillTimer(2);
ResetGame();
SetTimer(1,100,NULL);
}
else if(start&&end)
{
end=FALSE;
start=FALSE;
Invalidate();
}
else
switch(nChar)
{
case VK_LEFT:
player.d=0;
break;
case VK_UP:
player.d=1;
break;
case VK_RIGHT:
player.d=2;
break;
case VK_DOWN:
player.d=3;
break;
}
CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
void PcmanFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
GetClientRect(&rect);
CClientDC dc(this);
int tempBean=BeanNumber;
if(start&&(!end)&&(nIDEvent==1))
{
//贴上背景图
mdc1->SelectObject(bgbmp);
mdc->BitBlt(0,0,rect.right,rect.bottom,mdc1,0,0,SRCCOPY);
//贴上豆子图
mdc1->SelectObject(beanbmp);
for(i=0;i<13;i++)
{
for(j=0;j<8;j++)
{
if((bean[i][j].x>player.x)&&(bean[i][j].x<player.x+30)&&(bean[i][j].y>player.y)&&(bean[i][j].y<player.y+30))
{
if(bean[i][j].mark==FALSE)
{
bean[i][j].mark=TRUE;
BeanNumber++;
}
}
if(bean[i][j].mark==FALSE)
mdc->BitBlt(20+i*60,20+j*60,15,15,mdc1,0,0,SRCCOPY);
}
}
//若豆子吃光则过关
if(BeanNumber==13*8)
{
KillTimer(1);
success=TRUE;
end=TRUE;
Invalidate();
SetTimer(2,500,NULL);
return;
}
//每吃13个豆增加1只怪物
if((BeanNumber%13==0)&&(tempBean!=BeanNumber))
NewMonster();
//处理player的移动
mdc1->SelectObject(pcbmp);
player.c=(player.c+1)%2;
lastx=player.x;lasty=player.y;
switch(player.d)
{
case 0:
player.x-=10;
break;
case 1:
player.y-=10;
break;
case 2:
player.x+=10;
break;
case 3:
player.y+=10;
break;
}
if((player.x<=0)||(player.x>=750))
player.x=lastx;
if((player.y<=0)||(player.y>=450))
player.y=lasty;
HitPoint[0].x=player.x+15;HitPoint[0].y=player.y+2;
HitPoint[1].x=player.x+2;HitPoint[1].y=player.y+15;
HitPoint[2].x=player.x+15;HitPoint[2].y=player.y+28;
HitPoint[3].x=player.x+28;HitPoint[3].y=player.y+15;
HitPoint[4].x=player.x+7;HitPoint[4].y=player.y+7;
HitPoint[5].x=player.x+23;HitPoint[5].y=player.y+7;
HitPoint[6].x=player.x+7;HitPoint[6].y=player.y+23;
HitPoint[7].x=player.x+23;HitPoint[7].y=player.y+23;
HitPoint[8].x=player.x+15;HitPoint[8].y=player.y+15;
for(i=0;i<9;i++)
{
if(bg[(2*HitPoint[i].x+HitPoint[i].y*bm.bmWidthBytes)]==0&&bg[(2*HitPoint[i].x+HitPoint[i].y*bm.bmWidthBytes)+1]==0)
{
player.x=lastx;
player.y=lasty;
break;
}
}
for(i=0;i<9;i++)
{
for(j=0;j<MonsterNumber;j++)
{
if((HitPoint[i].x>=monster[j].x)&&(HitPoint[i].x<=monster[j].x+40)&&(HitPoint[i].y>=monster[j].y)&&(HitPoint[i].y<=monster[j].y+30))
{
KillTimer(1);
end=TRUE;
Sleep(1000);
SetTimer(2,500,NULL);
sprintf(buff,"Bean Number:%d",BeanNumber);
Invalidate();
return;
}
}
}
if(player.c==0)
{
mdc->BitBlt(player.x,player.y,30,30,mdc1,60*player.d+1,31,SRCAND);
mdc->BitBlt(player.x,player.y,30,30,mdc1,60*player.d+1,1,SRCPAINT);
}
else
{
mdc->BitBlt(player.x,player.y,30,30,mdc1,60*player.d+31,31,SRCAND);
mdc->BitBlt(player.x,player.y,30,30,mdc1,60*player.d+31,1,SRCPAINT);
}
//处理怪物的移动
mdc1->SelectObject(monsterbmp);
for(i=0;i<MonsterNumber;i++)
{
monster[i].c=(monster[i].c+1)%2;
mlastx=monster[i].x;
mlasty=monster[i].y;
if(abs(monster[i].x-player.x)>abs(monster[i].y-player.y))
{
if(monster[i].x>player.x)
monster[i].x-=5;
else if(monster[i].x<player.x)
monster[i].x+=5;
if(TestHit(i))
{
monster[i].x=mlastx;
int temp=rand()%10;
if(temp<7)
{
if(monster[i].y+15<=240)
PcMan.rar_pcman_吃豆子_游戏 visual c++_游戏编程
版权申诉
95 浏览量
2022-09-23
22:33:41
上传
评论
收藏 125KB RAR 举报
刘良运
- 粉丝: 66
- 资源: 1万+
最新资源
- HM2305B-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 基于52单片机、ADC0832、LCD1602、两个74HC393和一个74HC08的频率测量计 不能用,请私我
- HM2302-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- python实战项目-学生成绩管理系统(基础版)
- 微信小程序源码 实现查公交 滴滴公交 app 源码下载
- HM2302E-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 基于C#图片相似度比较,感知哈希算法
- VR开发的概要介绍与分析
- 自动驾驶定位系列教程七:点云畸变补偿.pdf
- HM2302D-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈