Cocos2d-x 3.2 大富翁游戏项目开发-第六部分 地图设计

在选择地图后,我们将进入游戏地图,所以我们必须先把地图编辑一下,使用Tiled地图编辑工具。

1、打开Tiled工具,新建文件,设置

地图大小:宽20块高 15块

块大小:     宽和高都是32像素

这样地图宽为 20 X 32 = 640  高 15 X 32 =480

我们调试的视图尺寸为 800 X 480   宽度剩余160像素 ,我们用来放置游戏控制控件和 显示人物的一些信息

2、点击地图—新图块

选择sea.png图片,图片上部中我放置了15个道具,分别是空白地块、道路、增加体力的分值、偶然事件等,后续使用的时候我再具体说明

3、选择除道具之外的图片填充满空白图块。并修改本图层名称为“ground”

4、新建图层,命名为”way” ,这一层我们主要放置道路以及各种道具

5、新建图层,命名为“land” ,这一层放置空白地块

6、保存文件为”sea.tmx”

下面开始加载地图

由于每个关卡场景都需要加载地图,所以我们写一个基类GameBaseScene,用来加载地图,每个游戏关卡场景只有继承该类即可

GameBaseScene.h文件

//定义画表格的初始位置 和 每行每列的宽高值
const int tableStartPosition_x = 650;
const int tableStartPosition_y = 450;
const int tableWidth = 50;
const int tableHeight = 40;

class GameBaseScene: public Layer
{
public:
    static Scene* createScene();
   TMXTiledMap* _map; //定义地图
    virtual bool init();
virtual void addMap();//添加地图方法 

    CREATE_FUNC(GameBaseScene);

private:

	void drawTable(int playerNumber); //画表格,用来放置角色,根据上边定义的变量画
	void addPlayer();//添加游戏角色部分信息方法,在控制栏先显示头像,资金 体力值等
	void addRightBanner();//添加右边地图空白部分背景,上方放置人物等信息
};

#endif

GameBaseScene.cpp文件

//调用了添加地图方法,添加banner背景 ,画表格 ,添加游戏人物部分信息方法
bool GameBaseScene::init()
{
	if ( !Layer::init() )
	{
		return false;
	}
	addMap();
	addRightBanner();
	drawTable(2);
	addPlayer();
	return true;
}

void  GameBaseScene::addRightBanner()
{
	Sprite* rightBanner = Sprite::create(RIGHT_BANNER);
	rightBanner->setAnchorPoint(ccp(0,0));
	rightBanner->setPosition( ccp(tableStartPosition_x, 0));//根据头文件定义的初始x值设置位置
	addChild(rightBanner);
}
//绘制表格,这部分代码可以不用看,只要知道是根据游戏人物数量,绘制表格 ,可以采用图片替换这个绘制。自己感觉用图片不如表格计算位置精确。
void GameBaseScene:: drawTable(int playerNumber)
{
	auto s = Director::getInstance()->getWinSize();

	auto draw = DrawNode::create();
	this->addChild(draw);

	for(int i=0;i<playerNumber;i++)
	{
		draw->drawSegment(Vec2(tableStartPosition_x,tableStartPosition_y-2*i*tableHeight),
						  Vec2(tableStartPosition_x+ 3*tableWidth,tableStartPosition_y-2*i*tableHeight), 1,
						  Color4F(0, 1, 0, 1));

		draw->drawSegment(Vec2(tableStartPosition_x,tableStartPosition_y - 2*(i+1)*tableHeight),
						  Vec2(tableStartPosition_x+ 3*tableWidth,tableStartPosition_y - 2*(i+1)*tableHeight), 1,
						  Color4F(0, 1, 0, 1));

		draw->drawSegment(Vec2(tableStartPosition_x+ tableWidth,tableStartPosition_y - tableHeight-2*i*tableHeight),
						  Vec2(tableStartPosition_x+ 3*tableWidth,tableStartPosition_y - tableHeight-2*i*tableHeight), 1,
						  Color4F(0, 1, 0, 1));

		draw->drawSegment(Vec2(tableStartPosition_x+ tableWidth,tableStartPosition_y -2*i*tableHeight),
						  Vec2(tableStartPosition_x+ tableWidth,tableStartPosition_y -2* tableHeight-2*i*tableHeight), 1,
						  Color4F(0, 1, 0, 1));
	}
}
//添加人物信息的方法,就是根据绘制的表格位置,把人物头像 、资金 、体力等信息同表格对齐显示,主要是坐标计算。
void GameBaseScene:: addPlayer()
{
	Sprite* player_me = Sprite::create(PLAYER_ME);
	player_me->setPosition(tableStartPosition_x+tableWidth/2,tableStartPosition_y-tableHeight);
	addChild(player_me);

    LabelTTF *player_me_money = LabelTTF::create();
    player_me_money->setString("$");
	player_me_money->setAnchorPoint(ccp(0,0.5));
    player_me_money->setFontSize(25);
    player_me_money->setPosition(tableStartPosition_x+tableWidth,tableStartPosition_y-tableHeight/2);
    addChild(player_me_money);

    LabelTTF *player_me_strength = LabelTTF::create();
    player_me_strength->setString("+");
	player_me_strength->setAnchorPoint(ccp(0,0.5));
    player_me_strength->setFontSize(28);
    player_me_strength->setPosition(tableStartPosition_x+tableWidth,tableStartPosition_y-tableHeight/2*3);
    addChild(player_me_strength);

	Sprite* player_enemy1 = Sprite::create(PLAYER_ENEMY1);
	player_enemy1->setPosition(tableStartPosition_x+tableWidth/2,tableStartPosition_y-3*tableHeight);
	addChild(player_enemy1);

    LabelTTF *player_enemy1_money = LabelTTF::create();
    player_enemy1_money->setString("$");
	player_enemy1_money->setAnchorPoint(ccp(0,0.5));
    player_enemy1_money->setFontSize(25);
    player_enemy1_money->setPosition(tableStartPosition_x+tableWidth,tableStartPosition_y-tableHeight/2*5);
    addChild(player_enemy1_money);

    LabelTTF *player_enemy1_strength = LabelTTF::create();
    player_enemy1_strength->setString("+");
	player_enemy1_strength->setAnchorPoint(ccp(0,0.5));
    player_enemy1_strength->setFontSize(28);
    player_enemy1_strength->setPosition(tableStartPosition_x+tableWidth,tableStartPosition_y-tableHeight/2*7);
    addChild(player_enemy1_strength);
}

