注:
1.没有实现倒计时30秒,而是顺数30秒
2.打包好的apk,不能调用系统时钟,所以计时功能只有在vs上有效
3.apk地址:http://pan.baidu.com/share/link?shareid=3877337685&uk=185595768
调整屏幕大小:
AppDelegate.cpp:
bool AppDelegate::applicationDidFinishLaunching() {
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
//修改屏幕大小
glview = GLView::createWithRect("MyBlock",Rect(0,0,286,512),1.0f);
director->setOpenGLView(glview);
}
glview->setDesignResolutionSize(268,512,ResolutionPolicy::EXACT_FIT);
director->setDisplayStats(true);
director->setAnimationInterval(1.0 / 60);
auto scene = HelloWorld::createScene();
director->runWithScene(scene);
return true;
}
卡片类:
Card.h:
#include "cocos2d.h"
USING_NS_CC;
class Card : public Sprite
{
public:
static Card* createCard(Color3B bgColor,Size cardSize);
virtual bool init(Color3B bgColor,Size cardSize);
void setLineIndex(int index);
int getLineIndex();
void removeCard();
//获取向量里的对象
static Vector<Card*> *getCard();
//向下移动一行
void moveDown();
//清空向量
static void renewVector();
private:
//用向量存放Card
static Vector<Card*> *cards;
//记录卡片所在的行
int lineIndex;
};
Card.cpp:
#include "Card.h"
USING_NS_CC;
Vector<Card*> *Card::cards = new Vector<Card*>();
Card* Card::createCard(Color3B bgColor,Size cardSize)
{
auto card = new Card();
card->init(bgColor,cardSize);
card->autorelease();
cards->pushBack(card);
return card;
}
bool Card::init(Color3B bgColor,Size cardSize)
{
Sprite::init();
lineIndex = 0;
setContentSize(cardSize);
setAnchorPoint(Point::ZERO);
setTextureRect(Rect(0,0,cardSize.width,cardSize.height));
setColor(bgColor);
return true;
}
Vector<Card*> * Card::getCard()
{
return cards;
}
void Card::setLineIndex(int index)
{
this->lineIndex = index;
}
int Card::getLineIndex()
{
return this->lineIndex;
}
void Card::removeCard(){
removeFromParent();
cards->eraseObject(this);
}
//向下移动一行
void Card::moveDown()
{
this->lineIndex--;
Size visibleSize = Director::getInstance()->getVisibleSize();
runAction(Sequence::create(MoveTo::create(0.1f, Point(getPositionX(), lineIndex*visibleSize.height/4)),
CallFunc::create([this](){
if (lineIndex<0) {
this->removeCard();
}
}), NULL));
}
void Card::renewVector()
{
cards->clear();
}
HelloWorldScene.h:
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
#include "Card.h"
class HelloWorld : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
void menuCloseCallback(cocos2d::Ref* pSender);
CREATE_FUNC(HelloWorld);
//添加卡片
void addStartLine();
void addNormalLine(int lineIndex);
void startGame();
//向下移动一行
void moveDown();
//显示时间
void update(float dt);
//清空向量里的卡片
void removeAllCard();
private:
Size visibleSize;
Point origin;
//记录分数
int score;
Node *gameLayer;
//倒计时
long startTime;
LabelTTF *label;
};
#endif // __HELLOWORLD_SCENE_H__
HelloWorldScene.cpp:
#include "HelloWorldScene.h"
USING_NS_CC;
Scene* HelloWorld::createScene()
{
auto scene = Scene::create();
auto layer = HelloWorld::create();
scene->addChild(layer);
return scene;
}
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
visibleSize = Director::getInstance()->getVisibleSize();
origin = Director::getInstance()->getVisibleOrigin();
//设置随机种子
srand(time(NULL));
//gameLayer层
gameLayer = Node::create();
addChild(gameLayer);
score = 0;
startTime = clock();
startGame();
//时间label
label = LabelTTF::create();
label->setString("0.000");
label->setFontSize(30);
label->setColor(Color3B(255,0,0));
label->setPosition(Point(visibleSize.width/2,visibleSize.height-20));
addChild(label);
//开启计时器
scheduleUpdate();
//设置事件监听器
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = [this](Touch *t,Event *e)
{
//schedule(schedule_selector(HelloWorld::Go),0.3);
//遍历卡片向量
auto c = Card::getCard();
Card *it;
for (auto iterator = c->begin() ; iterator != c->end(); iterator++)
{
it = *iterator;
if(it->getLineIndex()==1 && it->getBoundingBox().containsPoint(t->getLocation()))
{
//若是黑块
if(it->getColor()==Color3B::BLACK)
{
it->setColor(Color3B::GRAY);
score++;
this->moveDown();
}
else
{
unscheduleUpdate();
this->removeAllCard();
Director::getInstance()->replaceScene(TransitionFade::create(1,HelloWorld::createScene()));
}
break;
}
}
return false;
};
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener,this);
return true;
}
void HelloWorld::startGame()
{
addStartLine();
addNormalLine(1);
addNormalLine(2);
addNormalLine(3);
}
void HelloWorld::addNormalLine(int lineIndex)
{
Card *card;
int blackIndex = rand()%4;
for (int i = 0; i < 4; i++)
{
card = Card::createCard(blackIndex==i?Color3B::BLACK:Color3B::WHITE,Size(visibleSize.width/4-1,visibleSize.height/4-1));
card->setPosition(Point(i*visibleSize.width/4,lineIndex*visibleSize.height/4));
card->setLineIndex(lineIndex);
gameLayer->addChild(card);
}
}
void HelloWorld::addStartLine()
{
Card *c;
for (int i = 0; i < 4; i++)
{
c = Card::createCard(Color3B::YELLOW,Size(visibleSize.width/4-1,visibleSize.height/4-1));
c->setPosition(Point(i*visibleSize.width/4,0));
c->setLineIndex(0);
gameLayer->addChild(c);
}
}
void HelloWorld::menuCloseCallback(Ref* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
return;
#endif
Director::getInstance()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
void HelloWorld::moveDown()
{
addNormalLine(4);
auto bs = Card::getCard();
for (auto i = bs->begin(); i!=bs->end(); i++) {
(*i)->moveDown();
}
}
void HelloWorld::update(float dt)
{
long offset = clock()-startTime;
if((int)offset/1000 > 29)
{
label->setString(StringUtils::format("Score:%d",score));
unscheduleUpdate();
}
else
{
label->setString(StringUtils::format("%g",((double)offset)/1000));
}
}
void HelloWorld::removeAllCard()
{
Card::renewVector();
}