Android实现消水果游戏代码分享
消水果游戏大家都玩过吧,今天小编给大家分享实现消水果游戏的代码,废话不多说了,具体代码如下所示:
#include"InGameScene.h"
#include"PauseLayer.h"
#include"ScoreScene.h"
#include"AppDelegate.h"
extern"C"
{
voidshowAds()
{
}
voidhideAds()
{
}
}
usingnamespacecocos2d;
usingnamespaceCocosDenshion;
boolInGameScene::isPaused=false;
unsignedintInGameScene::level=1;
unsignedintInGameScene::background=1;
unsignedintInGameScene::bomb=2;
constunsignedintInGameScene::randomDrop[8]={0,5,2,7,1,4,3,6};
constchar*InGameScene::strMode[3]={"Simple","Normal","Expert"};
constunsignedintInGameScene::limitTime[3]={60,60,60};
constunsignedintInGameScene::baseScore[3]={20,50,100};
constunsignedintInGameScene::limitScore[3]={6000,10000,12000};
constunsignedintInGameScene::limitFireball[3]={100,70,30};
constunsignedintInGameScene::limitCrazy[3]={8,10,6};
voidInGameScene::reset()
{
InGameScene::isPaused=false;
}
InGameScene::InGameScene()
:m_nDiamondScale(1.0f)
,m_nMagicCount(0)
,m_pMagicProgress(NULL)
,m_nTime(0)
,m_nScore(0)
,m_nTempScore(0)
,m_nDiamondRow(0)
,m_nDiamondLine(0)
,m_bIsReadyGoEnd(false)
,m_pPause(NULL)
,m_pDiamondBatchNode(NULL)
,m_pRemovedDiamond(NULL)
,m_pScoreLable(NULL)
,m_pTimerBar(NULL)
,m_pMoveLable(NULL)
,m_pTargetLable(NULL)
,m_bFireballMode(false)
,m_bError(false)
,m_nTimeCount(0)
,m_nCrazyCount(0)
,m_bIsCrazyMode(false)
,m_nDiamondCount(0)
,m_pEffectDict(NULL)
,m_startType(-1)
,m_moveStatus(-1)
,moves_number_(0)
{
}
InGameScene::~InGameScene()
{
CC_SAFE_RELEASE_NULL(m_pPause);
CC_SAFE_RELEASE_NULL(m_pMagicProgress);
CC_SAFE_RELEASE_NULL(m_pMoveLable);
CC_SAFE_RELEASE_NULL(m_pTargetLable);
CC_SAFE_RELEASE_NULL(m_pTimerBar);
CC_SAFE_RELEASE_NULL(m_pScoreLable);
CC_SAFE_RELEASE_NULL(m_pDiamondBatchNode);
CC_SAFE_RELEASE_NULL(m_pRemovedDiamond);
CC_SAFE_RELEASE_NULL(m_pEffectDict);
}
voidInGameScene::onEnter()
{
Image::setPVRImagesHavePremultipliedAlpha(true);
this->setTouchEnabled(true);
Layer::onEnter();
}
voidInGameScene::onExit()
{
Layer::onExit();
}
Scene*InGameScene::scene()
{
Scene*scene=NULL;
do
{
scene=Scene::create();
CC_BREAK_IF(!scene);
InGameScene*layer=InGameScene::create();
CC_BREAK_IF(!layer);
scene->addChild(layer);
}
while(0);
returnscene;
}
boolInGameScene::init()
{
boolbRet=false;
do
{
CC_BREAK_IF(!Layer::init());
autolistener=EventListenerTouchOneByOne::create();
listener->setSwallowTouches(false);
listener->onTouchBegan=CC_CALLBACK_2(InGameScene::onTouchBegan,this);
listener->onTouchEnded=CC_CALLBACK_2(InGameScene::onTouchEnded,this);
listener->onTouchMoved=CC_CALLBACK_2(InGameScene::onTouchMoved,this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
hideAds();
InGameScene::isPaused=false;
m_nDiamondRowMax=8;
m_nDiamondLineMax=9;
m_nDiamondScale=1.12f;
InGameScene::level=UserDefault::getInstance()->getIntegerForKey("level");
m_nDiamondCount=InGameScene::level+3;
if(m_nDiamondCount<3||m_nDiamondCount>5)
{
break;
}
m_nTime=InGameScene::limitTime[InGameScene::level];
m_nTime=1200;
SizewinSize=Director::getInstance()->getWinSize();
autosp=Sprite::create("gui/df.png");
addChild(sp,-3);
sp->setPosition(Vec2(winSize.width/2,winSize.height/2));
autosp_top=Sprite::create("gui/top_bar.png");
addChild(sp_top,3);
sp_top->setPosition(Vec2(winSize.width/2,1280-97));
m_pRemovedDiamond=__Array::create();
m_pRemovedDiamond->retain();
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("effects/effects-800x_port_mdpi.plist");
m_pScoreLable=Label::createWithCharMap("gui/white_font.png",25,29,'0');
m_pScoreLable->retain();
m_pScoreLable->setString("0");
m_pScoreLable->setPosition(Vec2(583,1280-55));
this->addChild(m_pScoreLable,100);
m_pMoveLable=Label::createWithCharMap("gui/white_font.png",25,29,'0');
m_pMoveLable->retain();
m_pMoveLable->setPosition(Vec2(583,1280-140));
m_pMoveLable->setString("50");
addChild(m_pMoveLable,100);
m_pTargetLable=Label::createWithCharMap("gui/white_font.png",25,29,'0');
m_pTargetLable->retain();
m_pTargetLable->setPosition(Vec2(116,1280-58));
m_pTargetLable->setString("1000");
addChild(m_pTargetLable,100);
//创建暂停按钮
auto*pPauseItem=MenuItemImage::create("gui/game_stop.png","gui/game_stop.png",this,menu_selector(InGameScene::menuPauseCallback));
pPauseItem->setPosition(Vec2(46,1280-142));
Menu*pMenu=Menu::create(pPauseItem,NULL);
CC_BREAK_IF(!pMenu);
pMenu->setPosition(Vec2::ZERO);
this->addChild(pMenu,200);
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("gems/gemTexture-800x_port_mdpi.plist");
m_pDiamondBatchNode=SpriteBatchNode::create("gems/gemTexture-800x_port_mdpi.png");
m_pDiamondBatchNode->retain();
this->addChild(m_pDiamondBatchNode);
this->playReadyGo();
this->addFirstDiamond();
this->scheduleUpdate();
m_pEffectDict=__Dictionary::create();
m_pEffectDict->retain();
drawBg();
bRet=true;
}
while(0);
returnbRet;
}
voidInGameScene::playReadyGo()
{
if(UserDefault::getInstance()->getBoolForKey("isEffectEnabled",false))
{
SimpleAudioEngine()->playEffect("sounds/readyGo.ogg");
}
LabelTTF*readyGo=LabelTTF::create("Ready","fonts/VerdanaBold.ttf",60.0f);
readyGo->setPosition(Vec2(400,750));
this->addChild(readyGo);
readyGo->setScale(0.1f);
readyGo->runAction(Sequence::create(
CCScaleTo::create(1.1f,1.0f),
DelayTime::create(.3f),
CallFuncN::create(this,callfuncN_selector(InGameScene::readyCallback)),
NULL));
}
voidInGameScene::readyCallback(Node*pSender)
{
LabelTTF*p=(LabelTTF*)pSender;
p->setFontSize(65.f);
p->setString("Go!!!");
p->runAction(Sequence::create(
DelayTime::create(.7f),
CallFuncN::create(this,callfuncN_selector(InGameScene::goCallback)),
NULL));
}
voidInGameScene::goCallback(Node*pSender)
{
this->removeChild(pSender);
}
voidInGameScene::addFirstDiamond()
{
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("gems/gemTexture-800x_port_mdpi.plist");
this->schedule(schedule_selector(InGameScene::addDiamond),1.2f/(m_nDiamondRowMax*m_nDiamondLineMax));
}
Vec2InGameScene::getPositionByRowAndLine(introw,intline)
{
floatx=CELL_WIDTH*row+OFFSET_X;
floaty=CELL_HEIGHT*line+OFFSET_Y;
returnVec2(x,y);
}
voidInGameScene::addDiamond(floatdelta)
{
intdiamondType=rand()%5;
Diamond*pDiamond=Diamond::createWithSpriteFrameName(Diamond::TypeStr[diamondType]);
pDiamond->setType(diamondType);
pDiamond->setPosition(Vec2(CELL_WIDTH*randomDrop[m_nDiamondRow]+50,1280+CELL_HEIGHT));
pDiamond->setScale(0.9);
m_pDiamondBatchNode->addChild(pDiamond);
pDiamond->setMoving(true);
pDiamond->runAction(Sequence::create(
MoveTo::create(.25f,Vec2(CELL_WIDTH*randomDrop[m_nDiamondRow]+OFFSET_X,CELL_HEIGHT*m_nDiamondLine+OFFSET_Y)),
CallFuncN::create(this,callfuncN_selector(InGameScene::addEndCallback)),
NULL));
m_pDiamond[m_nDiamondLine][randomDrop[m_nDiamondRow]]=pDiamond;
if(++m_nDiamondRow==m_nDiamondRowMax)
{
m_nDiamondRow=0;
++m_nDiamondLine;
}
if(m_nDiamondLine==m_nDiamondLineMax)
{
m_bIsReadyGoEnd=true;//首次播放宝石掉落动画结束
this->unschedule(schedule_selector(InGameScene::addDiamond));//宝石添加动画结束
if(!InGameScene::isPaused)
{
//m_pTimerBar->runAction(MoveTo::create(float(InGameScene::limitTime[InGameScene::level]),Vec2(-380,95)));
//this->schedule(schedule_selector(InGameScene::updateTime),1.0f);//开始计时
}
}
}
voidInGameScene::drawBg()
{
for(autoline=0;line<m_nDiamondLineMax;line++)
{
for(autorow=0;row<7;row++)
{
autosp1=Sprite::create("gui/b1.png");
autosp2=Sprite::create("gui/b2.png");
if(line%2==0)
{
if(row%2==0)
{
sp1->setPosition(getPositionByRowAndLine(row,line));
sp2->setVisible(false);
}
else
{
sp2->setPosition(getPositionByRowAndLine(row,line));
sp1->setVisible(false);
}
}
else
{
if(row%2==0)
{
sp2->setPosition(getPositionByRowAndLine(row,line));
sp1->setVisible(false);
}
else
{
sp1->setPosition(getPositionByRowAndLine(row,line));
sp2->setVisible(false);
}
}
addChild(sp1,BG_ODER);
addChild(sp2,BG_ODER);
}
}
}
#definePAN0.000001
voidInGameScene::DrawLine()
{
autoline=Sprite::create("gui/line.png");
line->setPosition(last_position);
line->setAnchorPoint(Vec2(1,0.5));
addChild(line,-1);
m_lineObjs.push_back(line);
if(fabs(last_position.x-cur_position.x)<PAN){
if(last_position.y-cur_position.y>1.0f)
{
//向下
line->setRotation(270);
}
else
{
line->setRotation(90);
}
}
elseif(fabs(last_position.y-cur_position.y)<PAN)
{
if(last_position.x-cur_position.x<1.0f){
line->setRotation(180);
}
}
else
{
if(last_position.x-cur_position.x<1.0f)
{
if(last_position.y-cur_position.y<1.0f)
{
line->setRotation(135);
}
else
{
line->setRotation(225);
}
}
else
{
if(last_position.y-cur_position.y<1.0f)
{
line->setRotation(45);
}
else
{
line->setRotation(315);
}
}
}
}
boolInGameScene::isNearby(intline,introw,int_type)
{
if(line>0&&m_pDiamond[line-1][row]->getType()==_type)
{
returntrue;
}
if(line<m_nDiamondLineMax-1&&m_pDiamond[line+1][row]->getType()==_type)
{
returntrue;
}
if(row>0&&m_pDiamond[line][row-1]->getType()==_type)
{
returntrue;
}
if(row<m_nDiamondRowMax-1&&m_pDiamond[line][row+1]->getType()==_type)
{
returntrue;
}
if(line>0&&row>3&&m_pDiamond[line-1][row-4]->getType()==_type)
{
returntrue;
}
if(line>0&&row>1&&m_pDiamond[line-1][row-2]->getType()==_type)
{
returntrue;
}
if(line<m_nDiamondLineMax&&row<m_nDiamondRowMax-2&&m_pDiamond[line+1][row+2]->getType()==_type)
{
returntrue;
}
if(line<m_nDiamondLineMax&&row<m_nDiamondRowMax-4&&m_pDiamond[line+1][row+4]->getType()==_type)
{
returntrue;
}
returnfalse;
}
voidInGameScene::onTouchMoved(Touch*pTouch,Event*pEvent)
{
if(m_moveStatus==0)
{
return;
}
if(m_startType!=-1)
{
return;
}
log("c");
Vec2location=pTouch->getLocationInView();
location=Director::getInstance()->convertToGL(location);
for(intline=0;line<m_nDiamondLineMax;++line)
{
for(introw=0;row<m_nDiamondRowMax;++row)
{
if(!m_pDiamond[line][row])
{
continue;
}
if((m_pDiamond[line][row])->boundingBox().containsPoint(location))
{
//还在原来的格子里
if(m_pRemovedDiamond->containsObject(m_pDiamond[line][row]))
{
return;
}
ssize_tcount=m_pRemovedDiamond->count();
if(count>0)
{
//颜色不是一样的
if(m_pDiamond[line][row]->getType()!=m_startType)
{
log("--lineend--line(%d),row(%d)",line,row);
m_moveStatus=0;
return;
}
//if(!isNearby(line,row,m_startType))
//{
//
//return;
//}
cur_position=getPositionByRowAndLine(row,line);
DrawLine();
last_position=cur_position;
m_pDiamond[line][row]->setScale(1.05);
}
else
{
}
//将自己加入到队列中去
m_pDiamond[line][row]->setTag(line*m_nDiamondRowMax+row);
m_pRemovedDiamond->addObject(m_pDiamond[line][row]);
}
}
}
log("c-end");
}
boolInGameScene::onTouchBegan(Touch*pTouch,Event*pEvent)
{
if(!m_bIsReadyGoEnd)
{
returntrue;
}
if(m_startType!=-1)
{
returntrue;
}
log("a");
m_lineObjs.clear();
m_pRemovedDiamond->removeAllObjects();
m_moveStatus=-1;
Vec2location=pTouch->getLocationInView();
location=Director::getInstance()->convertToGL(location);
log("b");
for(intline=0;line<m_nDiamondLineMax;++line)
{
for(introw=0;row<m_nDiamondRowMax;++row)
{
if(m_pDiamond[line][row]&&(!m_pDiamond[line][row]->getMoving()))
{
if((m_pDiamond[line][row])->boundingBox().containsPoint(location))
{
m_startType=m_pDiamond[line][row]->getType();
last_position=getPositionByRowAndLine(row,line);
log("m_starType%d",m_startType);
returntrue;
}
}
}
}
log("a-end");
returntrue;
}
voidInGameScene::onTouchEnded(Touch*pTouch,Event*pEvent)
{
m_moveStatus=-1;
m_startType=-1;
log("d");
if(!handleSelectedDiamond())
{
log("sdf");
return;
}
for(autosp:m_lineObjs)
{
sp->removeFromParent();
}
m_lineObjs.clear();
removeSelectedDiamond();
schedule(schedule_selector(InGameScene::addRemovedDiamond),1/40);
restoreOriginalDiamond();
log("d--end");
}
voidInGameScene::findSameDiamond(inttype)
{
m_pRemovedDiamond->removeAllObjects();
for(intline=0;line<m_nDiamondLineMax;++line)
{
for(introw=0;row<m_nDiamondRowMax;++row)
{
Diamond*diamond=m_pDiamond[line][row];
if(diamond&&(!diamond->getMoving()))
{
if(diamond->getType()==type)
{
if(!m_pRemovedDiamond->containsObject(diamond))
{
diamond->setTag(line*m_nDiamondRowMax+row);//用tag记录下可能被删除的宝石的位置
m_pRemovedDiamond->addObject(diamond);
}
}
}
}
}
}
//如果点击的宝石少于3个,则返回false,等于或多于3个则返回true
boolInGameScene::handleSelectedDiamond()
{
autocount=m_pRemovedDiamond->count();
if(count<2)
{
m_nCrazyCount=0;
if(m_bIsCrazyMode)
{
m_bIsCrazyMode=false;
this->removeFireModeFlame();
}
returnfalse;
}
playJumpScore(count);
returntrue;
}
//-------------播放连击动画---------------//
voidInGameScene::playCombAnimation(unsignedintcombCount)
{
LabelTTF*comb=LabelTTF::create(__String::createWithFormat("Combo%d+",combCount)->getCString(),"fonts/VerdanaBold.ttf",60.0f);
comb->setPosition(Vec2(400,750));
comb->setColor(ccc3(0,255,255));
this->addChild(comb);
comb->setScale(0.1f);
comb->runAction(Sequence::create(
CCScaleTo::create(.5f,1.0f),
DelayTime::create(.2f),
CallFuncN::create(this,callfuncN_selector(InGameScene::removeCombCallback)),
NULL));
}
voidInGameScene::removeCombCallback(Node*pSender)
{
this->removeChild(pSender);
}
//-------------播放连击动画-END--------------//
voidInGameScene::update(floatdelta)
{
++m_nTimeCount;//计数,大概60次是一秒的时间
if(m_nTimeCount>75)//未在限定时间内完成连击,连击失败
{
if(m_bIsCrazyMode)
{
m_bIsCrazyMode=false;
this->removeFireModeFlame();
}
}
//if(m_nCrazyCount>InGameScene::limitCrazy[InGameScene::level])
//{
//m_bIsCrazyMode=true;
//m_nTimeCount=.0f;
//m_nCrazyCount=0;
//this->playFireModeFlame();
//}
}
voidInGameScene::displayErrorDiamond()
{
m_bError=true;
Diamond*removed=NULL;
Ref*pObj=NULL;
CCARRAY_FOREACH(m_pRemovedDiamond,pObj)
{
removed=(Diamond*)pObj;
CC_BREAK_IF(!removed);
removed->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(
Diamond::TypeBwStr[removed->getType()]));
}
}
voidInGameScene::restoreOriginalDiamond()
{
if(m_bError)
{
m_bError=false;
Diamond*removed=NULL;
Ref*pObj=NULL;
CCARRAY_FOREACH(m_pRemovedDiamond,pObj)
{
removed=(Diamond*)pObj;
CC_BREAK_IF(!removed);
removed->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(
Diamond::TypeStr[removed->getType()]));
}
}
}
//启动分数跳动增加的动画
voidInGameScene::playJumpScore(intcount)
{
m_nTempScore=InGameScene::baseScore[InGameScene::level]*count+2*(count-3);//2*(count-3)宝石超过3个的奖励分
m_nScore+=m_nTempScore;
this->schedule(schedule_selector(InGameScene::playJumpScoreUpdate),0.4f/60);
}
//分数跳动增加的动画
voidInGameScene::playJumpScoreUpdate(floatdelta)
{
if(m_nTempScore<0)
{
__String*strScore=__String::createWithFormat("%d",m_nScore);
m_pScoreLable->setString(strScore->getCString());
this->unschedule(schedule_selector(InGameScene::playJumpScoreUpdate));
return;
}
__String*strScore=__String::createWithFormat("%d",m_nScore-m_nTempScore);
m_pScoreLable->setString(strScore->getCString());
m_nTempScore-=InGameScene::baseScore[InGameScene::level]/5;
}
//播放删除宝石时的动画
voidInGameScene::playDiamondExplosion(constVec2pos)
{
Vector<SpriteFrame*>diamondExplosionNormalFrame;
for(inti=1;i<10;++i)
{
SpriteFrame*frame=SpriteFrameCache::getInstance()->getSpriteFrameByName(__String::createWithFormat("gem_explosion_normal%d.png",i)->getCString());
diamondExplosionNormalFrame.pushBack(frame);
}
Animation*diamondAnimation=Animation::createWithSpriteFrames(diamondExplosionNormalFrame,0.05f);
Sprite*explosion=Sprite::createWithSpriteFrameName("gem_explosion_normal1.png");
explosion->setPosition(pos);
this->addChild(explosion);
//播放完消失时的动画
explosion->runAction(Sequence::create(
Animate::create(diamondAnimation),
//播放完消失时的动画后,删除它
CallFuncN::create(this,callfuncN_selector(InGameScene::removeExplosionCallback)),
NULL));
}
//删除宝石消失时的动画
voidInGameScene::removeExplosionCallback(Node*pSender)
{
this->removeChild(pSender,true);
}
//--------------点击宝石后的查询、移除、填充等处理--START-------------//
voidInGameScene::findSelectedDiamond(intline,introw)
{
m_pRemovedDiamond->removeAllObjects();
//递归查询相邻颜色相同的宝石
findSelectedDiamond(line,row,m_pDiamond[line][row]->getType());
}
//递归查出所有颜色一样且紧挨一起的宝石,并记录在m_pRemovedDiamond中
voidInGameScene::findSelectedDiamond(intline,introw,inttype)
{
if(line<0||line==m_nDiamondLineMax||row<0||row==m_nDiamondRowMax)
{
return;
}
Diamond*diamond=m_pDiamond[line][row];
if(diamond&&(!diamond->getMoving()))
{
if(diamond->getType()==type)
{
if(!m_pRemovedDiamond->containsObject(diamond))
{
diamond->setTag(line*m_nDiamondRowMax+row);//用tag记录下可能被删除的宝石的位置
m_pRemovedDiamond->addObject(diamond);
findSelectedDiamond(line,row-1,type);//递归左侧
findSelectedDiamond(line,row+1,type);//递归右侧
findSelectedDiamond(line+1,row,type);//递归上侧
findSelectedDiamond(line-1,row,type);//递归下侧
}
}
}
}
voidInGameScene::removeSelectedDiamond()
{
Diamond*removed=NULL;
Ref*pObj=NULL;
CCARRAY_FOREACH(m_pRemovedDiamond,pObj)
{
removed=(Diamond*)pObj;
if(removed==NULL)
{
continue;
}
this->playDiamondExplosion(removed->getPosition());
inttag=removed->getTag();
intline=tag/m_nDiamondRowMax,row=tag%m_nDiamondRowMax;
m_pDiamondBatchNode->removeChild(removed,true);
m_pDiamond[line][row]=NULL;
}
}
//补齐被删掉的宝石
voidInGameScene::addRemovedDiamond(floatdelta)
{
inttoLine,toRow;
for(toLine=0;toLine<m_nDiamondLineMax;++toLine)
{
for(toRow=0;toRow<m_nDiamondRowMax;++toRow)
{
if(m_pDiamond[toLine][toRow]==NULL)//被删除掉的宝石的位置,即要掉落的目的地
{
intfromLine;
for(fromLine=toLine+1;fromLine<m_nDiamondLineMax;++fromLine)
{
//被删除宝石的上方第一个存在,并处于固定状态,即没有在移动中的宝石
if(m_pDiamond[fromLine][toRow])
{
//播放宝石被添加时掉落的效果
if(m_pDiamond[fromLine][toRow]->getMoving())
{
m_pDiamond[fromLine][toRow]->stopAllActions();
}
m_pDiamond[fromLine][toRow]->setMoving(true);
m_pDiamond[fromLine][toRow]->runAction(Sequence::create(
MoveTo::create(0.25f,Vec2(100*toRow+50,100*toLine+220)),
CallFuncN::create(this,callfuncN_selector(InGameScene::addEndCallback)),
NULL));
m_pDiamond[toLine][toRow]=m_pDiamond[fromLine][toRow];
m_pDiamond[fromLine][toRow]=NULL;
return;
}
}
if(fromLine==m_nDiamondLineMax)
{
intdiamondType=rand()%5;
Diamond*pDiamond=Diamond::createWithSpriteFrameName(Diamond::TypeStr[diamondType]);
pDiamond->setType(diamondType);
pDiamond->setScale(0.9);//宝石放大,减少宝石间的间隙,才会彼此紧挨着
pDiamond->setPosition(Vec2(100*toRow+50,1280+100));
m_pDiamondBatchNode->addChild(pDiamond,2);
//播放宝石被添加时掉落的效果
pDiamond->setMoving(true);
pDiamond->runAction(Sequence::create(
MoveTo::create(.25f,Vec2(100*toRow+50,100*toLine+220)),
CallFuncN::create(this,callfuncN_selector(InGameScene::addEndCallback)),
NULL));
//记录每个宝石的指针
m_pDiamond[toLine][toRow]=pDiamond;
}
return;
}
}
}
if((toLine==m_nDiamondLineMax)&&(toRow==m_nDiamondRowMax))
{
this->unschedule(schedule_selector(InGameScene::addRemovedDiamond));
m_moveStatus=-1;
if(m_bFireballMode)
{
m_bFireballMode=false;
}
}
}
//宝石添加时滑动效果结束时,即宝石达到目的地时,计数减一,全部到达目的地时计数为零
voidInGameScene::addEndCallback(Node*pSender)
{
((Diamond*)pSender)->setMoving(false);
}
//--------------点击宝石后的查询、移除、填充等处理--END-------------//
//-----------------游戏计时和处理相关方法--START---------------//
//时间一秒秒慢慢减少的效果,并时间将结束时,播放响应效果
voidInGameScene::updateTime(floatdt)
{
//m_pTimeLable->setString(__String::createWithFormat("%02d",--m_nTime)->getCString());
switch(m_nTime)
{
case9:
if(UserDefault::getInstance()->getBoolForKey("isEffectEnabled",false))
{
SimpleAudioEngine()->playEffect("sounds/Countdown.ogg");
}
break;
case10:
//m_pTimerBar->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("timerBar2.png"));
break;
case5:
//m_pTimerBar->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("timerBar3.png"));
break;
case1://时间到了,显示Time'sUp
{
this->unschedule(schedule_selector(InGameScene::updateTime));
LabelTTF*timeUp=LabelTTF::create("Time'sUp","fonts/VerdanaBold.ttf",50.f);
timeUp->setPosition(Vec2(400,650));
this->addChild(timeUp);
timeUp->runAction(Sequence::create(
CCScaleTo::create(1.0f,1.3f),
CCCallFunc::create(this,callfunc_selector(InGameScene::timeUpCallback)),
NULL));
}
break;
}
//随机时间产生炸弹
if(rand()%60<3)
{
this->changeDiamondToBomb();
}
}
//时间到后,跳转到相应场景
voidInGameScene::timeUpCallback()
{
UserDefault::getInstance()->setIntegerForKey("LastScore",m_nScore);
if(m_nScore>=(int)(InGameScene::limitScore[InGameScene::level]))
{
++InGameScene::background;//胜利后可切到下一个场景
if(InGameScene::background>4)
{
InGameScene::background=1;
}
UserDefault::getInstance()->setBoolForKey("isPass",true);
//判断是否超过了最高分
__String*highScore=__String::createWithFormat("HighScore%d",InGameScene::level);
if(m_nScore>UserDefault::getInstance()->getIntegerForKey(highScore->getCString(),-1))
{
InGameScene::background=5;
UserDefault::getInstance()->setIntegerForKey(highScore->getCString(),m_nScore);
//Scene*pScene=LevelUpScene::scene();
//Director::getInstance()->replaceScene(pScene);
//return;
}
}
else
{
UserDefault::getInstance()->setBoolForKey("isPass",false);
}
showAds();//显示广告
Scene*pScene=ScoreScene::scene();
Director::getInstance()->replaceScene(pScene);
}
//-----------------游戏计时和处理相关方法--END---------------//
voidInGameScene::changeDiamondToBomb()
{
introw=-1,line=-1;
do
{
row=RANDOM_RANGE(0,m_nDiamondRowMax-0.01);
line=RANDOM_RANGE(0,m_nDiamondLineMax-0.01);
}
while(m_pDiamond[line][row]==NULL||m_pDiamond[line][row]->getBomb());
m_pDiamond[line][row]->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(
Diamond::BombTypeStr[m_pDiamond[line][row]->getType()]));
m_pDiamond[line][row]->setBomb(true);
m_pDiamond[line][row]->runAction(Sequence::create(
DelayTime::create(1.5f),//1.5秒后把炸弹的贴图换回为宝石钻石
CallFuncN::create(this,callfuncN_selector(InGameScene::restoreBombToDiamondCallback)),
NULL));
}
voidInGameScene::restoreBombToDiamondCallback(Node*pSender)
{
Diamond*p=(Diamond*)pSender;
if(p)
{
p->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(Diamond::TypeStr[p->getType()]));
p->setBomb(false);
}
}
//-----------累积火球特效进度--START---------------//
voidInGameScene::runStepFireball(unsignedintcount,boolreset)
{
//if(m_pMagicProgress)
//{
//if(reset)//重新计数
//{
//m_nMagicCount=0;
//m_pMagicProgress->runAction(CCProgressTo::create(0.1f,0));
//return;
//}
//
//unsignedintlimit=InGameScene::limitFireball[InGameScene::level];
//
//if(count>(limit-m_nMagicCount))
//{
//m_pMagicProgress->runAction(Sequence::create(
//CCProgressTo::create(0.3f,100.0f),
//CCCallFunc::create(this,callfunc_selector(InGameScene::addFireballCallback)),//随机放置Magic宝石
//CCProgressTo::create(0.1f,0),
//NULL));
//m_nMagicCount=0;
//}
//else
//{
//m_nMagicCount+=count;
//floatpercent=100*m_nMagicCount/limit;
//m_pMagicProgress->runAction(CCProgressTo::create(10*(count/limit),percent));
//}
//}
}
voidInGameScene::addFireballCallback()
{
introw=-1,line=-1;
do
{
row=RANDOM_RANGE(0,m_nDiamondRowMax-0.01);
line=RANDOM_RANGE(0,m_nDiamondLineMax-0.01);
}
while(m_pDiamond[line][row]==NULL||m_pDiamond[line][row]->getFireball());
//一颗钻石在火焰中燃烧的动画
Vector<SpriteFrame*>fireBallFrame;
for(inti=1;i<9;++i)
{
__String*str=__String::createWithFormat("diamond_fireball%d.png",i);
SpriteFrame*p=SpriteFrameCache::getInstance()->getSpriteFrameByName(str->getCString());
fireBallFrame.pushBack(p);
}
Animation*fireBallAnimation=Animation::createWithSpriteFrames(fireBallFrame,0.05f);
Animate*fireBallAnimate=Animate::create(fireBallAnimation);
m_pDiamond[line][row]->setFireball(true);
m_pDiamond[line][row]->runAction(Sequence::create(
CCRepeat::create(fireBallAnimate,4),//宝石燃烧播放次数,大概一秒多的时间后恢复
CallFuncN::create(this,callfuncN_selector(InGameScene::removeFireballCallback)),
NULL));
}
voidInGameScene::removeFireballCallback(Node*pSender)
{
Diamond*p=(Diamond*)pSender;
if(p)
{
p->setFireball(false);
p->setDisplayFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(Diamond::TypeStr[p->getType()]));
}
}
//-----------累积火球特效进度--END---------------//
//-----------播放火球掉落特效,并删除对应一列宝石-START------------//
voidInGameScene::playFireballAnimation(intline,introw)
{
m_nFireballline=m_nDiamondRowMax;
m_nFireballRow=row;
if(UserDefault::getInstance()->getBoolForKey("isEffectEnabled",false))
{
SimpleAudioEngine()->playEffect("sounds/Special_Event_fireball.ogg");
}
this->schedule(schedule_selector(InGameScene::removeLineDiamond),0.06f);
this->playFireballAnimation(m_pDiamond[line][row]);
}
//火球特效中,删除火球对应的一列宝石
voidInGameScene::removeLineDiamond(floatdelta)
{
if(m_pDiamond[m_nFireballline][m_nFireballRow])
{
m_pDiamondBatchNode->removeChild(m_pDiamond[m_nFireballline][m_nFireballRow],true);
m_pDiamond[m_nFireballline][m_nFireballRow]=NULL;
}
if(--m_nFireballline==-1)
{
this->unschedule(schedule_selector(InGameScene::removeLineDiamond));
}
}
//火球特效中,播放火球特效
voidInGameScene::playFireballAnimation(Diamond*diamond)
{
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("effects/fireball0-800x_port_mdpi.plist");
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("effects/fireball1-800x_port_mdpi.plist");
Vector<SpriteFrame*>fireballFrame;
for(inti=1;i<17;++i)
{
__String*fileName=__String::createWithFormat("fireball_down%d.png",i);
SpriteFrame*p=SpriteFrameCache::getInstance()->getSpriteFrameByName(fileName->getCString());
fireballFrame.pushBack(p);
}
autoanimation=Animation::createWithSpriteFrames(fireballFrame,0.06f);
auto*fireball=Sprite::createWithSpriteFrameName("fireball_down1.png");
fireball->setPosition(Vec2(diamond->getPositionX()+35,580));
this->addChild(fireball);
fireball->runAction(Sequence::create(
Animate::create(animation),
CallFuncN::create(this,callfuncN_selector(InGameScene::addRemovedDiamondCallback)),
NULL));
}
//火球特效中,特效结束后清理工作
voidInGameScene::addRemovedDiamondCallback(Node*pSender)
{
this->removeChild(pSender);
this->schedule(schedule_selector(InGameScene::addRemovedDiamond),1/40);
}
//-----------播放火球掉落特效,并删除对应一列宝石-END------------//
//------------暂停按钮功能------------------//
voidInGameScene::menuPauseCallback(Ref*pSender)
{
InGameScene::isPaused=true;
showAds();//暂停游戏时显示广告
//暂停时间更新
//m_pTimerBar->stopAllActions();
//m_pTimeLable->stopAllActions();
this->unscheduleUpdate();
//暂停时间更新
this->unschedule(schedule_selector(InGameScene::updateTime));
//弹出暂停框
m_pPause=PauseLayer::create();
m_pPause->retain();
this->addChild(m_pPause);
//启动暂停时间的更新函数,等待回复
this->schedule(schedule_selector(InGameScene::updatePaused),1/60);
}
//在暂停页面时,此函数等待恢复标志,并恢复相应效果
voidInGameScene::updatePaused(floatdelta)
{
if(!InGameScene::isPaused)
{
hideAds();//结束暂停时,隐藏广告
this->unschedule(schedule_selector(InGameScene::updatePaused));
this->removeChild(m_pPause);
CC_SAFE_RELEASE_NULL(m_pPause);
InGameScene::level=UserDefault::getInstance()->getIntegerForKey("level");
m_nDiamondCount=InGameScene::level+3;
//m_pTimerBar->runAction(MoveTo::create(float(m_nTime),Vec2(-380,95)));
this->scheduleUpdate();
this->schedule(schedule_selector(InGameScene::updateTime),1.0f);
}
}
//------------暂停按钮功能-END-----------------//
//-------------播放四周燃烧的火焰特效---------------//
voidInGameScene::playFireModeFlame()
{
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("effects/firemode-800x_port_mdpi.plist");
//down
Vector<SpriteFrame*>animationFrame1;
charstr[64]={0};
for(inti=1;i<7;++i)
{
sprintf(str,"firemodeFlameDown%d.png",i);
SpriteFrame*p=SpriteFrameCache::getInstance()->getSpriteFrameByName(str);
animationFrame1.pushBack(p);
}
Animation*animation1=Animation::createWithSpriteFrames(animationFrame1,0.12f);
Sprite*p1=Sprite::createWithSpriteFrameName("emptyPixelFireMode.png");
p1->setAnchorPoint(Vec2(0.5f,.0f));
p1->setPosition(Vec2(400,0));
p1->setTag(2001);
this->addChild(p1);
p1->runAction(RepeatForever::create(Animate::create(animation1)));
//right
Vector<SpriteFrame*>animationFrame2;
for(inti=1;i<7;++i)
{
sprintf(str,"firemodeFlameSide%d.png",i);
auto*p=SpriteFrameCache::getInstance()->getSpriteFrameByName(str);
animationFrame2.pushBack(p);
}
Animation*animation2=Animation::createWithSpriteFrames(animationFrame2,0.12f);
Sprite*p2=Sprite::createWithSpriteFrameName("emptyPixelFireMode.png");
p2->setAnchorPoint(Vec2(1.0f,0.5f));
p2->setPosition(Vec2(800,640));
p2->setTag(2002);
this->addChild(p2);
p2->runAction(RepeatForever::create(Animate::create(animation2)));
//left
Vector<SpriteFrame*>animationFrame21;
for(inti=1;i<7;++i)
{
sprintf(str,"firemodeFlameSide%d.png",i);
autop=SpriteFrameCache::getInstance()->getSpriteFrameByName(str);
animationFrame21.pushBack(p);
}
Animation*animation21=Animation::createWithSpriteFrames(animationFrame21,0.12f);
Sprite*p21=Sprite::createWithSpriteFrameName("emptyPixelFireMode.png");
p21->setFlipX(true);
p21->setAnchorPoint(Vec2(.0f,0.5f));
p21->setPosition(Vec2(0,640));
p21->setTag(2003);
this->addChild(p21);
p21->runAction(RepeatForever::create(Animate::create(animation21)));
//top
Vector<SpriteFrame*>animationFrame3;
for(inti=1;i<9;++i)
{
sprintf(str,"firemodeFlameTop%d.png",i);
SpriteFrame*p=SpriteFrameCache::getInstance()->getSpriteFrameByName(str);
animationFrame3.pushBack(p);
}
Animation*animation3=Animation::createWithSpriteFrames(animationFrame3,0.12f);
Sprite*p3=Sprite::createWithSpriteFrameName("emptyPixelFireMode.png");
p3->setAnchorPoint(Vec2(0.5f,1.0f));
p3->setPosition(Vec2(400,1280));
p3->setTag(2004);
this->addChild(p3);
p3->runAction(RepeatForever::create(Animate::create(animation3)));
//播放火燃烧音效
unsignedintid=SimpleAudioEngine()->playEffect("sounds/Speed_Mode_atmosphere.ogg",true);
m_pEffectDict->setObject(__String::createWithFormat("%d",id),"sounds/Speed_Mode_atmosphere");
}
voidInGameScene::removeFireModeFlame()
{
//停止火燃烧音效
unsignedintid=m_pEffectDict->valueForKey("sounds/Speed_Mode_atmosphere")->uintValue();
SimpleAudioEngine()->stopEffect(id);
this->removeChildByTag(2001);
this->removeChildByTag(2002);
this->removeChildByTag(2003);
this->removeChildByTag(2004);
}
//-------------播放四周燃烧的火焰特效-END--------------//
//-------------在双倍火焰模式时,点击宝石显示的"+2"贴图-------------//
voidInGameScene::displayDoubleScore()
{
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("gems/gemTexture-800x_port_mdpi.plist");
Sprite*doubleScore=Sprite::createWithSpriteFrameName("time_bonus.png");
doubleScore->setPosition(Vec2(400,750));
this->addChild(doubleScore);
doubleScore->setScale(0.3f);
doubleScore->runAction(Sequence::create(
CCScaleTo::create(.5f,1.5f),
DelayTime::create(.6f),
CallFuncN::create(this,callfuncN_selector(InGameScene::removeDoubleScoreCallback)),
NULL));
}
voidInGameScene::removeDoubleScoreCallback(Node*pSender)
{
this->removeChild(pSender);
}
//-------------在双倍火焰模式时,点击宝石显示的"+2"贴图-END------------//