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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cocos2d是一个流行的游戏开发引擎,而Tiled Map Editor是一个针对2D游戏开发的地图编辑器软件。这两者结合使用,可以帮助开发者更高效、便捷地制作游戏中的地图cocos2d引擎提供了丰富的功能和工具,用于创建2D游戏。而Tiled Map Editor则是用于制作游戏地图的工具。它提供了一个用户友好的界面,可以在里面创建、编辑和管理游戏地图。用户可以在Tiled Map Editor中自定义地图的大小、背景色、分块大小等属性。 在制作地图时,Tiled Map Editor允许用户在画布上绘制各种元素,如地面、墙壁、河流等。用户还可以在画布上放置各种可交互的物体,如玩家、敌人、道具等。这些元素和物体都可以通过Tiled Map Editor方便地进行定位、调整和编辑。 当地图制作完成后,开发者可以将其导出为某种格式,如XML或JSON。然后,cocos2d引擎可以读取这些格式的地图数据,将其加载到游戏中。cocos2d提供了专门的API和函数,用于解析和渲染Tiled Map Editor导出的地图数据。这样,游戏就可以实时显示地图,并根据实际情况进行交互。 使用cocos2d和Tiled Map Editor可以极大地简化游戏地图的制作过程。它们提供了一套完善的工具链,使开发者可以快速有效地创建、编辑和使用游戏地图。无论是在平面视角的角色扮演游戏,还是在横版平台游戏cocos2d和Tiled Map Editor都可以为开发者带来很大的便利和效率提升。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值