上次写了一下关于人物移动的处理,今天把一些代码贴出来
首先当然是键盘消息,我们把一些人物的处理都写在了一个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;
}
以上就是人物移动的具体处理,但是代码仍然不全,毕竟要等游戏初具雏形后才能把所有源码贴出来,现
在已经在进行脚本的处理了,相信初步的雏形会出来了