1、演示使用Tiled地图示例:
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
// 关闭菜单
auto closeItem = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width / 2,
origin.y + closeItem->getContentSize().height / 2));
auto menu = Menu::create(closeItem, NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu, 1);
// 获取屏幕宽度和高度
_screenWidth = visibleSize.width;
_screenHeight = visibleSize.height;
// 调用TMXTiledMap的函数读取TileMap.tmx文件创建一个瓦片地图对象
_tileMap = TMXTiledMap::create("TileMap.tmx");
// 把地图的锚点和位置都设置为原点,这样可以使地图的左下角与屏幕的左下角对齐
_tileMap->setAnchorPoint(Vec2::ZERO);
_tileMap->setPosition(Vec2::ZERO);
// 将地图添加为当前层的子节点
this->addChild(_tileMap, -1);
// 调用TMXTiledMap的getObjectGroup方法获取对象层
auto objects = _tileMap->getObjectGroup("Objects");
// 根据对象名称获取对象的信息
ValueMap map = objects->getObject("player");
// 获取地图中设置的player对象的x和y值
int x = map.at("x").asInt();
int y = map.at("y").asInt();
// 创建玩家精灵,并将地图中对象的x和y值作为玩家精灵对象出现的位置
_player = Sprite::create("player.png");
_player->setPosition(x, y);
// 将玩家精灵添加为地图的子节点
_tileMap->addChild(_player);
// 创建事件监听器
auto planeListener = EventListenerTouchOneByOne::create();
// 响应触摸事件函数
planeListener->onTouchBegan = [](Touch* touch, Event* event) {return true; };
planeListener->onTouchEnded = [this](Touch* touch, Event* event) {
// OpenGL坐标
Vec2 touchLocation = touch->getLocation();
// 相对Node的坐标
Vec2 nodeLocation = this->convertToNodeSpace(touchLocation);
// 镜像反转,使玩家面对移动的方向
if (_player->getPosition().x < nodeLocation.x) {
if (!_player->isFlippedX())
_player->setFlippedX(true);
}
else
{
if (_player->isFlippedX())
_player->setFlippedX(false);
}
// 重新设置玩家位置
_player->setPosition(nodeLocation);
// 调整视角中心位置让地图随玩家一起移动
this->setViewpointCenter(_player->getPosition());
};
// 添加场景优先事件监听器
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(planeListener, this);
(1)调用TMXTiledMap类的create方法,使用Tiled地图编辑器创建的TileMap.tmx文件,创建一个瓦片地图对象,并把地图的锚点和位置都设为原点,使地图的左下角与屏幕的左下角对齐,最后将瓦片地图添加为当前层的子节点。
(2)调用TMXTiledMap类的getObjectGroup函数根据之前设置的对象层的name即“Object”获取对象层,该方法返回一个TMXObjectGroup对象。接下来调用TMXObjectGroup的getObject函数根据之前设置的对象name即“player”获取一个ValueMap,这个ValueMap包含了player所代表的的地图对象的X坐标和Y坐标宽度和高度等一系列值。最后创建一个精灵对象,精灵对象的坐标设置为X坐标和Y坐标表示的位置,并将玩家精灵对象添加为地图对象的子节点。