[cocos2dx]通过CCTableView创建的滑屏,如何取得其中的项,从而改变其属性

yxlovemoney 2014-07-22 05:37:27
还是先放上一部分代码,方便说明
首先是头文件

#include "cocos2d.h"
#include "cocos-ext.h"

USING_NS_CC;
USING_NS_CC_EXT;

class CPaintScene : public CCLayer, public CCTableViewDataSource, public CCTableViewDelegate
{
public:
// 省略部分代码

virtual void scrollViewDidScroll(cocos2d::extension::CCScrollView *view);
virtual void scrollViewDidZoom(cocos2d::extension::CCScrollView *view);

//处理触摸事件,可以计算点击的是哪一个子项
virtual void tableCellTouched(CCTableView *table, CCTableViewCell *cell);
//每一项的宽度和高度
virtual CCSize cellSizeForTable(CCTableView *table);
//生成列表每一项的内容
virtual CCTableViewCell *tableCellAtIndex(CCTableView *table, unsigned int idx);
//一共多少项
virtual unsigned int numberOfCellsInTableView(CCTableView *table);
}


然后是CPP文件里比较主要的方法

void CPaintScene::tableCellTouched(CCTableView *table, CCTableViewCell *cell)
{
CCLOG("cell touched at index: %i", cell->getIdx());
CCSprite *temp = (CCSprite *)(cell->getChildByTag(1));
//temp->setPositionX(20.f);
}

CCTableViewCell *CPaintScene::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
// 格式化相应的图片名称
CCString *pString = CCString::createWithFormat("%d.png", idx + 1);
CCTableViewCell *pCell = table->dequeueCell();// 返回空闲的(被释放的)子项?
if (!pCell)
{
pCell = new CCTableViewCell();
pCell->autorelease();
//CCSprite *pSprite = CCSprite::create("building.png");
CCSprite *penSprite = CCSprite::createWithSpriteFrameName(pString->getCString());
penSprite->setAnchorPoint(CCPointZero);
penSprite->setPosition(CCPointZero);
pCell->addChild(penSprite, 0, idx);

CCLabelTTF *pLabel = CCLabelTTF::create(pString->getCString(), "Arial", 20.0);
pLabel->setPosition(CCPointZero);
pLabel->setAnchorPoint(CCPointZero);
pLabel->setTag(123);
pCell->addChild(pLabel);
}
else
{
CCLabelTTF *pLabel = (CCLabelTTF *)pCell->getChildByTag(123);
pLabel->setString(pString->getCString());
}

return pCell;
}


就得到了图上的效果

本来是想在tableCellTouched 这里取得对应的精灵,然后点击改变其坐标,但发现这样取不出来,
进到CCTableView的头文件似乎也没找到合适的方法,
求教 下怎么才能取得点击项上的对应的精灵对象呢?
...全文
321 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
笨木头 2014-07-23
  • 打赏
  • 举报
回复
引用 2 楼 yxlovemoney 的回复:
[quote=引用 1 楼 musicvs 的回复:] 我自己测试了,可以这么做吖,你获取到的是空值?
是的,确实是取不到,返回个0x00000000 会是什么问题呢?好郁闷[/quote] 我就是直接拿demo来测的 你有没有看过在pCell->addChild(penSprite, 0, idx);时候的pCell和tableCellTouched的cell有没有不一样的地方?
yxlovemoney 2014-07-23
  • 打赏
  • 举报
回复
引用 1 楼 musicvs 的回复:
我自己测试了,可以这么做吖,你获取到的是空值?
是的,确实是取不到,返回个0x00000000 会是什么问题呢?好郁闷
笨木头 2014-07-23
  • 打赏
  • 举报
回复
引用 4 楼 yxlovemoney 的回复:
算是找到问题所在了,还是先放代码

CCTableViewCell *CPaintScene::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
	// 格式化相应的图片名称
	CCString *pString = CCString::createWithFormat("%d.png", idx + 1);
	CCTableViewCell *pCell = table->dequeueCell();// 返回空闲的(被释放的)子项?
	if (!pCell)
	{
		pCell = new CCTableViewCell();
		pCell->autorelease();
		//CCSprite *penSprite = CCSprite::create("building.png");
		CCSprite *penSprite = CCSprite::createWithSpriteFrameName(pString->getCString());
		penSprite->setAnchorPoint(CCPointZero);
		penSprite->setPosition(CCPointZero);
		penSprite->setTag(100);   // 此句
因为pCell都是通过 table->dequeueCell返回,而每个pCell都是单独的,或者说每个SPRITE对应一个新的pCell 像我上面写的 pCell->addChild(penSprite, 0, idx); 就等于当成了所有单独的pCell是一个整体,而且每次SETTAG的值都不 同,那在我点击相应的 pCell时,自然就得不到对应的精灵了, 毕竟每个pCell上只有一个SPRITE,所以给其设置相同的TAG, 才能返回其SPRITE对象。 就是这样了,一开始没搞清其概念。
这么说,我知道为什么我测试的时候没问题了,其实我一直没用过TableView这东西(觉得它好烦,自己写比较舒服),误导人了。。 看了一下,它的cell是重复利用的,比如在可视范围内,最多可同时出现7个元素,那就最多进行7次new CCTableViewCell(); 所有元素都利用这7个cell来展示(即使整个列表有100个元素) 然后刚好我点击的是前面的几个元素,凑巧idx值和元素号码对应上了,点其他的元素就会取到NULL PS:正确做法如你所说,不过其实你的描述我没怎么听懂
yxlovemoney 2014-07-23
  • 打赏
  • 举报
回复
算是找到问题所在了,还是先放代码

CCTableViewCell *CPaintScene::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
	// 格式化相应的图片名称
	CCString *pString = CCString::createWithFormat("%d.png", idx + 1);
	CCTableViewCell *pCell = table->dequeueCell();// 返回空闲的(被释放的)子项?
	if (!pCell)
	{
		pCell = new CCTableViewCell();
		pCell->autorelease();
		//CCSprite *penSprite = CCSprite::create("building.png");
		CCSprite *penSprite = CCSprite::createWithSpriteFrameName(pString->getCString());
		penSprite->setAnchorPoint(CCPointZero);
		penSprite->setPosition(CCPointZero);
		penSprite->setTag(100);   // 此句
因为pCell都是通过 table->dequeueCell返回,而每个pCell都是单独的,或者说每个SPRITE对应一个新的pCell 像我上面写的 pCell->addChild(penSprite, 0, idx); 就等于当成了所有单独的pCell是一个整体,而且每次SETTAG的值都不 同,那在我点击相应的 pCell时,自然就得不到对应的精灵了, 毕竟每个pCell上只有一个SPRITE,所以给其设置相同的TAG, 才能返回其SPRITE对象。 就是这样了,一开始没搞清其概念。
笨木头 2014-07-22
  • 打赏
  • 举报
回复
我自己测试了,可以这么做吖,你获取到的是空值?

8,325

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