cocos2d-x 在CCTableview里面添加按钮效果,CCMenu,CCSprite,CCControlButton

本文探讨了在Cocos2d-x中实现滚动列表效果的多种方法,并详细介绍了每种方法的优缺点,包括使用CCSprite、CCMenu、CCControlButton等组件,以及解决优先级冲突和隐藏区域误触问题的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      在官网demo中我们可以看到,滚动效果是由CCSprite精灵显示的,但是如果需要像手机app中滚动列表一样(如下图),点击在上面需要不同的图片效果显示,那么仅仅依靠CCSprite效果不是很好了:

     

 

     研究了两天,发现了demo中的一些问题,实现可以有好几种方式,就是显示效果不一样,下面一一介绍:

(1.)使用CCSprite,创建时使用CCSprite,然后放置到cell中,不同状态就得依靠响应事件了,在ccTouchEnd(..,..)里面获得精灵,然后重新设置纹理。不过这种效果显示出来不是很自然。

if (m_iLastButtonID == cell->getIdx() )
	{
		if (cell->IsSelected())
		{
			cell->setSelected(false);
			CCSpriteBatchNode *pnode = CCSpriteBatchNode::create("Images/back.png");
			CCSprite *psprite = (CCSprite*)cell->getChildByTag(100);
			psprite->setTexture(pnode->getTexture());
		}else
		{
			cell->setSelected(true);
			CCSpriteBatchNode *pnode = CCSpriteBatchNode::create("Images/backdown.png");
			CCSprite *psprite = (CCSprite*)cell->getChildByTag(100);
			psprite->setTexture(pnode->getTexture());
		}
		lastcell = cell;
		
	}else
	{
		if (lastcell)
		{
			lastcell->setSelected(false);
			CCSpriteBatchNode *plastnode = CCSpriteBatchNode::create("Images/back.png");
			CCSprite *plastsprite = (CCSprite*)lastcell->getChildByTag(100);
			plastsprite->setTexture(plastnode->getTexture());
		}
		
		cell->setSelected(true);
		m_iLastButtonID = cell->getIdx();
		CCSpriteBatchNode *pnode = CCSpriteBatchNode::create("Images/backdown.png");
		CCSprite *psprite = (CCSprite*)cell->getChildByTag(100);
		psprite->setTexture(pnode->getTexture());
		lastcell = cell;
	}

 

(2.)CCMenu,大家刚开始接触cocos2d-x工程时,直接运行程序就会显示一个closebutton,那个就是CCMenuItemImage和CCMenu结合的效果。

          代码直接写在:CCTableViewCell* TableViewTestLayer::tableCellAtIndex(CCTableView *table, unsigned int idx)里,直接将里面CCSprite改成CCMenu就行。

          问题出现了:第一,按钮有状态变化,但是列表拖动不了

                                第二,即使你自己在该CCLayer上面再加上一层虚拟的无界面的CCLayer1,在CCLayer1里面加上触摸事件,但是点击界面时依旧是CCMenu按钮响应,虚拟界面在按钮处是没有响应事件的

           原因:后来我去看了一些博客之后发现是优先级的问题,CCMenu的优先级太高了-128,我把整个cell都添加为一个按钮,所以cell的响应时间就被吞并掉了。我们如何处理这个问题呢。。。。http://blog.youkuaiyun.com/xujiezhige/article/details/8291995

           这个问题折磨了整整半天,修改了很多CCTableView代码,想自己实现的,但是丢人,连原先的CCSprite也滚动不聊了,哎,不过中心查看底层发现很多东西,有兴趣的可以自己跟踪下。

 

(3.)CCControlButton,使用这个类需要using namespace CocosDenshion;这个效果会好点

CCScale9Sprite* btnNormal = CCScale9Sprite::create("Images/back.png");
CCScale9Sprite* btnSelected = CCScale9Sprite::create("Images/backdown.png");
CCLabelTTF *title = CCLabelTTF::create("","Marker Felt",30);


CCControlButton* controlBtn = CCControlButton::create(title,btnNormal);
controlBtn->setBackgroundSpriteForState(btnSelected,CCControlStateSelected);

controlBtn->addTargetWithActionForControlEvents(this,cccontrol_selector(TableViewTestLayer::touchDown),CCControlEventTouchDown);
controlBtn->setTitleColorForState(ccRED,CCControlStateHighlighted);
controlBtn->setPreferredSize(CCSize(272,344));
controlBtn->setAdjustBackgroundImage(false);
controlBtn->setAnchorPoint(ccp(0,0));
controlBtn->setPosition(ccp(0,0));
controlBtn->setTag(idx+300);
cell->addChild(controlBtn);


(4.)cocosStudio中的uibutton暂时没有实现。

 

对了,在cocos2d中有个可以改变优先级的函数:controlBtn->setDefaultTouchPriority(-200);

 

(5.)demo中存在的问题,有些位置影藏的部分点击了还有响应,如下图白色区域:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值