- 加入我的QQ群
- 关注我的百家号
扫描下面的二维码,“关注”我的百家号。
前面,我们完成了走迷宫的全套程序,可以通过键盘来操作人物行走。本节,也跟其它大型游戏一样来实现人物走过的路线的回放。
第1步:先创建一个结构体。
在构造函数前添加如下代码:
struct list{int n; //第几列int m;//第几行int x; //横坐标int y; //纵坐标struct list*next; //指向下一个结点指针struct list*back;//指向上一个结点指针CBitmap*bitmap; //人物指针
}; list*ptr,*preptr,*first;//ptr是当前结点,preptr是上一个结点,first是第1个结点 |
第2步:创建人物未动时的位置。
先在构造函数中添加如下代码:
ptr=(list*)malloc(sizeof(list));ptr->n=n;ptr->m=m;ptr->x=x;ptr->y=y;ptr->bitmap=bitmap[0][0];ptr->next=NULL;
ptr->back=NULL; first=ptr; |
然后,再创建一个成员函数Go() ,在函数体中添加如下代码:
CClientDC dc(this);mdc->SelectObject(wall);for(i=0;i<8;i++){
for(int j=0;j<8;j++) { if(maze[i][j]==1) { dc.BitBlt(j*93,i*100,93,100,mdc,0,0,SRCCOPY); } } } mdc->SelectObject(first->bitmap);//获取第一张图片的地址 if(number==0) //如果没有移动 { dc.BitBlt(first->n*93+first->x,first->m*100+first->y,93,100,mdc,0,0,SRCCOPY); //不动 } else { dc.BitBlt(first->back->n*93+first->back->x,first->back->m*100+first->back->y,93,100,mdc,0,0,WHITENESS); //使上一张图片变成白色,即消失 dc.BitBlt(first->n*93+first->x,first->m*100+first->y,93,100,mdc,0,0,SRCCOPY); //只留下移动后的这张图片 } number++; //不断地在移动 if(first->next==NULL) //当到了最后一个结点时,Go函数停止 { go=false; } else first=first->next; //否则不断地循环 |
并且在构造函数前声明变量:int number=0; bool go=false;
第3步:将前面我们写过的ONKEYDOWN里面的代码修改成如下代码:
CClientDC dc(this);dc.BitBlt(n*93+x,m*100+y,93,100,mdc,0,0,WHITENESS);if(nChar==VK_DOWN){y+=100;
k=(n*93+x)/93; l=(m*100+y)/100; if(maze[l][k]==1) { y-=100; } if(dir==0) { index++; if(index==4) { index=0; } } else { index=0; dir=0; } ptr->next=(list*)malloc(sizeof(list)); ptr->next->n=n; ptr->next->m=m; ptr->next->x=x; ptr->next->y=y; ptr->next->bitmap=bitmap[dir][index]; preptr=ptr; ptr->next->next=NULL; ptr=ptr->next; ptr->back=preptr; } if(nChar==VK_UP) { y-=100; k=(n*93+x)/93; l=(m*100+y)/100; if(maze[l][k]==1) { y+=100; } if(dir==3) { index++; if(index==4) { index=0; } } else { index=0; dir=3; } ptr->next=(list*)malloc(sizeof(list)); ptr->next->n=n; ptr->next->m=m; ptr->next->x=x; ptr->next->y=y; ptr->next->bitmap=bitmap[dir][index]; preptr=ptr; ptr->next->next=NULL; ptr=ptr->next; ptr->back=preptr; } if(nChar==VK_RIGHT) { x+=93; k=(n*93+x)/93; l=(m*100+y)/100; if(maze[l][k]==1) { x-=93; } if(dir==2) { index++; if(index==4) { index=0; } } else { index=0; dir=2; } ptr->next=(list*)malloc(sizeof(list)); ptr->next->n=n; ptr->next->m=m; ptr->next->x=x; ptr->next->y=y; ptr->next->bitmap=bitmap[dir][index]; preptr=ptr; ptr->next->next=NULL; ptr=ptr->next; ptr->back=preptr; } if(nChar==VK_LEFT) { x-=93; k=(n*93+x)/93; l=(m*100+y)/100; if(maze[l][k]==1) { x+=93; } if(dir==1) { index++; if(index==4) { index=0; } } else { index=0; dir=1; } ptr->next=(list*)malloc(sizeof(list)); ptr->next->n=n; ptr->next->m=m; ptr->next->x=x; ptr->next->y=y; ptr->next->bitmap=bitmap[dir][index]; preptr=ptr; ptr->next->next=NULL; ptr=ptr->next; ptr->back=preptr; } k=(n*93+x)/93; l=(m*100+y)/100; if(maze[l][k]==3) { dc.TextOut(120,350,"走出去了!"); ptr->next=(list*)malloc(sizeof(list)); ptr->next->n=n; ptr->next->m=m; ptr->next->x=x; ptr->next->y=y; ptr->next->bitmap=bitmap[dir][index]; preptr=ptr; ptr->next->next=NULL; ptr=ptr->next; ptr->back=preptr; go=true; return; } mdc->SelectObject(bitmap[dir][index]); dc.BitBlt(n*93+x,m*100+y,93,100,mdc,0,0,SRCCOPY); |
第4步:在ONTIMER里的代码修改成如下:
if(Start){start();}else{if(go){Go();}} |
这样,我们就实现了整个人物行走的路线完整回放。到这里,走迷宫游戏就全部完成。
注意:在构造函数前面声明的变量:n和m,它们在声明时不能设置默认值0或其它数,否则,人物行动前的原始位置会不在2上(即不在入口处),因为,回放结构体里也有这两个变量,而在Go()函数中要用到这2个变量来设置人物的原始位置。也可以在结构体中把这2变量改成别的字母,如:s\w等。
注意:if(first->next==NULL) 像这样的判断语句中的" == " 号如果写成" = " 就会出错,甚至程序崩溃。所以这要引起大家的重视。