新手学习中 发表于 2013-9-30 15:14:53

用VC6.0制作人物走迷宫(下集)

中集的最后,是人物走墙壁会穿过墙壁。

解决问题,我们需要在接受键盘信息后,对坐标进行计算。如果是穿墙,则修改坐标让他回到原地,再BitBlt

在这里,我们把每次人物的移动量都设置为1格,这样,我们只需要判断人物图的坐标跟墙壁图坐标是否重合就行。

把人物移动量设置为1格,是为了方便判断,如果不是1格而是半格,判断上就会麻烦一点。因为这里重点讲迷宫的制作,所以移动这一部分就简化一下。

列如:

n=n+100;
if(maze[(y+n)/100][(x+m)/93]==1)
{
n=n-100;
}

当我们向下走时,是 n=n+100;
但之后要判断,如果是墙壁,则减去100回到原地。


因为代码太乱,所以我们把上面的代码归入到一个wheredown函数中:

void GameWnd::wheredown()
{
n=n+100;
if(maze[(y+n)/100][(x+m)/93]==1)
{
n=n-100;
}
}

同理,还有whereupwhereleftwhereright函数。这些函数的作用,是在我们按动键盘后,计算出人物出现地点的正确坐标,而不会传墙

同理,我们把中集中,判断人物行走状态的代码,也放入函数中,如:

void GameWnd::whichright()
{
if (i ==2)
{
j++;
if(j<4)
{
   
}
else
{
   j = 0;
}
}
else
{
i = 2;
j = 0;
}
mdc->SelectObject(bitmap);
}

同理,还有其他三个方向的函数。这个函数,是用于判断按键后,人物该出现的正确的行走姿势。

我们在OnKeyDown中用的是四个if判断句,这里也简化成switch,综合上面,就变成:

void GameWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
dc.BitBlt(x+m,y+n,93,100,mdc,0,0,WHITENESS);//按下键盘时,都先消去之前的人物图
switch (nChar)
{
case VK_DOWN:

whichdown();
wheredown();



break;
case VK_UP:

whichup();
whereup();


break;
case VK_LEFT:

whichleft();
whereleft();



break;
case VK_RIGHT:

   whichright();
whereright();

break;

}
dc.BitBlt(x+m,y+n,93,100,mdc,0,0,SRCCOPY);
}



运行后,墙壁就是墙壁,再也穿不过去了!!


出口回放功能

现在增加一个功能,就是让人物从入口移动到出口时,就自动播放其行走的路径。

这里我们用链表来完成,原理就是用链表来记录图片的状态与坐标。

我们每次按键盘,等于是增加了链表的一个长度。

步骤:

1、定义类并初始化

class A
{
public:
int ii;
int jj;
int mm;
int nn;
A *p;
};
A * phead = new A;

A *p1 = phead;
A* p2 =phead;

///定义了一个类,作为构成链表的单元。创建了头节点。再定义两个指针指向头节点。


2、在构造函数中给成员赋值

phead->ii = 0;
phead->jj = 0;
phead->mm =0;
phead->nn =0;
phead->p = NULL;

注意:我们不能在全局中给变量赋值。这样是错的,全局中只能声明定义不能赋值。


3、在onkeydown函数中,增加链表实现代码:

p1 = new A;
p1->ii = i;
p1->jj = j;
p1->mm =m;
p1->nn =n;
p1->p =NULL;
p2->p =p1;
p2 = p1;
if(maze[(y+n)/100][(x+m)/93]==3)
{
   p2=phead;
   while(p2!=NULL)
   {
    mdc->SelectObject(bitmap);
    dc.BitBlt(x+p2->mm,y+p2->nn,93,100,mdc,0,0,SRCCOPY);
    p2 = p2->p;
   
   }
   p2 = p1;
}


当if(maze[(y+n)/100][(x+m)/93]==3)
这个就表示人物走到了入口,这时就自动回放BitBlt

程序运行后:




当我们走到出口时,其自动回放我们行走过的路径。


**** Hidden Message *****

牡丹花下死做鬼 发表于 2013-9-30 16:27:06

*^_^* 给力的帖子

Crazy迷恋. 发表于 2013-9-30 17:04:34

{:5_108:}写游戏。~~

逆风飞翔 发表于 2013-9-30 18:25:49

顶楼主啦..希望楼主多发精品好帖啦.....

叛逆 发表于 2013-9-30 18:53:11

看看很有意思

枫幻 发表于 2013-9-30 18:58:17

牛,这个要学习一下

゛.緈葍·_o 发表于 2013-9-30 20:32:22

有意思{:5_105:}{:5_105:}{:5_105:}{:5_105:}{:5_105:}

cainiao367 发表于 2013-9-30 22:27:32

很好,看到写游戏就是强悍

木糖醇。 发表于 2013-9-30 23:18:27

http://115.com/lb/5lbdbzdn7r9

健康的思考 发表于 2013-10-1 10:59:26

学习下
{:1_1:}

Hrlen 发表于 2013-10-1 11:43:59

lamlamlamlama

御风 发表于 2013-10-1 17:03:44

:lol:厉害。。

linyoubiao 发表于 2013-10-12 13:18:58

好东西,学习

小栗子 发表于 2013-10-12 14:01:26

非常给力,支持下!!

hujinxinb 发表于 2013-10-12 15:25:50

给力给力啊啊啊

duli_ing 发表于 2013-10-12 15:38:01

下载下来
看看看看。。

shayuwenlu 发表于 2013-10-12 15:57:48

很牛叉的 样子看看

鹏程完了 发表于 2013-10-12 19:49:20

哇塞,来看看

道友且留步 发表于 2013-10-12 21:22:12

好好好,非常好,我喜欢

〓随风〓 发表于 2013-10-13 02:53:05

这个不是范磊的教程吗,抄袭?请问楼主代码全敲出来没,再请教完成之后的EXE如何单独运行。
页: [1] 2
查看完整版本: 用VC6.0制作人物走迷宫(下集)