游戏编程三:移动的处理

上次写了一下关于人物移动的处理,今天把一些代码贴出来                                        

 首先当然是键盘消息,我们把一些人物的处理都写在了一个MapManager类里面,

//按下键盘消息
void CMapManager::OnKeyDown(WPARAM wParam)
{
 switch(wParam)
 {
 case VK_UP:
  direction = MOVE_UP;
  status = STATUS_MOVE;
  srcpoint.y = playsize.cy * 3;
  Window->SetTimer(TIMER_ID, 20, NULL);
  break;

 case VK_DOWN:
  direction = MOVE_DOWN;
  status = STATUS_MOVE;
  srcpoint.y = 0;
  Window->SetTimer(TIMER_ID, 20, NULL);
  break;

 case VK_LEFT:
  direction = MOVE_LEFT;
  status = STATUS_MOVE;
  srcpoint.y = playsize.cy;
  Window->SetTimer(TIMER_ID, 20, NULL);
  break;

 case VK_RIGHT:
  direction = MOVE_RIGHT;
  status = STATUS_MOVE;
  srcpoint.y = playsize.cy * 2;
  Window->SetTimer(TIMER_ID, 20, NULL);
  break;
 }

}

//释放键盘消息
void CMapManager::OnkeyUp(WPARAM wParam)
{
 if(status == STATUS_MOVE)
  status = STATUS_STOP;
 if(status == STATUS_STOP)
 {
 
  if(direction == MOVE_UP)
   StopUp();
  if(direction == MOVE_DOWN)
   StopDown();
  if(direction == MOVE_LEFT)
   StopLeft();
  if(direction == MOVE_RIGHT)
   StopRight();
  Window->KillTimer(TIMER_ID);
 }
}

以向上为例,如果向上,就把direction设为MOVE_UP,同时人物状态status设为STATUS_MOVE,同时找到向

上的任务图片坐标,再调用SetTimer,当键盘松开时,先令status为STATUS_STOP,在调用StopUp,在

KillTimer,

以下是角色行走的具体代码,仍以向上为例,同时由于我们实现的是滚动,当人物在中间位置时实现屏幕

的卷动,如下

//角色行走
void CMapManager::MoveUp()
{
 CPaintDC dc(Window);
 //如果地图仍可能卷屏,则地图动,角色停留原地运动,反之角色动
 if(mappoint.y == 0)                    
 {
  srcpoint.x = playsize.cx * flag;
  for(int i = 0; i < 16; i++)
  {
   if(despoint.y > 64 - playsize.cy)
    despoint.y -= 2;
   else
    despoint.y = 64 - playsize.cy;
  
   play_list[selectplay].Set(&player, despoint, srcpoint, playsize,
                          play_list[selectplay].GetDepth());
   DrawMap();
   Draw(dc, mappoint);  
  }
 
 }

 if(mappoint.y > 0)
 {
        srcpoint.x = playsize.cx * flag;
     for(int j = 0; j < 16; j++)
  {
   if(despoint.y - mappoint.y < 240)
   {
    mappoint.y -= 2;
    if(mappoint.y <= 0)
     mappoint.y = 0;
   }
  
   if(despoint.y > 0)
    despoint.y -= 2;
   else
    despoint.y = 0;

  
   play_list[selectplay].Set(&player, despoint, srcpoint, playsize,
                          play_list[selectplay].GetDepth());
   DrawMap();
   Draw(dc, mappoint);
  }
 
 }

 flag++;
 if(flag == 4)
   flag = 0;
 
}

以下是停止的代码
//角色停止
void CMapManager::StopUp()
{
 
 flag = 1;

 CPaintDC dc(Window);
 play_list[selectplay].Set(&player, despoint, CPoint(0, srcpoint.y), playsize,
                        play_list[selectplay].GetDepth());
 DrawMap();
 play_list[selectplay].Draw(view);
 Draw(dc, mappoint); 
 Window->Invalidate(FALSE);
}
其实停止的时候,就是把人物停止的那张图重绘一遍。

    接下来就是移动的判断了,哪些地方可以移动,哪些地方又不能移动,我们在之前把地图分成了很多

小格,对于每个小格为0表示可以通过,为1表示不能通过。
//判断是否允许通过
void CMapManager::Pass()
{
 play_list[selectplay].SetMapIndex(despoint);
 CPoint temp = play_list[selectplay].GetMapIndex();    //得到地图索引
 //move up 时如果前方有阻碍物,则原地移动,其他方向均同
 if(direction == MOVE_UP)               
 {
  if(temp.y - 1 >= 0)
  {
   if(mapdata[temp.x][temp.y - 1] == 0)
    pass = TRUE;
   else
    pass = FALSE;
  }
 }
 if(direction == MOVE_DOWN)
 {
  if(temp.y + 1 < map.Height() / 32)
  {
   if(mapdata[temp.x][temp.y + 1] == 0)
    pass = TRUE;
   else
    pass = FALSE;
  }
 }
 if(direction == MOVE_LEFT)
 {
  if(temp.x - 1 >= 0)
  {
   if(mapdata[temp.x - 1][temp.y] == 0)
    pass = TRUE;
   else
    pass = FALSE;
  }
 }
 if(direction == MOVE_RIGHT)
 {
  if(temp.x + 1 < map.Width() / 32)
  {
   if(mapdata[temp.x + 1][temp.y] == 0)
    pass = TRUE;
   else
    pass = FALSE;
  }
 }
}

   对于障碍物,如果继续朝它的方向走,则在图上显示的效果是一个人原地的移动
//原地走动
void CMapManager::MoveOrigin()
{
 CPaintDC dc(Window);
 srcpoint.x = playsize.cx * flag;
    for(int j = 0; j < 16; j++)
 {
  play_list[selectplay].Set(&player, despoint, srcpoint, playsize,
                         play_list[selectplay].GetDepth());
  DrawMap();
  Draw(dc, mappoint); 
 }
 flag++;
 if(flag == 4)
   flag = 0;
}

以上就是人物移动的具体处理,但是代码仍然不全,毕竟要等游戏初具雏形后才能把所有源码贴出来,现

在已经在进行脚本的处理了,相信初步的雏形会出来了 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值