Cocos ui控件Button 一个误导人的小错误

    xiaoxiao2026-02-26  7

    版本:cocos2d-x 3.12     语言:C++

     

    今天开始996,终于要开始加死人不偿命的生活了。哈哈,今天给大家带来一个我毕设中的小失误。

     

    不知道还有没有人在用CocosStudio,我们项目中可怜都没得用,然后都是自己写ui的,别的组已经在使用了,感觉用起来很舒服的,不知道为什么停更了,然后现在只有个js的creator,真不知道触控那帮子人怎么想的。

     

    反正在我之前的毕设中,使用到了一个ui界面放了一个Button的控件,来看一下代码(我现在知道怎么插代码了):

    Button* button= Button::create("res/HelloWorld.png"); button->setPosition(Vec2(200, 200)); this->addChild(button); button->addTouchEventListener(this,toucheventselector(SceneTest::touch));

     

    这是当然是测试的代码,实际中的代码就不拿出来了。创建了一个Button后,设置了一个常规属性,最后添加了触碰事件。

     

    再来看看触碰事件:

    void SceneTest::touch(Ref* target,TouchEventType type) { CCLOG("you touch me! you bitch!"); }

     

    运行一下:

     

    没有任何问题,但是有个挺不爽的地方:

     

    虽然可以运行,但是上面警告声明被否决了,毕设期间也不懂,反正就这么过了,这几天又仔细研究了一下。

     

    首先来看看另一种的注册方式:

    button->addClickEventListener(CC_CALLBACK_1(SceneTest::click, this));

     

    使用Click进行注册:

    void SceneTest::click(Ref* target) { CCLOG("you love me"); }

     

    打印结果:

     

    Click只在Ended的时候会触发。好了,没有任何问题。但是addTouchEventListener的方式应该是2.0时代使用的方法,我们现在使用3.0的方法试试:

    button->addTouchEventListener(CC_CALLBACK_2(SceneTest::touch, this));

     

    发生错误了:

     

    一堆,不过我在我自己项目中并不是报这个错误,报的是什么std::invoke为找到重载函数,如果报这个错误的话,我早就解决了,大家仔细看看。

     

    没错,把方法这么改写就OK了:

    touch(Ref*target,Widget::TouchEventTypetype)

     

    Widget::TouchEventType和TouchEventType并不是同一个东西,我晕。

     

    昨天draw方法相关的一个标志转换问题解决后,警告大幅度的减少了。今天又解决了这个问题,我想只要耐心这些警告也都不会出现,每次要在100多个警告里面找一个错误实在难受。

     

    总结:

    UI控件中写回调函数,不要忘记第二个参数是Widget中的TouchEventType,虽然他们的取值是一样的、数量也是一样的、表示的内容也是一样的。用最近流行的话说就是MDZZ。

    转载请注明原文地址: https://ju.6miu.com/read-1307401.html
    最新回复(0)