设为首页 - 加入收藏 焦点技术网
热搜:java
当前位置:首页 >

【cocos2dx 3.2】别碰白块禅模式

2014-10-09 11:28:00.0 Coco2dx  
导读:注:1.没有实现倒计时30秒,而是顺数30秒2.打包好的apk,不能调用系统时钟,所以计时功能只有在vs上有效3.apk地址:http://pan.baidu.com/share/link?shareid=3877337685&uk=185595768调整屏幕大小:AppDelegate.cpp:bool AppDelegate::applicationDidFinishLaunching() {...。。。

注:

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 *getCard(); //向下移动一行 void moveDown(); //清空向量 static void renewVector();private: //用向量存放Card static Vector *cards; //记录卡片所在的行 int lineIndex;};

Card.cpp:

#include "Card.h"USING_NS_CC;Vector *Card::cards = new Vector();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::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();}


(编辑: ns2250225)

网友评论
相关文章