cocos2d-x中为道具添加数量并对数量进行增减操作的实现

很多游戏在设计的时候会用到道具,对道具进行抓取与摆放的操作。例如Bad Pigges中进入场景时,有一个选取道具并摆放以搭建玩家自己需要模型的设计。

道具的数量是不定的,所以就要求有一个数字展现给用户提示其还剩余的道具数量。

周末的时候在cocos2d-x中实现了本模块的该操作,下面先来介绍下这一操作我在实现时的思路。

1、生成数字时采用了最原始的同helloworld一样的方法:

	//放置数字
	for(int i = 0;i<nPaddles;i++)
	{
		if(sGlobal->gameScene->level[sGlobal->levelNum].paddleNum[i]>=1)
		{
			char s[3];
			pLabel[i] = CCLabelTTF::create(itoa(sGlobal->gameScene->level[sGlobal->levelNum].paddleNum[i],s,10),"Arial",20); //itoa(int,string,int)  整型 字符 进制
			pLabel[i]->setPosition(ccp( (winSize.width- (nPaddles)* w)/2+10+ i * w, ItemPosY-10));
			this->addChild(pLabel[i],1);	
		}

	}
CCLableTTF中有setstring方法可实现改变数字。

2、道具的摆放,读取道具数量用双重for循环实现,即有多少道具先摆出来。

3、Paddle类继承CCSprite和CCTargetedTouchDelegate。这样Paddle类就继承了ccTouchBegan,ccTouchMoved和ccTouchEnded。

实例化一个paddle,并给出状态

	typedef enum tagPaddleState 
	{
   	 kPaddleStateGrabbed,
    	kPaddleStateUngrabbed
	} PaddleState;

定义paddle的两个状态用m_state与m_state1, 以及一个锁标识int m_lock。

ccTouchBegan中m_state = kPaddleStateGrabbed;

ccTouchMoved中 m_state1 = kPaddleStateGrabbed;

ccTouchEnded中 m_state = kPaddleStateUngrabbed;

这样,在记录上一帧是否有操作改变可实现数字的加减:

void GameLayer::update(float dt)//每帧更新
{
	CCSize winSize = CCDirector::sharedDirector()->getWinSize();
	Paddle*paddle;

	CCTexture2D* SpaceTexture = CCTextureCache::sharedTextureCache()->addImage("Empty.png");
	
	int w = SpaceTexture->getPixelsWide();//每个道具栏的宽度
	int h = SpaceTexture->getPixelsHigh();//每个道具栏的高度
	int heightSpace = sGlobal->gameScene->level[sGlobal->levelNum].m_heightSpace;//高度(个数)
	int widthSpace = sGlobal->gameScene->level[sGlobal->levelNum].m_widthSpace;//宽度(个数)
	int nPaddles = sGlobal->gameScene->level[sGlobal->levelNum].m_nPaddles;//道具的种类数
	


	CCObject* pObj = NULL;
	CCARRAY_FOREACH(m_paddles, pObj)
	{
		paddle = (Paddle*)(pObj);

		if(paddle->m_state == kPaddleStateUngrabbed)
		{
			if(paddle->getPosition().x>(winSize.width- widthSpace * w)/2 &&
				paddle->getPosition().x<(winSize.width- widthSpace* w)/2+widthSpace*w &&
				paddle->getPosition().y + h / 2>BuildPosY &&
				paddle->getPosition().y<BuildPosY + heightSpace * h  )//判断是否在上层道具栏内
			{
				paddle->m_buildFrameX = (paddle->getPosition().x - ( winSize.width- widthSpace * w) / 2 )/w;//相对位置
				paddle->m_buildFrameY = ( paddle->getPosition().y + h / 2 - BuildPosY ) / h;
				CCPoint p( (winSize.width-(widthSpace-1) * w) * 0.5 + paddle->m_buildFrameX * w, BuildPosY + paddle->m_buildFrameY * h );
				//设置摆放正确后的地址
				paddle->setPosition(p);
			
				if(paddle->m_state1 == kPaddleStateGrabbed && paddle->m_idItem==1)
					{
						sGlobal->gameScene->level[sGlobal->levelNum].paddleNum[paddle->m_idItemFrame]--;
						char s[3];
						pLabel[paddle->m_idItemFrame]->setString(itoa(sGlobal->gameScene->level[sGlobal->levelNum].paddleNum[paddle->m_idItemFrame],s,10));
						
					}
					paddle->m_idItem=0;
					goto next;
			}
					
					paddle->setPosition(ccp( (winSize.width- (nPaddles-1)* w)/2+ paddle->m_idItemFrame * w, ItemPosY));//放回去
										
					if(paddle->m_state1 == kPaddleStateGrabbed&&paddle->m_idItem==0)
					{
						sGlobal->gameScene->level[sGlobal->levelNum].paddleNum[paddle->m_idItemFrame]++;
						char s[3];
						pLabel[paddle->m_idItemFrame]->setString(itoa(sGlobal->gameScene->level[sGlobal->levelNum].paddleNum[paddle->m_idItemFrame],s,10));
					
					}
					paddle->m_idItem=1;

	paddle->m_state1 = kPaddleStateUngrabbed;
		}
next:;
	}
}

这样在摆放的时候既能从下面道具栏拿起后放入上面道具栏实现数字的减,放回时实现数字的增加,同时在上面道具栏之间移动时也不会改变。

2013/03/19

============================================================================================第一篇文章,多处表述都很粗糙,并且代码编写也很混乱。


改进方法:

1、代码是写给人看的,在编写的时候注意清晰化

2、写博客时要先构思好一个清晰的讲解思路,让后全面而完全得表述出自己的思路和实现。




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值