Cocos2dx 瓦片地图学习笔记

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坐标表示的位置,并将玩家精灵对象添加为地图对象的子节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值