天天看點

cocos2dx 觸摸鋼琴

1.觸摸鋼琴項目描述

1.1觸摸鋼琴功能描述

實作手指點按琴鍵發出對應的音調,按下位置出現星雲的粒子特效,滾動實作移動到别的琴鍵的位置,按下安卓傳回鍵執行關閉。

1.2觸摸鋼琴所需技術

粒子特效,安卓按鍵監聽。

2.觸摸鋼琴詳細設計

2.1點選琴鍵發出對應的音調

首先建立好UI,底層為一個滾動層,在上面按照位置添加對應的琴鍵按鈕,每個琴鍵按鈕要設定Tag,和按照音調設定名字。注意:黑色琴鍵按鈕的要通過cocostudio的對象結構樹調整到白鍵的下面,這樣點選黑鍵時才會優先響應黑鍵。

通過Tag值周遊得每一個按鈕控件,如果存在對應的按鈕對象,就綁定響應。

or (int i = 0; i < 70; i++)
  {
    auto btn = (Button*)Helper::seekWidgetByTag(UI, i);
    if (btn)
    {
      btn->addTouchEventListener(this, toucheventselector(CPaino::onBtnTouch));
    }
  }      

在響應函數onBtnTouch中,被點選的對象最為Ref傳入到函數中。對傳入的對象進行類型轉換,就可以得到名字,然後拼出一個聲音檔案路徑名,播放該聲音檔案就可演奏發聲。

/******************************************************
函數功能:觸摸按鍵響應
傳入參數:Ref* target:被點選的按鈕對象
      TouchEventType type:點選的類型
*******************************************************/
void CPaino::onBtnTouch(Ref* target, TouchEventType type)
{
  auto btn = (Button*)target;
  if (btn && type == TouchEventType::TOUCH_EVENT_BEGAN)
  {
    std::string sBtnName = btn->getName();
    std::string sSoundName = StringUtils::format("sound/%s.wav", sBtnName.c_str()); 
    CocosDenshion::SimpleAudioEngine::getInstance()->playEffect(sSoundName.c_str());
  }
}      

2.2觸摸位置産生星雲粒子特效

采用cocos2dx中的粒子特效。注意要在琴鍵目前層上在挂載一個觸控層。在觸摸的點處播放粒子特效。

2.3監聽安卓按鍵

初始化中增加允許接收按鍵事件的函數。

auto listenerKeyPad = EventListenerKeyboard::create();
  listenerKeyPad->onKeyReleased = CC_CALLBACK_2(CPaino::onKeyPadReleased,this);
  _eventDispatcher->addEventListenerWithSceneGraphPriority(listenerKeyPad,this);      

4.觸摸鋼琴運作結果