酱油带你用cocos2dx3.0完成一款战棋游戏 (曹操传)(一)地图制作篇 1

1 篇文章 0 订阅
1 篇文章 0 订阅

这是酱油第一次写博客,所以如果有什么写的不好,大家多多海涵啊。那么废话就不多说了,直接进入正题吧。

制作一款战棋游戏,在酱油看来最大的难度便是 ai的设计以及 实现剧本对游戏整体的控制,当然啦,这都是比较深的问题了,酱油会放到以后的章节来加以介绍。那么现在就正式开始打酱油啦。。。

首先,制作一款战棋游戏我们需要什么,首先,我们得有一张地图是吧。在这里,我隆重推荐一款地图制作工具 tiled.接下来放一个地图制作的视频

http://v.youku.com/v_show/id_XNzQwMzQyMTUy.html。不管有没有tiled使用经验的都可以看看,因为这里涉及到了战棋地图的一些设计思路。

那好,现在就开始上代码了。首先,战棋游戏说白了,也是一种格子游戏,那么,我们就得有一个类,来保存格子数据,在这里,我命名为PieceData,以后就都用图块来称呼。

class PieceData
{
public:
static void Exchange(PieceData* moveBegin,PieceData* moveEnd);
void setRoleDataInPiece(std::string roleName,int ID,int power);
void init(const TerrainData* terrainData,std::string pieceName,Point p1,Point p2);
void clear();
PieceData();
private:
//这四个是随着角色的变化而变化的
CREATE_GET_SET(int,power,Power)//改图块角色所属势力,有敌(-1)我(1)友(2)军3种 0代表没


//战场的每一个角色都有一个唯一ID,包括小兵
CREATE_GET_SET(int,ID,ID)
CREATE_GET_SET(std::string,roleName,RoleName)//图块当前角色名,没角色为空;
CREATE_GET_SET(bool,isHaveRole,IsHaveRole)//图块上是否有角色


CREATE_GET_SET(const TerrainData*,terrainData,TerrainData)//该图块地形数据
CREATE_GET_SET(bool,canMove,CanMove)
CREATE_GET_SET(std::string,terrain,Terrain)//所属地形名(这个名字和TerrainData名不一定一样)
CREATE_GET_SET(Point,coordinateOfMap,CoordinateOfMap)//在图块中的坐标
CREATE_GET_SET(Point,coordinate,Coordinate)//在地图中的坐标
};

这个图块信息保存着战场最重要的数据,查找角色及剧本和ai的实现都要使用到图块的数据。。

好了,图块数据有了,接下来,我们就要有一个管理整个地图的类,我命名为MapData,地图类就不一一列出函数了,接下来,就放上如何加载地图的函数



MapData* MapData::createWithTMXMap(const char *fileName)
{
MapData *mapData = MapData::create();
mapData->tmxMap = TMXTiledMap::create(fileName);


//对象层,用来设置战斗角色起始坐标(也就是制作地图时对象层的作用)
mapData->playerBegin = mapData->tmxMap->objectGroupNamed("playerBegin");
//如果有多个角色和多个起始点的话那么角色的起始点的分布要考虑一下,还有,一般来说,角色数应该少于起始点数
//AI对象层
mapData->enemyAIBegin = mapData->tmxMap->objectGroupNamed("enemyAIBegin");


//是否有友军是可选的,但敌军是必须滴.
mapData->friendAIBegin = mapData->tmxMap->objectGroupNamed("friendAIBegin");


Size mapSize = mapData->tmxMap->getMapSize();
mapData->mapSize = mapSize;


Size tiledSize = mapData->tmxMap->getTileSize();
mapData->MapContenSize = Size(tiledSize.width * mapSize.width,tiledSize.height * mapSize.height);
//这里要注意,因为设置了缩放比例,所以图块的大小要进行相应的设置,
//这个是提供给外部使用的,内部使用的时候,是不用理会缩放比例的


//动态生成图块数,每一个格子即为一个图块数据
int size = mapSize.height * mapSize.width;
mapData->pieceData = new PieceData[size];


mapData->arrayOfTerrainData = TerrainDataManager::shardTerrainDataManager()->getTerrainData();


Vector<Node*> arrayOfLayer = mapData->tmxMap->getChildren();

//这个for循环的作用是设置每个图块的数据
for(int x = 0;x<mapSize.width;x++)
{
//这里要注意,tiledMap的坐标是以左上方为原点的
for(int y = 0;y<mapSize.height;y++)
{
int gid;
std::string layerName;

//先得到所有的图层
Vector<Node*>::iterator iter = arrayOfLayer.begin();

for(;iter!=arrayOfLayer.end();iter++)
{
TMXLayer* tmxLayer = (TMXLayer*)*iter;
gid = tmxLayer->getTileGIDAt(Point(x,mapSize.height-1-y));

//如果gid有数值的话说明这个图块属于这个图层
if(gid)
{
layerName = Mytools::shardMytools()->getStrOfDeleteFirstNumber(tmxLayer->getLayerName());
break;
}
}

通过图层名字找到地形数据,(注意,多个图层对应1个地形数据 比如说 城墙和山地都是对应的 石头这个地形数据 因为都是不可移动)
TerrainData* terrainData = mapData->searchTerrainDataByName(layerName);
(mapData->pieceData+(int)x+(int)y*(int)mapSize.width)->init(terrainData,layerName,Point(x,y),
//坐标设置的是中间点
Point((x+0.5)*tiledSize.width,(y+0.5)*tiledSize.height));
}
}

记得要retain ,因为mapData没有马上addChild,否则会被回收。。

mapData->retain();
return mapData;
}

之后这个读取进来的mapData并不会被马上显示出来,而是会被加入到一个游戏数据管理类保存 ,我命名为GameData  至于GameData我暂时就先不详细解释了,因为这个类设计到太多东西。总之,只要先理解到这个类存放这游戏的大量数据,包括玩家数据和关卡等等大量数据,用的是单例模式,只要一开始游戏就一直存在,直到游戏结束。

之后要显示地图的时候,我们只需要简单的addChild就可以了,node节点是管理整个战斗界面(不包括ui),可以实现地图的拖动以及缩放。


TMXTiledMap* map = GameData::shardGameData()->getMapData()->getMap();
node->addChild(map,ZORDER_MAP); //地图是第0层;

好了,今天的战棋制作就先讲到这儿,大家应该大概了解了怎么地图的流程,下一章,酱油会讲解一下怎么实现地图的拖动以及放大缩小。。

那好,加上地图的效果就是这样啦,ui和人物先暂时不管。。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值