首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cocos2d-x 3.0 onTouchMoved不起作用

Cocos2d-x 3.0 onTouchMoved不起作用
EN

Stack Overflow用户
提问于 2014-05-26 08:15:51
回答 3查看 1.4K关注 0票数 1

我正在尝试让触摸事件在我的游戏中运行,而onTouchDown运行得很好。我的问题出现在onTouchMoved上,尽管它在编译过程中没有抛出任何错误,但它似乎不起作用。我似乎找不到任何在这种情况下有帮助的文档,而且我在网上找到的大多数方法似乎也不起作用。

我的代码: LevelOneScene.h

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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);
}
EN

回答 3

Stack Overflow用户

发布于 2015-01-03 13:06:00

解决方案是在onTouchBegan方法的末尾返回true

我也遇到了同样的问题:只有onTouchBegan会触发,而onTouchMoved或其他任何一个都不会。我猜它是表示触摸事件是否继续传播的布尔值,类似于jQuery中的事件结构。

票数 4
EN

Stack Overflow用户

发布于 2014-05-26 14:15:18

谢谢你的更正(@Ohthepain),我一定是把它和别的什么搞混了!

以下是我认为您的代码的错误之处

代码语言:javascript
运行
复制
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);

应该是这样的

代码语言:javascript
运行
复制
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);

最后一行是我看到问题的地方。

票数 0
EN

Stack Overflow用户

发布于 2014-05-26 16:45:45

看起来你的处理程序把Event*作为他们的第二个参数,但是你的'this‘指针的类型是LevelOneScene*。

我会这样做:

代码语言:javascript
运行
复制
// Create the upvalue - yes, this line is necessary!
LevelOneScene* sceneArg = this;
touchListener->onTouchMoved = [sceneArg](Touch* touch, Event* event)->bool {
            sceneArg->ccTouchBegan(touch, event);
        };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23861154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档