菜单控制:
开始菜单只有两项:0项“开始游戏”,1项“操作说明”
菜单编号用iMenu表示。
初始化:
函数:void GAMEMAP::Init()
代码:iMenu=0;
菜单显示:
菜单文字显示:
函数:WndProc
代码:在WM_PAINT绘制消息中:
case GAME_PRE:
gamemap.viewx=0; //设置视图坐标
bmPre.Stretch(2,2,0); //菜单背景图片
myfont.SelectFont(0); //设置文字字体
myfont.SelectColor(TC_BLACK, TC_YELLOW_0);//设置文字颜色
//显示3行文字
myfont.ShowText(150,260,pPreText[4]);
myfont.ShowText(150,290,pPreText[5]);
myfont.ShowText(150,320,pPreText[6]);
//显示箭头
gamemap.ShowMenu(bmAniObj);
break;
菜单箭头显示:
函数:void GAMEMAP::ShowMenu(MYANIOBJ & bmobj)
代码:根据当前菜单编号,决定箭头的纵坐标
bmobj.PlayItem(115,280+iMenu*30, ID_ANI_MENU_ARROW);
箭头会不停闪烁,怎样刷新帧?就在显示函数PlayItem中,如下:
void MYANIOBJ::PlayItem(int x,int y,int id)
{
//按照坐标,ID,显示图片
……
//切换当前帧
iframeplay=(iframeplay+1)%2;
}
菜单的按键响应:
函数:int GAMEMAP::KeyProc(int iKey)
代码:
switch(iGameState)
{
case GAME_PRE://选择游戏菜单
switch(iKey)
{
case 0xd://按下回车键
switch(iMenu)
{
case 0: //菜单项0“开始游戏”
c1.ReStart(TIME_GAME_IN_PRE); //计时两秒
iGameState=GAME_IN_PRE;//进入游戏LIFE WORLD提示状态
break;
case 1: //菜单项1“操作说明”
SetGameState(GAME_HELP); //进入游戏状态“操作说明”,显示帮助信息
break;
}
break;
case VK_UP: //按方向键“上”,切换菜单项
iMenu=(iMenu+1)%2;
break;
case VK_DOWN: //按方向键“下”,切换菜单项
iMenu=(iMenu+1)%2;
break;
}
return 1; //表示立即刷新画面
至此,菜单功能实现。
窗口缩放功能的实现:
窗口是否为默认大小,用iScreenScale表示。iScreenScale为1,表示窗口被放大,将视图区域缩放到当前的窗口大小。
初始化由构造函数完成:
GAMEMAP::GAMEMAP()
{
iScreenScale=0;
Init();
}
窗口大小检测:用户拉动窗口,触发WM_SIZE消息。
函数:WndProc
代码:
case WM_SIZE:
//获取当前窗口宽 高
wwingame=LOWORD(lParam);
hwingame=HIWORD(lParam);
//如果窗口小于默认大小,仍然设置为默认数值,图像不缩放
if( wwingame <= GAMEW*32 || hwingame <= GAMEH*32)
{
wwingame = GAMEW*32;
hwingame = GAMEH*32;
gamemap.iScreenScale = 0;
}
else
{
//宽度大于高度的4/3
if(wwingame*3 > hwingame*4)
{
wwingame = hwingame*4/3; //重新设置宽度
}
else
{
hwingame = wwingame*3/4; //重新设置高度
}
gamemap.iScreenScale =1; //表示图像需要缩放
}
break;
图像缩放:在WM_PAINT消息处理中,绘制完所有图片后,根据iScreenScale缩放视图区域的图像。
函数:WndProc
代码:
//判断是否缩放图像
if(gamemap.iScreenScale)
{
//缩放视图区域图像
StretchBlt(hwindow,0,0,
wwingame,hwingame,
hscreen,
gamemap.viewx,0,
GAMEW*32,GAMEH*32,
SRCCOPY);
}
else
{
//不缩放,视图区域拷贝到窗口
BitBlt(hwindow,0,0,GAMEW*32,GAMEH*32,hscreen,gamemap.viewx,0,SRCCOPY);
}
至此,所有功能实现。游戏流程怎样控制呢?且听下回分解。
附:
超级玛丽第一版源码链接:http://download.csdn.net/source/497676
超级玛丽增强版源码链接:http://download.csdn.net/source/584350