Cocos2d-x C++ Lap Timer

  • Sonar Systems admin
    Likes 1

    Problem Description

    Your creating that awesome racer, but you need a lap timer system, here it is laugh

     

    Solution Description

    Video Solution:

     

    Header File

    #ifndef __HELLOWORLD_SCENE_H__
    #define __HELLOWORLD_SCENE_H__
    
    #include "cocos2d.h"
    
    class HelloWorld : public cocos2d::Layer
    {
    public:
        // there's no 'id' in cpp, so we recommend returning the class instance pointer
        static cocos2d::Scene* createScene();
    
        // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
        virtual bool init();
        
        // a selector callback
        void menuCloseCallback(cocos2d::Ref* pSender);
        
        // implement the "static create()" method manually
        CREATE_FUNC(HelloWorld);
        
        void TimerMethod(float dt);
        
        cocos2d::Label *label;
        float time;
        
        float laps[3];
        
        int lapIndex;
    };
    
    #endif // __HELLOWORLD_SCENE_H__
    

    Implementation File

    #include "HelloWorldScene.h"
    #include 
    
    USING_NS_CC;
    
    Scene* HelloWorld::createScene()
    {
        // 'scene' is an autorelease object
        auto scene = Scene::create();
        
        // 'layer' is an autorelease object
        auto layer = HelloWorld::create();
    
        // add layer as a child to scene
        scene->addChild(layer);
    
        // return the scene
        return scene;
    }
    
    // on "init" you need to initialize your instance
    bool HelloWorld::init()
    {
        //////////////////////////////
        // 1. super init first
        if ( !Layer::init() )
        {
            return false;
        }
        
        Size visibleSize = Director::getInstance()->getVisibleSize();
        Vec2 origin = Director::getInstance()->getVisibleOrigin();
    
        /////////////////////////////
        // 2. add a menu item with "X" image, which is clicked to quit the program
        //    you may modify it.
    
        // add a "close" icon to exit the progress. it's an autorelease object
        auto closeItem = MenuItemImage::create(
                                               "CloseNormal.png",
                                               "CloseSelected.png",
                                               CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
        
    	closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
                                    origin.y + closeItem->getContentSize().height/2));
    
        // create menu, it's an autorelease object
        auto menu = Menu::create(closeItem, NULL);
        menu->setPosition(Vec2::ZERO);
        this->addChild(menu, 1);
    
        /////////////////////////////
        // 3. add your codes below...
    
        // add a label shows "Hello World"
        // create and initialize a label
        
        label = Label::createWithTTF("0", "fonts/Marker Felt.ttf", 24);
        
        // position the label on the center of the screen
        label->setPosition(Vec2(origin.x + visibleSize.width/2,
                                origin.y + visibleSize.height - label->getContentSize().height));
    
        // add the label as a child to this layer
        this->addChild(label, 1);
        
        time = 0;
        lapIndex = 0;
    
        this->schedule(schedule_selector(HelloWorld::TimerMethod), 0.01);
        
        return true;
    }
    
    void HelloWorld::TimerMethod(float dt)
    {
        time += dt;
        __String *timeToDisplay = __String::createWithFormat("%.2f", time);
        label->setString(timeToDisplay->getCString());
    }
    
    void HelloWorld::menuCloseCallback(Ref* pSender)
    {
        if ( lapIndex < 3 )
        {
            laps[lapIndex] = time;
            
            lapIndex++;
            
            log( "Lap %i: %.2f", lapIndex, time );
            
            time = 0;
        }
    }
    

     


Login to reply