我仿某小游戏,写了个弹钢琴的小游戏,
然后重写了这几个单数形式的触摸函数
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: 先谢谢各位了。
谢谢版主的提醒,