1、在布局文件中添加一个ScrollView,并设置它的背景为一张地面图片,可以使用AndroidStudio提供的图片资源或者自己添加一张图片。
2、在ScrollView中添加需要放在地面上的View,例如一些按钮、文字等。
3、设置后,ScrollView的背景将显示为一张地面图片,而添加的View将显示在地面图片上方,从而实现模拟地面的效果。
且看 CCMenu 的touchbegan函数:bool CCMenu::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
CC_UNUSED_PARAM(event)
if (m_eState != kCCMenuStateWaiting || ! m_bVisible || !m_bEnabled)
{
return false
}
for (CCNode *c = this->m_pParentc != NULLc = c->getParent())
{
if (c->isVisible() == false)
{
return false
}
}
m_pSelectedItem = this->itemForTouch(touch)
if (m_pSelectedItem)
{
m_eState = kCCMenuStateTrackingTouch
m_pSelectedItem->selected()
return true
}
return false
}
touchbegan时响应点击事件的一部分因素在于那个for循环,只有当前menu的所有父节点可见时,才能继续响应点击事件。
除此之外,当该menu可见时,那么该menu就会遍历左右的children,且看
CCMenuItem* CCMenu::itemForTouch(CCTouch *touch)
{
CCPoint touchLocation = touch->getLocation()
if (m_pChildren &&m_pChildren->count() >0)
{
CCObject* pObject = NULL
CCARRAY_FOREACH(m_pChildren, pObject)
{
CCMenuItem* pChild = dynamic_cast<CCMenuItem*>(pObject)
if (pChild &&pChild->isVisible() &&pChild->isEnabled())
{
CCPoint local = pChild->convertToNodeSpace(touchLocation)
CCRect r = pChild->rect()
r.origin = CCPointZero
if (r.containsPoint(local))
{
return pChild
}
}
}
}
return NULL
}
当且仅当 if (pChild &&pChild->isVisible() &&pChild->isEnabled()) Child存在 可见 使能 时就会响应对应的点击时间。
于是,又根据cocos2d touch事件的分发规则,先响应优先级高的layer,然后menu就先响应点击了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)