下面的设计稍微繁琐一些,有必要把思路说清楚。
下一步的主要实现当我们点击go按钮后,得到骰子随机数,就是行走的步数,根据步数获取行走的路径,然后角色根据路径移动位置。大体流程如图所示:
这其中getpath()获取路径的方法有必要说清楚,还是看流程图吧
思路大体是这样的,代码实现上可能存在一些差别,但是不影响我们的整体设计思想。
我们开始修改gamebasescene代码
gamebasescene.h //新添加变量 表示地图块中每块的宽高const int tiledwidth = 32; const int tiledheight = 32;class gamebasescene: public layer{public: int tiledcolscount; //关卡地图总的列数 int tiledrowscount;//关卡地图总的行数 bool** canpassgrid;//根据地图总的行列数创建的二维数组 virtual void inittiledgrid();//用来初始化canpassgrid数组 void setwaypasstogrid();//根据地图图层way,设置canpassgrid相应的值为true void onexit();//退出时需要释放某些变量空间 void addgobutton();//添加go 按钮};
修改gamebasescene.cpp文件
在init方法中添加新增函数的调用bool gamebasescene::init(){ ………………….. addgobutton(); inittiledgrid(); setwaypasstogrid();…………….}void gamebasescene::setwaypasstogrid(){ tmxlayer* waylayer = _map->layernamed(way);//获取地图way图层 size _mapsize = waylayer->getlayersize(); //获取way图层大小 //根据way图层,获取道路的坐标并转换成地图的行列值,设置canpassgrid相应的行列值为true,表示人物可以从这里通过 for (int j = 0; j tileat(point(j, i)); if (_sp) { float x = _sp->getpositionx(); float y = _sp->getpositiony(); int col = x/tiledwidth; int row = y/tiledheight; canpassgrid[row][col] = true; log(canpassgrid row= %d ,col =%d ,canpass = %d ,row,col,canpassgrid[row][col]); } } } log(setwaypasstogrid finished);}
//这个就是简单 的添加go按钮void gamebasescene::addgobutton(){ sprite* gobutton = sprite::create(go_button); gobutton->setposition(ccp(tablestartposition_x+2*tablewidth,tablestartposition_y-tableheight*5)); addchild(gobutton);}//当退出是调用该函数,释放canpassgrid占用的空间void gamebasescene::onexit(){ cc_safe_delete(canpassgrid); layer::onexit();}
下面看一下inittiledgrid()方法的实现,由于每个关卡地图大小不一样,所以这个方法的实现放到了子类中
seascene.cpp实现如下
seascene实现父类gamebasescene的inittiledgrid方法void gamebasescene::inittiledgrid(){ tiledcolscount = 20;//地图总的列数 tiledrowscount = 15;//地图总的行数 //根据行列数创建二维数组canpassgrid canpassgrid = new bool*[tiledrowscount]; for(int i=0;i
对比一下sea.tmx文件中的way图层 ,看看行列值是不是一致了
点击下载代码
http://download.csdn.net/detail/lideguo1979/8276135
获取路径稍微复杂一些,我们分多章介绍
未完待续