很多游戏在设计的时候会用到道具,对道具进行抓取与摆放的操作。例如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、写博客时要先构思好一个清晰的讲解思路,让后全面而完全得表述出自己的思路和实现。