cocos2dx Tiled地图与鼠标交互

在Map类中添加鼠标事件

GameMap.h

namespace TiledMap
{
	class Map
	{
	public:
		
        ...
    
        //声明指针Layer
        cocos2d::experimental::TMXLayer* Layer = nullptr;
        //声明layerSize
		cocos2d::Size layerSize;
        //声明mapTileSize
		cocos2d::Size mapTileSize;
		
        //OpenGL坐标转Tile坐标
		cocos2d::Vec2 tileCoordForPosition(const cocos2d::Vec2& position);
        //Tile坐标转OpenGL坐标
		cocos2d::Vec2 positionForTileCoord(const cocos2d::Vec2& tileCoord);

        ...

	private:
		
        ...

        //创建一个鼠标监听
		cocos2d::EventListenerMouse *listenerMouse = cocos2d::EventListenerMouse::create();
        //声明onMouseMove方法
		void onMouseMove(cocos2d::EventMouse* event);

	};
};

GameMap.cpp

void Map::initMap() 
{
		
    ...

    /*
    layer2就是Tiled所编辑的图层名字,
    在tmx文件中 <layer name="layer2" width="15" height="10"> 为属性name的值
    */
    Layer = TMap->getLayer("layer2");
    //引用layer2的tile尺寸
    mapTileSize = Layer->getMapTileSize();
    //引用layer2的尺寸
    layerSize = Layer->getLayerSize();
    //让效果更明显 把地图往下移动100像素
    Layer->setPositionY(-100);
    //注册鼠标监听
    listenerMouse->onMouseMove = CC_CALLBACK_1(Map::onMouseMove, this);
    //绑定鼠标监听
    Layer->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listenerMouse, Layer);

};
void Map::onMouseMove(EventMouse* event)
{
    //声明静态变量pointA用来实现MouseEnter,MouseLeave的效果
    static Vec2 pointA;
    /*
    Layer坐标转换为tile坐标
    Layer->convertToNodeSpace(), 地图会切换移动,这里必须把屏幕的坐标转换为Layer内部坐标
    getLocationInView() 从屏幕坐标左下角为0,0点取值
    */
    Vec2 pointB = Map::tileCoordForPosition(Layer->convertToNodeSpace(event->getLocationInView()));
    
    /*
    Layer->getTileAt(pointB) != nullptr
    这里需要判断下当前tile坐标是否有对应的node,不然会报错
    pointA != pointB
    是否已选中过
    */
    if (Layer->getTileAt(pointB) != nullptr && pointA != pointB) {
        
        //给鼠标当前坐标对应的tile node 加个颜色
        Layer->getTileAt(pointB)->setColor(Color3B(255, 0, 0));

        if (Layer->getTileAt(pointA) != nullptr && pointA != pointB) {
            
            //给鼠标当前坐标对应的tile node 加个颜色
            Layer->getTileAt(pointA)->setColor(Color3B(255, 255, 255));
        }

        //这里表示已选中;
        pointA = pointB;
    }

};


// OpenGL坐标转成格子坐标(正交地图)
Vec2 Map::tileCoordForPosition(const Vec2& position)
{
    //鼠标当前屏幕x坐标 / tile宽度 = x轴tile位置 
	int x = position.x / mapTileSize.width;
    //因左下为0,0点,(Layer总高 - 鼠标y轴坐标) / tile高度 = y轴tile位置
	int y = (layerSize.height * mapTileSize.height - position.y) / mapTileSize.height;
	return Vec2(x, y);
}
// tile坐标转成瓦片格子中心的OpenGL坐标(正交地图)
Vec2 Map::positionForTileCoord(const Vec2& tileCoord)
{
	int x = tileCoord.x * mapTileSize.width + mapTileSize.width / 2;
	int y = (layerSize.height - tileCoord.y) * mapTileSize.height - mapTileSize.height / 2;
	return Vec2(x, y);
}


 

红色方块就是当前鼠标所在tile的位置

只绑定了layer2层的鼠标事件 所以layer1层不会触发效果

 

 

转载于:https://my.oschina.net/dsc1025/blog/819755

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值