Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1

下面的设计稍微繁琐一些,有必要把思路说清楚。

下一步的主要实现当我们点击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 < _mapSize.width; j++) {
		for (int i = 0;  i < _mapSize.height; i++) {
                                    Sprite* _sp = wayLayer->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<tiledRowsCount;i++)
               canPassGrid[i]=new bool [tiledColsCount];	

	//给canPassGrid设置默认值为false 表示不能通过
	for(int row = 0;row<tiledRowsCount;row++)
	{
		for(int col = 0;col<tiledColsCount;col++)
		{
			canPassGrid[row][col] = false;
		}
	}
	log("");

}

Ok 至此我们已经可以调试一下代码,从log中可以看到已经打印出了canPassGrid数组中可以通过的行列值了

对比一下sea.tmx文件中的way图层 ,看看行列值是不是一致了

点击下载代码

http://download.csdn.net/detail/lideguo1979/8276135

获取路径稍微复杂一些,我们分多章介绍

未完待续

时间: 2024-12-25 09:54:07

Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1的相关文章

Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_3

点击下载代码   http://download.csdn.net/detail/lideguo1979/8291803 新建一个类RouteNavigation,定义getPath()方法.用来获取角色路径,我们採用单例模式设计该类,先看该类的定义 RouteNavigation.h class RouteNavigation{ public: static RouteNavigation* routeNav_Instance; //该类静态对象 static RouteNavigation*

Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_2

在编写获取路径方法前,我们先把角色需要的动画文件加载进来,角色的文件为png 和 plist格式. player1_anim.png.plist             player1_anim.png player2_anim.png.plist             player2_anim.png plist分别记录了每张图在整张png图中的位置 大小,我们只要知道每张小图名称即可从整张png图中截取出想要的小图. player1_anim.png图片为 player2_anim.png

Cocos2d-x 3.2 大富翁游戏项目开发-第十一部分 提升角色行走体验

角色在获取随机步数走之前需要友好的提示玩家是哪个角色开始行走,要走几步. 这样我们在行走之前让角色闪一下,并把角色要走的路径用特殊颜色标注一下.效果如下 首先实现角色闪动:闪动是角色相关的,所以我们在RicherPlayer类的startGo方法中修改最合适 voidRicherPlayer::startGo(std::vector<int>rowVector,std::vector<int>colVector) { //创建淡入淡出的动作,让角色运行,动作结束后,调用startR

Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色按路径行走

路径获得之后,我们就可以让角色按照路径行走了,当点击go按钮的时候,我们调用player的startGo()方法,传入的参数就是保存了路径的2个一维数组 void GameBaseScene::goButtonCallback(cocos2d::CCObject *pSender) { RouteNavigation::getInstance()->getPath(player1,3,canPassGrid,tiledRowsCount,tiledColsCount); std::vector<

Cocos2d-x 3.2 大富翁游戏项目开发-第二十六部分 人物技能

本节主要是添加人物技能,技能包括 暴风骤雨:此技能可以把地块变成空白地块, 随心步:  选择想走的步数,想走几步走几步 巧取豪夺:把对手的土地变成自己的 技能包含的信息:等级 和 耗费体力 等级共5级,每提高一个等级,需要耗费的体力值减10 暴风骤雨:初始耗费体力值70 随心步:  初始耗费体力值50 巧取豪夺:初始耗费体力值100 1.添加技能SkillCard 类,包含了技能基本信息以及如何显示技能 其实现和前面讲解的股票 彩票 card类相似,不再累述 2.修改RicherPlayer类,

Cocos2d-x 3.2 大富翁游戏项目开发-第四部分 退出对话框

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">这部分代码从网上查阅了一下,基本都是以前版本编写的,需要稍微改动一下即可,效果如图</span> 首先看看在MenuScene.cpp如是如何调用起对话框的 void MenuScene::popupLayer(){ // 定义一个弹出层,传入一张背景图 PopupLayer

Cocos2d-x 3.2 大富翁游戏项目开发-第三部分 菜单场景

上一部分介绍到片头动画介绍后进入到菜单场景,场景效果如图 MenuScene.h头文件如下: class MenuScene : public LayerColor { public: static Scene* createScene(); virtual bool init(); CREATE_FUNC(MenuScene); private: Size visibleSize; //窗口尺寸 LabelTTF* settingsGameTTF; //场景文字 void menuTouchD

Cocos2d-x 3.2 大富翁游戏项目开发-第二十五部分 大富翁股市

当角色走到股市图标时,进入股市界面.每走完一个回合,增加一条股票数据, 股市界面上半部分显示股票信息,包括代码,名称,当前价格,买入价格,涨跌百分比,角色持有的股票数量 下半部分显示股票价格走势,当点击一个股票时,显示相关股票的价格走势,共显示最新14条的价格走势. 每次点击购买,买入100股 .点击卖出,则卖出所持有的该股的所有股票.成交价格 等信息动态更新 点击返回,返回到游戏主界面,并更新角色资金值 1.首先添加股票类 包括代码,名称,买入价格,涨跌百分比,持仓数量等定义以及相关的get

Cocos2d-x 3.2 大富翁游戏项目开发-第二十三部分 购买彩票

当角色路过彩票的标志或者停留位置有彩票标志时,弹出购买彩票的对话框,提示购买彩票,已经买过的号码,不显示.当机器对手路过时则直接购买彩票. 1. 在RicherPlayer.h中增加std::vector<int> lottery_vector;用来存储购买的彩票号码 2. RicherGameController 修改endGo方法,每走完一步就会进入该方法,判断是否有彩票标示图标,有的话发送MSG_LOTTERY彩票消息,MOVEPASS标示走完一步的标志 void RicherGameC