练手的小代码,类似连连看的小游戏,开发环境vs2010,cocos2d-x 2.04
主要实现代码
GameTwoScene.h
#ifndef __GAMETWO_SCENE_H__
#define __GAMETWO_SCENE_H__
#include "cocos2d.h"
#include "SimpleAudioEngine.h"
#include <vector>
#include <list>
class GameTwoScene : public cocos2d::CCLayer
{
public:
GameTwoScene(void);
virtual ~GameTwoScene(void);
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// there's no 'id' in cpp, so we recommand to return the exactly class pointer
static cocos2d::CCScene* scene();
// a selector callback
void menuCloseCallback(CCObject* pSender);
virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
//
void initPic();
void initPic2();
void randData();
// implement the "static node()" method manually
CREATE_FUNC(GameTwoScene);
private:
int picNum;
int picSize;
int row;
int column;
cocos2d::CCSize m_WinSize;
cocos2d::CCArray* allSprites;
std::vector<cocos2d::CCSprite*>* m_pAllPic;
cocos2d::CCLabelTTF *label1;
cocos2d::CCLabelTTF *label3;
cocos2d::CCLabelTTF *label5;
cocos2d::CCSprite* firstSprite;
int sum;
};
#endif __GAMETWO_SCENE_H__
GameTwoScene.cpp
#include "GameTwoScene.h"
using namespace std;
USING_NS_CC;
GameTwoScene::GameTwoScene(void)
{
}
GameTwoScene::~GameTwoScene(void)
{
}
bool GameTwoScene::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(! CCLayer::init());
m_WinSize = CCDirector::sharedDirector()->getWinSize();
allSprites = CCArray::create();
allSprites->retain();
firstSprite = NULL;
picNum = 9;
picSize = 32;
row = 7;
column = 8;
this->setTouchEnabled(true);
initPic2();
label1 = CCLabelTTF::create("the string", "Marker Felt", 21);
this->addChild(label1);
label1->setPosition(ccp((m_WinSize.width/2 - 40), (m_WinSize.height - 20)));
label1->setString("?");
CCLabelTTF *label2 = CCLabelTTF::create("the string", "Marker Felt", 21);
this->addChild(label2);
label2->setPosition(ccp((m_WinSize.width/2 - 20), (m_WinSize.height - 20)));
label2->setString("+");
label3 = CCLabelTTF::create("the string", "Marker Felt", 21);
this->addChild(label3);
label3->setPosition(ccp((m_WinSize.width/2 - 0), (m_WinSize.height - 20)));
label3->setString("?");
CCLabelTTF *label4 = CCLabelTTF::create("the string", "Marker Felt", 21);
this->addChild(label4);
label4->setPosition(ccp((m_WinSize.width/2 + 20), (m_WinSize.height - 20)));
label4->setString("=");
label5 = CCLabelTTF::create("the string", "Marker Felt", 21);
this->addChild(label5);
label5->setPosition(ccp((m_WinSize.width/2 + 40), (m_WinSize.height - 20)));
label5->setString("10");
randData();
CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("connect_effect.mp3");
CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("back1.mp3");
bRet = true;
} while (0);
return bRet;
}
CCScene* GameTwoScene::scene()
{
CCScene * scene = NULL;
do
{
scene = CCScene::create();
CC_BREAK_IF(! scene);
GameTwoScene *layer = GameTwoScene::create();
CC_BREAK_IF(! layer);
scene->addChild(layer);
} while (0);
return scene;
}
// a selector callback
void GameTwoScene::menuCloseCallback(CCObject* pSender)
{
}
void GameTwoScene::initPic()
{
CCTexture2D *playerRunTexture0 = CCTextureCache::sharedTextureCache()->addImage("number.png");
for(int r = 0;r < row; r++)
{
for(int c = 0; c < column; c++)
{
CCSprite* testIcon = CCSprite::createWithTexture(playerRunTexture0,CCRectMake(0, c * picSize + 2, picSize, picSize));
testIcon->setPosition(ccp(100 + c * picSize, 100 + r * picSize + 3));
addChild(testIcon,1);
}
}
}
void GameTwoScene::initPic2()
{
CCArray *sprites = CCArray::create();
char *pTrName = new char[40];
srand( time(NULL) );
for (int i=0;i<row;i++)
{
for (int j=0;j<column;j++)
{
int randNum = rand();
randNum = randNum % (picNum + 1);
sprintf(pTrName,"0%d.png", randNum);
CCSprite* pPic = CCSprite::create(pTrName);
pPic->setTag(randNum);
sprites->addObject(pPic);
}
}
for(int i=0;i<row;i++)
{
for(int j=0;j<column;j++)
{
int count = sprites->count();
int randNum = rand();
randNum = randNum % (count);
CCSprite* sprite = (CCSprite*)sprites->objectAtIndex(randNum);
sprite->setScale(picSize/sprite->getContentSize().width);
sprite->setPosition(ccp(100 + j * picSize, 50 + i * picSize + 3));
sprites->removeObjectAtIndex(randNum);
addChild(sprite);
allSprites->addObject(sprite);
}
}
}
void GameTwoScene::ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent)
{
CCTouch *touch = (CCTouch*)pTouches->anyObject();
CCPoint location = touch->getLocation();
int count = allSprites->count();
for(int i = 0; i < count; i++)
{
CCSprite* sprite = (CCSprite*)allSprites->objectAtIndex(i);
CCRect rect= sprite->boundingBox();
if(rect.containsPoint(location))
{
if(firstSprite == NULL)
{
firstSprite = sprite;
CCActionInterval* action;
action = CCFadeOut::create(0.5);
CCActionInterval* action_back = action->reverse();
CCActionInterval* seq = (CCActionInterval*)(CCSequence::create( action, action_back, NULL ));
sprite->runAction( CCRepeatForever::create(seq) );
label1->setString(CCString::createWithFormat("%d", sprite->getTag())->getCString());
}
else
{
CCRect firstRect = firstSprite->boundingBox();
if(!firstRect.containsPoint(location))
{
CCActionInterval* action;
action = CCFadeOut::create(0.5);
CCActionInterval* action_back = action->reverse();
CCActionInterval* seq = (CCActionInterval*)(CCSequence::create( action, action_back, NULL ));
sprite->runAction( CCRepeatForever::create(seq) );
label3->setString(CCString::createWithFormat("%d", sprite->getTag())->getCString());
if(sprite->getTag() + firstSprite->getTag() == sum)
{
this->removeChild(sprite, true);
this->removeChild(firstSprite, true);
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("connect_effect.mp3");
allSprites->removeObject(sprite);
allSprites->removeObject(firstSprite);
randData();
firstSprite = NULL;
break;
}
else
{
firstSprite->stopAllActions();
firstSprite->setOpacity(255);
label1->setString(CCString::createWithFormat("%d", sprite->getTag())->getCString());
label3->setString("?");
firstSprite = sprite;
}
}
}
}
}
}
void GameTwoScene::randData()
{
int co = allSprites->count();
if(co > 0){
label1->setString("?");
label3->setString("?");
int randNum = -1;
int num = -1;
do
{
int randNum1 = rand();
randNum1 = randNum1 % (co);
CCSprite* sprite = (CCSprite*)allSprites->objectAtIndex(randNum1);
int num1 = sprite->getTag();
if(randNum != -1 && randNum != randNum1)
{
sum = num + num1;
label5->setString(CCString::createWithFormat("%d", sum)->getCString());
break;
}
else
{
randNum = randNum1;
num = num1;
}
}while(true);
}
}
源码地址:http://www.oschina.net/code/snippet_117179_22239