【已解决】问问ccTouchBegan与ccTouchMoved之间使用的问题

我仿某小游戏,写了个弹钢琴的小游戏,

然后重写了这几个单数形式的触摸函数

        virtual bool ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent );
    virtual void ccTouchMoved( CCTouch *pTouch, CCEvent *pEvent );
    virtual void ccTouchEnded( CCTouch *pTouch, CCEvent *pEvent );


```



而我现在遇到的问题是,基本能实现其弹钢琴功能,在电脑上也没看出什么明显问题,但把
游戏装上平板电脑上时,通过在琴键上划过(像在真实的钢琴上用手划过那样)时就出现有重音的情况,
比如我在 do, re, mi这几个键上划过来划过去,就会出现 do 响两次(指划过去不包括划回来),
re 响两次, mi 响两次,

而我在ccTouchBegan与ccTouchMoved两函数中都是放入了这样一个方法

/*********************************************
* 函数名:PlayPianoActionAndMusic
* 功  能:播放钢琴键动画与其相应琴键的音效
* 参  数:pTouch--触摸动作参数
* 时  间:2014年4月19日11:06:19
* 编  写:OOXX
*********************************************/
void CPainoBG::PlayPianoActionAndMusic(CCTouch *pTouch)
{
    CCPoint poi = pTouch->getLocationInView();// 获得点击坐标值     
    CCPoint poi3 = CCDirector::sharedDirector()->convertToGL(poi); // 转换为OpneGL坐标系

    CCLOG("UI:x=%f, y = %f", poi2.x, poi2.y);
    CCLOG("GL:x=%f, y = %f", poi3.x, poi3.y);


    //////////////////////////////////////////////////////////////////////////
    int nIndex             = 0; 
    CCObject  *obj         = NULL;
    CCObject  *musicalObj  = NULL;
    float     keyX = 0.0f, keyY = 0.0f;// 存储钢琴每个键的坐标

    CCArray *arr = pianoManager->GetArraryData(MUSICALNOTE);
    
    // 遍历所有钢琴键
    CCARRAY_FOREACH(pianoManager->GetArraryData(PIANOKEY), obj)
    {
        // 取得钢琴键对象
        pianoKey = (CPianoKey *)obj;
        // 取音符对象
        musicalObj = arr->objectAtIndex(nIndex);
        m_musicalNote = (CMusicalNote *)musicalObj;
        // 取得每个钢琴键的坐标
        pianoKey->getPosition(&keyX, &keyY);
        // 因为钢琴键的锚点在图片中心,所以范围要以图片的一半作为范围判断
        if( ((poi3.x >= keyX - PIANO_KEY_WIDTH / 2) && (poi3.x <= keyX + PIANO_KEY_WIDTH / 2)) &&
            ((poi3.y >= keyY - PIANO_KEY_HEIGH) && (poi3.y <= keyY)) )
        {
            CCLOG("at piano domain");
            //if (m_bSoundEffectSwitch == false)
            {
                SimpleAudioEngine::sharedEngine()->playEffect(CCFileUtils::sharedFileUtils()->fullPathForFilename(strPianoMusic.c_str()).c_str());
            }
            
            pianoKey->PianoKeyAction();
            m_musicalNote->MusicalNoteAction();
        }
        ++nIndex;
    }
}


```




现在想的是是否触发ccTouchMoved的过程中也触发了ccTouchBegan,所以在琴键上划的过程,会出现响两次的情况,
但我控制了ccTouchMoved不发声,那我在划的时候又变成了没有声音,

请问我该 怎么处理这两函数,才能把这出现重音的问题消除呢?:10:  先谢谢各位了。

Move是一动就响应的 Began是你点下去的时候触发 你可以自己写一个播放间隔判断 比如当前touchbegan的时候在do 然后划的时候do就不播放了
但是最好的方法是把音效播放放到别的地方去

:12: 谢谢版主的提醒,
现在我用CCLOG观察了三个函数的运行方法,ccTouchBegan 是在按下去的时候触发,你手不松开,无论怎么划动都不会再触发
ccTouchBegan, 当你手一松开 就触发 ccTouchEnded。

而ccTouchMoved,反正你一直划就一直触发,也是当你手松开才触发ccTouchEnded。

然后我对上面这段代码作了一些修改,代码略为冗余:12:

 // 因为钢琴键的锚点在图片中心,所以范围要以图片的一半作为范围判断
 if( ((poi3.x >= keyX - PIANO_KEY_WIDTH / 2) && (poi3.x <= keyX + PIANO_KEY_WIDTH / 2)) &&
 ((poi3.y >= keyY - PIANO_KEY_HEIGH) && (poi3.y <= keyY)) )
 {
 //CCLOG("at piano domain");
 
 if(enTouchEvent == TOUCHMOVED)
 {
 if(m_nPreClcik != m_nCurrClick)
 {// 为防止在同一个按键上反复划动,声音与动作也会重复播放
 SimpleAudioEngine::sharedEngine()->playEffect(CCFileUtils::sharedFileUtils()->fullPathForFilename(strPianoMusic.c_str()).c_str());
 m_musicalNote->MusicalNoteAction();
 pianoKey->PianoKeyAction();
 }


 if(m_nCurrClick != -1 && m_nCurrClick != m_nPreClcik)
 {// 第一次以后,当前的索引与前一索引不同,就跑这里,记下当前索引,以防止动作音效重复播放的问题
 m_nPreClcik = m_nCurrClick;
 }
 else
 {// 当第一次点击琴键时跑这里,记录下琴键的索引
 m_nCurrClick = nIndex;
 }
 }
 else
 {
 SimpleAudioEngine::sharedEngine()->playEffect(CCFileUtils::sharedFileUtils()->fullPathForFilename(strPianoMusic.c_str()).c_str());
 m_musicalNote->MusicalNoteAction();
 pianoKey->PianoKeyAction();
 }
 
 }


```


以按键的索引判断,如果按键还在之前的琴键上MOVE,就不再播放, 也算是解决问题了。:9: