こんな感じになりました。
今まではタッチしたときの処理のみを実装していましたが、
タッチ処理のイベントハンドラは三つありまして、
// タッチアニメーション
auto listener1 = EventListenerTouchOneByOne::create();
listener1->onTouchBegan = CC_CALLBACK_2(HomeScene::onTouchBegan, this);
listener1->onTouchMoved = CC_CALLBACK_2(HomeScene::onTouchMoved, this);
listener1->onTouchEnded = CC_CALLBACK_2(HomeScene::onTouchEnded, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, this);
onTouchBeganはタッチ開始の処理、
onTouchMovedはタッチ中に動かしたとき、
onTouchEndedは画面から指をリリースときに動作します。
まずは、タッチ処理とスライド処理を分ける必要があるので、
タッチ判定は、タッチ時とリリース時のポジションが同じパーツならばタッチと判定します。
なぜ変更する必要があるのかというと、タッチ開始時に判定しちゃうとスライドの判定ができないのでリリース時にタッチ判定をする必要があります。
これはとりあえず仮の処理です。後で変えるかもしれません。
今回重要なのはスクロール処理。
タッチ開始時にその位置を記憶しておきます。
if(questListMenu.isShow)
{
keepPosition = touch->getLocation();
}
そして、指移動処理で、移動前と移動後の位置の差分をとり、その分だけパーツを移動させます。
void HomeScene::onTouchMoved(cocos2d::Touch *touch, cocos2d::Event *event)
{
log("move(%f, %f)", touch->getLocation().x, touch->getLocation().y);
if(questListMenu.isShow)
{
// Yの差分だけメニューを動かす
float divY = touch->getLocation().y - keepPosition.y;
for(int i = 0; i < QUEST_NUM; i++)
{
questListMenu.questListMenu[i].parts.sprite->setPosition(questListMenu.questListMenu[i].parts.point.x, questListMenu.questListMenu[i].parts.point.y + divY);
questListMenu.questListMenu[i].parts.point.y = questListMenu.questListMenu[i].parts.point.y + divY;
questListMenu.questListMenu[i].questName.label->setPosition(questListMenu.questListMenu[i].questName.point.x, questListMenu.questListMenu[i].questName.point.y + divY);
questListMenu.questListMenu[i].questName.point.y = questListMenu.questListMenu[i].questName.point.y + divY;
}
keepPosition.y += divY;
}
}
思った以上に滑らかなスクロールができました。
「これ以上スクロールさせない」といった処理も必要になりますが、
まぁ、今回はこれで良いでしょう。