Cocos教程 监听各个GUI控件的交互事件。

前端之家收集整理的这篇文章主要介绍了Cocos教程 监听各个GUI控件的交互事件。前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
 
 
现在的Studio支持同时创建widget和非Widget类型的节点。
但是——基于偷懒的原则,这里只介绍widget类型及继承于Wiget类型控件的事件(即GUI相关控件)。
------------------------------------------------------------------------------------------------------------------------------------------
设置监听某个控件自有事件的流程 cocos2d-x3.x开始,支持自有事件的控件都提供了addEventListener接口来设置各自的监听函数,并使用functional来接收监听函数 ^=RffrlZU 以下以TextFiled为例说明: ?fUlgQ }N 1.编辑器中设置交互或者程序中调用setTouchEnabled(true) jv%kOovj 2.编写一个监听函数
void yourClass::textFieldEvent(Ref *pSender,TextField::EventType type){
switch (type) {
case TextField::EventType::ATTACH_WITH_IME:
CCLOG("获得输入焦点");
break;
case TextField::EventType::DETACH_WITH_IME:
CCLOG("失去输入焦点");
break;
case TextField::EventType::INSERT_TEXT:
CCLOG("输入了文本");
break;
case TextField::EventType::DELETE_BACKWARD:
CCLOG("删除文字");
break;
default:
break;
}
}
3.设置监听: ER5gmmVP@p yourTextField->addEventListener(CC_CALLBACK_2(yourClass::textFieldEvent,this)); \]2]/=2tLd ------------------------------------------------------------------------------------------------------------------------------------------ OwH81#  各个控件支持的自有事件(枚举值):(截止于3.3RC0) .<x&IJ / 输入框(ui::TextFiled)
enum class EventType
{
ATTACH_WITH_IME,//获得输入焦点
DETACH_WITH_IME,//失去输入焦点
INSERT_TEXT,//输入了文本
DELETE_BACKWARD,//删除文字
};
复选框(ui::CheckBox
enum class ui::CheckBox::EventType
{
SELECTED,//勾选了复选框
UNSELECTED//取消勾选了复选框
};
滑动条(ui::Slider)
enum class ui::Slider::EventType
{
ON_PERCENTAGE_CHANGED//百分比改变。
};
滚动层(ui::ScrollView)
enum class ui::ScrollView:: EventType
{
SCROLL_TO_TOP,//滚动到顶时触发。SCROLL_TO_BOTTOM,//滚动到底时触发SCROLL_TO_LEFT,//滚动到左边缘时触发SCROLL_TO_RIGHT,//滚动到右边缘时触发SCROLLING,//滚动时触发BOUNCE_TOP,//顶部回弹效果达到极限时触发BOUNCE_BOTTOM,//底部回弹效果达到极限时触发BOUNCE_LEFT,//左部回弹效果达到极限时触发BOUNCE_RIGHT//右部回弹效果达到极限时触发};
列表容器(ui::ListView)
enum class ui::ListView::EventType
{
ON_SELECTED_ITEM_START,//点中某个项
ON_SELECTED_ITEM_END//点中了某个项并抬起(没有发生滑动)
};
翻页容器(ui::PageView)
enum class EventType
{
TURNING//滚动到了页
};
------------------------------------------------------------------------------------------------------------------------------------------------------- cDFO;Dr 通用触摸事件: 1 u| wMO 其他所有Widget类型的节点都支持addTouchEventListener和addClickEventListener这两个接口。可以通过些接口来接收触摸事件。 aWWU4xe addTouchEventListener的使用步骤如下:(c++下) -QM: q 1.同样的准备好你的widget节点,在编辑器中开启交互(或在代码中setTouchEnabled(true))。 aJ-K?xQ 2.定义一个函数,形式如下 k.vBj~xU @H_427_301@
复制代码
  1. ?
    @H_427_301@
    1
  2. void ACuteClass::onTouchEvent(cocos2d::Ref *ref,Widget::TouchEventType touchType)
  3. {
  4. switch(touchType)
  5. {
  6. case Widget::TouchEventType::BEGAN:
  7. CCLOG("on began");
  8. break;
  9. case Widget::TouchEventType::MOVED:
  10. CCLOG("on moved");
  11. break;
  12. case Widget::TouchEventType::ENDED:
  13. CCLOG("on ended");
  14. break;
  15. case Widget::TouchEventType::CANCELED:
  16. CCLOG("on canceled");
  17. break;
  18. default:
  19. CCLOG("impossible");
  20. }
  21. }
J'SZ wVicyiY] 3.把这个函数传递给addTouchEventListener接口: 4'`{H@]tb your_widget->addTouchEventListener(CC_CALLBACK_2(ACuteClass::onTouchEvent,this));//CC_CALLBACK_2照着写,表示有两个参数的回调。 jkiFLtB@V aE&,]'6 addTouchEventListener的使用方法一样,不同的地方是:回调函数onTouchEvent在一次触摸中只回调一次,触发ENDED时回调。
-------------------------------------------------------------------------------------------------------------------------------------------------------
关于点击没响应的可能: ftvG\Tf 1.没开启交互。 juka0/ 2.控件被挡住。 w+#C-&z 代码纯手打,有啥问题烦请指出啊) <lw` 3aa( ------------------------------------------------------------------------------------------------------------------------------------------------------- (@<lRA ^ 其他细节 #{?PbBE} 1.如何获取触摸事件的坐标: %Y<|;0v 用下面这几个接口: hxVKV?Fl getTouchBeganPosition n>+mL"hs getTouchMovePosition Zhh2v>QOy getTouchEndPosition s>;v!^N?u m?pstuUK( 2.关于ScrollView在某些情况下点到子控件不能拖动的问题 L+Xc-uv["p 现在的Studio支持同时创建widget和非Widget类型的节点。这样会有一个问题。 < Z{HX[y Widget类型接受到触摸事件时,会把这些事件向上层传递,但是在遇到非Widget节点时会停下来。这会导致点击ScrollView等View类中的控件(两者之间有node)拖动时,拖动失败。 4wa`<H&S5 解决方案: xO^:_8=&: 1.设置View中的控件的SwalloTouches属性为false。使控件不截断touch事件 l6YtEHNG 2.或者改下源码:将如下代码替换掉Widget中同名函数 t2F _uCr @H_427_301@
复制代码
  1. ?
    @H_427_301@
    1
  2. {
  3. Widget *widgetParent = nullptr;
  4. for(Node *p = this;widgetParent == nullptr;)
  5. {
  6. p = p->getParent();
  7. if(p)
  8. {
  9. widgetParent = dynamic_cast(p);
  10. }
  11. else
  12. {
  13. return;
  14. }
  15. }
  16. widgetParent->interceptTouchEvent(event,sender,touch);
  17. }
    ?
    @H_427_301@
    1
--------------
无法addTouchEventListener
图片:屏幕快照 2014-07-22 下午4.32.05.png
图片:屏幕快照 2014-07-22 下午4.32.23.png
啊,找到原因了。。。 Yzih-$g TouchEventType有新旧两种。。。。 otJHcGv 用Widget::TouchEventType这种,而不是旧的。。。。
@H_427_301@ @H_427_301@
帮我看看是不是跟你是一样的问题 应该怎么解决
图片:捕获.PNG
@H_427_301@ @H_427_301@
如上。。。。。。
图片:捕获2.PNG
voidWidget::propagateTouchEvent(cocos2d::ui::Widget::TouchEventType event,cocos2d::ui::Widget *sender,cocos2d::Touch *touch)<span style="font-family: arial; font-size: 12px;"></span>
原文链接:https://www.f2er.com/cocos2dx/340021.html

猜你在找的Cocos2d-x相关文章