前几天,为了做一个新的安卓项目,因为涉及到Cocos2d-x 2.0旧版本的项目移植,所以准备要用2.0版本的做,但是新功能的需求可是难煞我也!因为新功能是 鼠标悬停。
各位移动程序猿们,你们能想象到纠结了吧 不过运气还算不错,前不久推出的Cocos2d-x3.0 好像有了这个功能,可惜,网上并没有看到教程类的东西。经过几天摸索,终于得以实现,现在把我的一些心得写下来。以便有些童鞋也悲催地遇到这个问题,能够有所借鉴!!
先来说一下3.0这次更新版本我认为对我们开发来讲直观上变动最大的地方:触摸响应机制的变化。
熟悉了继承代理,重写touch方法的机制 改版后机制有所改变,下面贴段代码:
//创建一个精灵
auto m_sprite = Sprite::create("");
//创建一个触摸监听
auto listener1 = EventListenerTouchOneByOne::create();
//触摸分发事件
listener1->setSwallowTouches(true);//设置是否想下传递触摸
listener1->onTouchBegan = CC_CALLBACK_1(Pet::touchbegan, this);
listener1->onTouchMoved = CC_CALLBACK_1(Pet::touchmove, this);
listener1->onTouchEnded = CC_CALLBACK_1(Pet::touchend, this);
listener1->onTouchCancelled = CC_CALLBACK_1(Pet::touchcancell, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1 ,m_sprite);
这是我的一个Pet类
虽然新特性是06.listener->onTouchBegan ](Touch* touch, Event* event) {
do_some_thing(); }; 但是为了代码的可读性 我还是选择了调用其他的方法。这里见仁见智。
好了,接下来说一下鼠标的响应机制:
首先说一下 新特性里 发现了四个新函数
onMouseMove;
onMouseUp;
onMouseDown;
onMouseScroll;
看着是有点熟悉吧 很像2.0的CCTouchBegan CCTouchMoved CCTouchEnded CCTouchCancelled吧 没错, onMouseDown按下,onMouseUp抬起,onMouseMove移动,
onMouseScroll滚轮。
下面来看一下怎么实现鼠标悬停。
//创建一个精灵
auto m_sprite = Sprite::create("");
//创建鼠标监听
auto listener = EventListenerMouse::create();
//分发MouseMove事件
listener->onMouseMove = CC_CALLBACK_1(GroundLayer::mousemove, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, m_sprite);
mousemove函数的声明:
void mousemove(Event* event);
mousemove函数的实现:
void GroundLayer::mousemove(Event* event)
{
//CCLog("mouse move!!!!!!!!!!!!!!!!!!!!!!");
EventMouse* e = (EventMouse*)event;
CCLog("%f",e->getCursorY());//这句代码输出的是什么呢 就是鼠标的坐标Y了。
float x = e->getCursorX();
float y = e->getCursorY();
}
不想JAVA端的鼠标机制 JAVA端有一个hover函数 就是鼠标悬停的接口,而Cocos2d-x3.0的更新却
还保留着之前touch机制的一些模型。这里 在mousemove的函数里 根据鼠标的坐标 我们就可以实现
某个区域的鼠标悬停接口了。
大家在v3.0这个未知多深的坑里,还要继续摸爬滚打,且爬且珍惜吧。GOOD LUCKY!



谢谢楼主的分享 刚学习呢 正好想了解这方面功能 感谢