【求助】用addTouchEventListener给按钮添加响应失败
cocos2dx吧
全部回复
仅看楼主
level 1
bobijax 楼主
今天在cocostudio中做了一个界面,其中有按钮,就尝试着使用addTouchEventListener方法给它加上触摸响应功能。但是在添加当前layer的方法函数给按钮时出现了错误
error C3867: 'GameSceneLayer::menuBackCallback': function call missing argument list; use '&GameSceneLayer::menuBackCallback' to create a pointer to member
查看了addTouchEventListener方法的代码
void Widget::addTouchEventListener(Widget::ccWidgetTouchCallback callback)
{
this->_touchEventCallback = callback;
}
而Widget::ccWidgetTouchCallback就是一个定义好了参数为(Ref*,Widget::TouchEventType)的std::function
简单来说就是将这个函数指针(?)赋值给了这个Widget(这里就是我的button),之后我写了一个很简单的小程序重现了这个错误。
#include "stdafx.h"
#include <iostream>
#include <functional>
using namespace std;
class A // A相当于当前的layer
{
public:
void ba();
void aa(A*, int d); //这个就是button对应的响应函数
};
typedef std::function<void(A*, int,int)> ccWidgetTouchCallback;
class B // 这东西相当于button
{
public:
ccWidgetTouchCallback func;
};
int main(array<System::String ^> ^args)
{
A a; // 创建layer
a.ba();//相当于layer的init()函数
}
void A::ba()
{
B thisB; //init过程中创建了button,只不过我的程序中他是从cocostudio ui里读取出来的
thisB.func = A::aa; //就是这里,将响应函数赋值给button
}
void A::aa(A*, int d)
{
cout<<"hello";
return;
}
好吧,打了那么一长串其实我不知道解决办法,网上看的例子别人都很正常,就我这里不行,3.0和3.1版本都试过了,也没区别。希望能有人帮忙,告诉我错在哪里,不胜感激。
2014年05月26日 10点05分 1
level 1
bobijax 楼主
今天研究了一下这个function call missing argument list的问题,发现别人在将一个函数作为线程启动函数的时候也出现了同样的问题,做后的结论是这里仅仅是用成员函数是不可以的,必须要一个实际存在的对象的函数或者static方法的函数。
我就想不通了,程序运行到layer->init()的时候layer已经被实例化了啊,按照道理是可以的撒,不过没办法,vs告诉我不可以,只好死马当活马医,把这个函数改成static。
于是编译通过,出现了新的问题。进入该场景进行到给该按钮赋值响应事件的这一步就跳出了,vs自动定位到functional.h文件的_VARIADIC_EXPAND_P1_2X(_CLASS_FUNC_CLASS_2X, , , , )这一句,搜索之后只能看到http://www.cocoachina.com/bbs/simple/?t196734.html 这一个相关的帖子,我真的绝望了,不会是这个版本的cocos2dx有bug吧,连续两个版本都有这个bug?
继续求帮助
2014年05月27日 05点05分 2
level 1
bobijax 楼主
问题基本解决,原因就是我的这个button是放在一个panel里面的,所以每次取他出来的时候要先取panel,再从panel中取button,最后给他加上eventlistener,如果直接取button就会出现我在2楼遇到的情况。
至于static,我这里仍然要加,和网上其他人的教程里还是不一样,不过我真的懒得多研究了,说多了都是泪,一天时间就花在这破东西上了。
2014年05月27日 11点05分 3
level 9
楼主,看的真累,我记得有个专门用来设置回调函数的接口,为什么要这么麻烦呢
2014年06月03日 17点06分 4
我也不知道哎,我看文档上是建议这么添加触摸事件的。
2014年06月04日 02点06分
level 9
换3.1吧
2014年06月04日 02点06分 5
3.1也是一样的
2014年06月04日 02点06分
回复 bobijax :3.1有专门的接口
2014年06月04日 16点06分
level 1
btn_start->addTouchEventListener(Widget::ccWidgetTouchCallback(CC_CALLBACK_2(HelloWorld::touchButton,this)));
void HelloWorld::touchButton(Ref * object,cocos2d::ui::Widget::TouchEventType type)
2014年07月09日 14点07分 6
level 1
楼主 这个问题怎么解决啊 遇到一样的问题了 ?看你上面我的意思是要先初始化panel这玩意吗?我是新手第一次用cocos
2016年05月20日 11点05分 7
1