超级玛丽制作揭秘26菜单控制 窗口缩放

本文介绍了一个简单游戏的菜单控制与窗口缩放功能实现方法。包括菜单控制的初始化、显示、按键响应及窗口缩放功能的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 菜单控制:
开始菜单只有两项: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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值