超级玛丽制作揭秘19视图

 怎样把所有东西都显示在窗口中,并随着玩家移动呢?
思路:玩家看到的区域称为视图,即12格高,16格宽的窗口(每格32*32像素)。先把整个地图则绘制在一个DC上,然后从这个地图DC中,截取当前视图区域的图像,绘制到窗口中。修改视图区域的坐标(横坐标增加),就实现了地图的移动。

初始化:
函数:BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
代码:
// hwindow是游戏窗口的DC句柄
 hwindow=GetDC(hWnd);
 // hscreen是整个地图对应的DC
 hscreen=CreateCompatibleDC(hwindow);
 //建立一个整个地图大小(5倍窗口宽)的空位图,选入hscreen
 hmapnull=CreateCompatibleBitmap(hwindow,GAMEW*32*5,GAMEH*32);
 SelectObject(hscreen,hmapnull);

显示。
函数:WndProc
代码:
  case WM_PAINT:
   // hwindow是游戏窗口的DC句柄
   hwindow = BeginPaint(hWnd, &ps);
   SelectObject(hscreen,hmapnull);

   case GAME_IN:
    //显示天空
    bmSky.DrawRollStretch(2,2,gamemap.mapinfo.iBackBmp);
    //显示背景物品
    gamemap.ShowBkObj(bmMapBkObj);
    //显示地图物品
    gamemap.Show(bmMap);
    //显示动态元素
    gamemap.ShowAniObj(bmAniObj);
    //显示提示信息
    gamemap.ShowOther(hscreen);
    //显示玩家
    rmain.Draw();
    break; 
   
if(gamemap.iScreenScale)
   {
    //窗口大小调整功能,代码略
   }
   else
   {   
 //从整个地图的DC中, 截取当前视图区域的图像,绘制到窗口
 BitBlt(hwindow,0,0,GAMEW*32,GAMEH*32,hscreen,gamemap.viewx,0,SRCCOPY);
   }
可以看到,视图的左上角横坐标是viewx,只需要刷新这个坐标,就实现了地图移动。

视图坐标刷新:
思路:用一个函数不停地检测,玩家角色和视图左边界的距离,超过特定值,把视图向右移。
函数:void GAMEMAP::MoveView()
代码:如果玩家坐标和视图左边界的距离大于150,移动视图。
 if(rmain.xpos - viewx > 150)
 {
  viewx+=ROLE_STEP; 
  //判断视图坐标是否达到最大值(地图宽度减去一个窗口宽度)
  if(viewx>(mapinfo.viewmax-1)*GAMEW*32)
   viewx=(mapinfo.viewmax-1)*GAMEW*32;  
 }
至此,地图跟随玩家移动。每一关的地图是怎样切换的呢?且听下回分解。
附:
超级玛丽第一版源码链接:http://download.youkuaiyun.com/source/497676
超级玛丽增强版源码链接:http://download.youkuaiyun.com/source/584350

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值