我正在尝试让触摸事件在我的游戏中运行,而onTouchDown运行得很好。我的问题出现在onTouchMoved上,尽管它在编译过程中没有抛出任何错误,但它似乎不起作用。我似乎找不到任何在这种情况下有帮助的文档,而且我在网上找到的大多数方法似乎也不起作用。
我的代码: LevelOneScene.h
class LevelOneScene : public cocos2d::Layer
{
public:
// there's no 'id' in cpp, so we recommend returning the class instance pointer
static cocos2d::Scene* createScene();
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
void update(float dt);
// a selector callback
//void menuCloseCallback(cocos2d::Ref* pSender);
void changeScene(cocos2d::Ref* pSender);
//Screen Data
Point origin;
Size visibleSize;
//add Spirtes
void addShip();
Ship* ship;
void addBackground();
Sprite* background;
bool onTap(Touch* touch,
Event* touchEvent);
// implement the "static create()" method manually
CREATE_FUNC(LevelOneScene);
private:
virtual void onEnter();
virtual void onExit();
void onTouchMoved(Touch* touch,
Event* touchEvent);};
LevelOneScene.cpp
bool LevelOneScene::onTap(Touch* touch,
Event* touchEvent)
{
CCLOG("Screen was Tapped");
return 0;
}
void LevelOneScene::onTouchMoved(Touch* touch,
Event* touchEvent)
{
CCLOG("Touch Moved\n");
ship->stopAllActions();
auto moveLeft = cocos2d::MoveTo::create(.5, cocos2d::Point(touch->getLocation().x,ship->getPositionY()));
ship->runAction(moveLeft);
}
void LevelOneScene::update(float dt)
{
}
void LevelOneScene::onExit()
{
Layer::onExit();
}
void LevelOneScene::onEnter()
{
Layer::onEnter();
auto touchListener = EventListenerTouchOneByOne::create();
touchListener->setSwallowTouches(true);
touchListener->onTouchBegan = CC_CALLBACK_2(LevelOneScene::onTap, this);
touchListener->onTouchMoved = CC_CALLBACK_2(LevelOneScene::onTouchMoved, this);
_eventDispatcher->addEventListenerWithFixedPriority(touchListener, -1);
}
发布于 2015-01-03 13:06:00
解决方案是在onTouchBegan
方法的末尾返回true
。
我也遇到了同样的问题:只有onTouchBegan
会触发,而onTouchMoved
或其他任何一个都不会。我猜它是表示触摸事件是否继续传播的布尔值,类似于jQuery中的事件结构。
发布于 2014-05-26 14:15:18
谢谢你的更正(@Ohthepain),我一定是把它和别的什么搞混了!
以下是我认为您的代码的错误之处
auto touchListener = EventListenerTouchOneByOne::create();
touchListener->setSwallowTouches(true);
touchListener->onTouchBegan = CC_CALLBACK_2(LevelOneScene::onTap, this);
touchListener->onTouchMoved = CC_CALLBACK_2(LevelOneScene::onTouchMoved, this);
_eventDispatcher->addEventListenerWithFixedPriority(touchListener, -1);
应该是这样的
auto dispatcher = Director::getInstance()->getEventDispatcher();
auto touchListener = EventListenerTouchOneByOne::create();
touchListener->onTouchBegan = CC_CALLBACK_2(LevelOneScene::onTap, this);
touchListener->onTouchMoved = CC_CALLBACK_2(LevelOneScene::onTouchMoved, this);
//THIS LINE
dispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);
最后一行是我看到问题的地方。
发布于 2014-05-26 16:45:45
看起来你的处理程序把Event*作为他们的第二个参数,但是你的'this‘指针的类型是LevelOneScene*。
我会这样做:
// Create the upvalue - yes, this line is necessary!
LevelOneScene* sceneArg = this;
touchListener->onTouchMoved = [sceneArg](Touch* touch, Event* event)->bool {
sceneArg->ccTouchBegan(touch, event);
};
https://stackoverflow.com/questions/23861154
复制相似问题