源碼下載地址:http://download.csdn.net/detail/oyangyufu/7505487
點擊NEW GAME按鈕,進入遊戲主場景
代碼:
遊戲背景
layer = (CCLayer*)this->getChildren()->objectAtIndex(SnakeConstants::LAYER_BACKGROUND);
layer->setTouchEnabled(false);
//遊戲背景
CCSize size = CCDirector::sharedDirector()->getWinSize();
CCTMXTiledMap *pTMXTiledMap = CCTMXTiledMap::create("map.tmx");
pTMXTiledMap->setAnchorPoint( ccp(0.5f, 0.5f) );
pTMXTiledMap->setPosition(ccp(size.width/2 , size.height/2));
layer->addChild(pTMXTiledMap);
退出鍵
layer = (CCLayer*)this->getChildren()->objectAtIndex(SnakeConstants::LAYER_UI);
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(SnakeScene::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
CC_BREAK_IF(! pMenu);
layer->addChild(pMenu);
4個方向鍵:
CCMenuItemImage* pUpImage = CCMenuItemImage::create("u1.png", "u2.png", this, menu_selector(SnakeScene::upCallBack));
pUpImage->setAnchorPoint(ccp(0.5, 0));
pUpImage->setPositionY(6.0f);
CCMenuItemImage* pDownImage = CCMenuItemImage::create("d1.png", "d2.png", this, menu_selector(SnakeScene::downCallBack));
pDownImage->setAnchorPoint(ccp(0.5, 1));
pDownImage->setPositionY(-6.0f);
CCMenuItemImage* pLeftImage = CCMenuItemImage::create("b1.png", "b2.png", this, menu_selector(SnakeScene::leftCallBack));
pLeftImage->setAnchorPoint(ccp(1, 0.5));
pLeftImage->setPositionX(-6.0f);
CCMenuItemImage* pRightImage = CCMenuItemImage::create("f1.png", "f2.png", this, menu_selector(SnakeScene::rightCallBack));
pRightImage->setAnchorPoint(ccp(0, 0.5));
pRightImage->setPositionX(6.0f);
CCMenu* ArrowMenu = CCMenu::create(pUpImage, pDownImage, pLeftImage, pRightImage, NULL);
ArrowMenu->setPosition(50, 50);
layer->addChild(ArrowMenu);
遊戲分數:
mScoreText = CCLabelTTF::create("Score: 0", "Plok.ttf", 20);
mScoreText->setPosition(ccp(0, size.height - 10));
mScoreText->setAnchorPoint(ccp(0, 0.5));
layer->addChild(mScoreText);
遊戲開始語
mTitleText = CCLabelTTF::create("Play Game Snake!", "Plok.ttf", 30);
mTitleText->setPosition(ccp(size.width/2, size.height/2));
layer->addChild(mTitleText);
mTitleText->setScale(0.0f);
遊戲結束語
mGameOverText = new CCLabelTTF();
mGameOverText->initWithString("Game Over!", "Plok.ttf", 30);
mGameOverText->setPosition(ccp(size.width/2, size.height/2));
mGameOverText->retain();
mGameOverText->autorelease();
兩個定時器
schedule(schedule_selector(SnakeScene::ScheduleTick1), 0.4f); //播放遊戲開始語
schedule(schedule_selector(SnakeScene::GameCircle), 0.5f); //判斷遊戲是否結束
//遊戲開始語
void SnakeScene::ScheduleTick1( float dt )
{
float scale = mTitleText->getScale();
if(scale < 0.8)//從0倍縮放到0.8倍
{
mTitleText->setScale(scale+0.1);
}
else //刪除遊戲開始語
{
CCLayer* layer = (CCLayer*)this->getChildren()->objectAtIndex(SnakeConstants::LAYER_UI);
unschedule(schedule_selector(SnakeScene::ScheduleTick1));
layer->removeChild(mTitleText);
m_bGameRunning = true;//開始運行遊戲
}
}
0.5秒蛇移動一次
void SnakeScene::GameCircle( float dt )
{
if(m_bGameRunning)
{
if(!mSnake->Move())//0結束
{
OnGameOver();
}
HandleNewSnakePosition();
}
}
蛇的稱動及碰撞檢測
boolean Snake::Move()
{
mLastMoveDirection = mDirection;
if(m_bGrow)
{
m_bGrow = false;
/* If the snake should grow,
* simply add a new part in the front of the tail,
* where the head currently is. */
SnakeTailPart* newTailPart = new SnakeTailPart(m_pSnakeHead);//每一節
newTailPart->setScale(0.6f);
this->addChild(newTailPart);
marrTail.insertObject(newTailPart, 0);//marrTail管理整條蛇
}
else
{
if(marrTail.count() > 0)
{
/* First move the end of the tail to where the head currently is. */
SnakeTailPart* tailEnd = (SnakeTailPart*)marrTail.lastObject();
marrTail.removeLastObject(false);
tailEnd->SetCell(*m_pSnakeHead);
marrTail.insertObject(tailEnd, 0);
}
}
/* The move the head into the direction of the snake. 重設蛇頭的位置*/
m_pSnakeHead->SetCell(GetNextX(), GetNextY());
//檢查蛇頭跟蛇尾相撞
for(int i = marrTail.count() - 1; i >= 0; i--)
{
if(m_pSnakeHead->IsInSameCell(*(SnakeTailPart*)marrTail.objectAtIndex(i)))
{
return false;
}
}
return true;
}
創建蛇與青蛙
//主角蛇
mSnake = new Snake(RIGHT, 0, SnakeConstants::CELLS_VERTICAL/2);
mSnake->autorelease();
mSnake->GetHead()->Animate(1);
mSnake->Grow();
layer = (CCLayer*)this->getChildren()->objectAtIndex(SnakeConstants::LAYER_SNAKE);
layer->addChild(mSnake);
//青蛙
mFrog = new Frog(0, 0);
mFrog->autorelease();
mFrog->Animate(1);
this->SetFrogToRandomCell();//隨機出現一個青蛙
layer = (CCLayer*)this->getChildren()->objectAtIndex(SnakeConstants::LAYER_FOOD);
layer->addChild(mFrog);
檢測蛇是否吃了青蛙
void SnakeScene::HandleNewSnakePosition()
{
const SnakeHead* snakeHead = mSnake->GetHead();
if(snakeHead->GetCellX() < 0 || snakeHead->GetCellX() >= SnakeConstants::CELLS_HORIZON
|| snakeHead->GetCellY() < 0 || snakeHead->GetCellY() >= SnakeConstants::CELLS_VERTICAL) //蛇活動的區域
{
OnGameOver();
}
else if(snakeHead->IsInSameCell(*mFrog))//蛇吃了青蛙加分、顯示下一個青蛙
{
m_nScore += 50;
char score[128] = {0};
sprintf(score, "Score: %d", m_nScore);
mScoreText->setString(score);
mSnake->Grow();
PlayMunchSound();//喫到的聲音
this->SetFrogToRandomCell();//隨機顯示下一個青蛙
方向鍵回調函數,根據上下左右鍵方向旋轉蛇的方向
void SnakeScene::upCallBack( CCObject* sender )
{
mSnake->SetDirection(UP);
}
void SnakeScene::downCallBack( CCObject* sender )
{
mSnake->SetDirection(DOWN);
}
void SnakeScene::leftCallBack( CCObject* sender )
{
mSnake->SetDirection(LEFT);
}
void SnakeScene::rightCallBack( CCObject* sender )
{
mSnake->SetDirection(RIGHT);
void Snake::SetDirection( const Direction dirction )
{
if(mLastMoveDirection != Opposite(dirction))
{
mDirection = dirction;
m_pSnakeHead->SetRotation(dirction);
}
}
蛇的方向度
void SnakeHead::SetRotation(const Direction dirction)
{
switch(dirction)
{
case UP:
this->setRotation(180);
break;
case DOWN:
this->setRotation(0);
break;
case LEFT:
this->setRotation(90);
break;
case RIGHT:
this->setRotation(270);
break;
}
}