基类做好了,我们就可以编写具体关卡场景类了,编写SeaScene类

//继承自基类GameBaseScene
class SeaScene: public GameBaseScene
{
public:
    static Scene* createScene();

    virtual bool init();  

    CREATE_FUNC(SeaScene);
};

#endif
//初始化方法需要调用基类的init方法
bool SeaScene::init()
{
	if ( !GameBaseScene::init() )
	{
		return false;
	}

	return true;
}

//编写继承自父类的addMap方法
void GameBaseScene::addMap()
{
	_map = TMXTiledMap::create( "map/sea.tmx");
	addChild(_map);
}

修改MapChooseScene的onTouchEnded()方法,添加进入关卡场景代码,为了不至于进入场景太突然,我们添加了TransitionFadeBL场景切换动画

void MapChooseScene::onTouchEnded(Touch*touch,Event *unused_event)
{

	Point endPoint = Director::getInstance()->convertToGL(touch->getLocationInView());
    float distance = endPoint.x - beginTouchPoint.x;
    if(fabs(distance) > TOUCH_DISTANCE)
    {
        adjustScrollView(distance);
    }else
	{
		if(currentPage == 2)
		{
			auto  scene = 	TransitionFadeBL::create(2, SeaScene::createScene());

			Director::getInstance()->pushScene(scene);
		}

	}
}

Ok,测试显示效果如图

点击下载代码

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

未完待续....................

时间: 2024-12-11 23:04:34

Cocos2d-x 3.2 大富翁游戏项目开发-第六部分 地图设计的相关文章

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 大富翁游戏项目开发-第四部分 退出对话框

<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

Cocos2d-x 3.2 大富翁游戏项目开发-第十部分实现人物轮流行走

现在只能让我方角色行走,对手并没有行动,如何实现轮流行走呢? 有2种方法,一种是采用刷帧控制器在update进行,另一种采用消息机制的形式实现,我们尽量避免使用刷帧控制器.就采用第二种消息机制吧 我们在GameBaseScene中定义变量players_vector [Player*] 来存放所有的角色: 在添加新对象时,给该对象设置属性_isMyTurn为true 这样所有对象添加完毕后players_vector [Player*]所有的isMyTurn都为true,表示可以调用go方法,进

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 大富翁游戏项目开发-第二十九部分 游戏配音

我从大富翁里提取出来里面的wav音效文件,放到我们的游戏中以增加趣味性,仅供学习研究之用 1.修改AppDelegate.cpp文件 // This function will be called when the app is inactive. When comes a phone call,it's be invoked too void AppDelegate::applicationDidEnterBackground() { Director::getInstance()->stop

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

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