cocos2d-x3.0 柱图

画柱图就是多画几个矩形之后放在一起,这个实现了基本功能还不够完善如果要用到项目中需要自己修改。

原文地址:http://blog.csdn.net/qqmcy/article/details/25984717

效果图:

cocos2d-x3.0 柱图_第1张图片

使用类:

HelloWorldScene.cpp

#include "HelloWorldScene.h"
#include "DJColumn.h"

#include "DJColumnChart.h"



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();
    Point origin = Director::getInstance()->getVisibleOrigin();

//    auto top = Label::createWithSystemFont("hi放大师傅看到是非得失", "huawenxinsong", 20);
//    top->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
//    addChild(top);
    
    
    
    std::vector<float> temp;
    temp.push_back(106);
    temp.push_back(206);
    temp.push_back(305);
    temp.push_back(152);
    std::vector<float> temp1;
    temp1.push_back(73);
    temp1.push_back(126);
    temp1.push_back(55);
    temp1.push_back(203);
    std::vector<std::vector<float>> vec;
    vec.push_back(temp);
    vec.push_back(temp1);
    
    std::vector<Color4B> colorVec;
    colorVec.push_back(Color4B::RED);
    colorVec.push_back(Color4B::ORANGE);
    
    
    DJColumnChart* djColumnChart = DJColumnChart::create();
    djColumnChart->setColumnValueVec(vec);
    djColumnChart->setColumnColorVec(colorVec);
    djColumnChart->setSize(Size(700, 700));
    djColumnChart->setPosition(Point(200, 10));
    djColumnChart->addDJColumnChart();
    addChild(djColumnChart);
    
    
    
    return true;
}


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
}

DJColumn.h柱图节点类

//
//  DJColumn.h
//  ColumnChart
//
//  Created by 杜甲 on 14-5-15.
//
//

#ifndef __ColumnChart__DJColumn__
#define __ColumnChart__DJColumn__

#include "cocos2d.h"
#include "ui/CocosGUI.h"
USING_NS_CC;

class DJColumn :public ui::Layout{
    
public:
    CREATE_FUNC(DJColumn);
     CC_SYNTHESIZE(Color4B, _djColumnColor, DJColumnColor);
    CC_SYNTHESIZE(float, _djColumnValue, DJColumnValue);
    CC_SYNTHESIZE(Size, _djColumnSize, DJColumnSize);
    
    
    virtual bool init();
    void draw(cocos2d::Renderer *renderer, const kmMat4 &transform, bool transformUpdated);
    void onDraw(const kmMat4 &transform, bool transformUpdated);
    CustomCommand _customCommand;
    
};

#endif /* defined(__ColumnChart__DJColumn__) */

DJColumn.cpp

//
//  DJColumn.cpp
//  ColumnChart
//
//  Created by 杜甲 on 14-5-15.
//
//

#include "DJColumn.h"
bool DJColumn::init()
{
    bool bRet = false;
    do {
        
        CC_BREAK_IF(!ui::Layout::init());
        
        
        
        bRet = true;
    } while (0);
    
    return bRet;
}


void DJColumn::draw(cocos2d::Renderer *renderer, const kmMat4 &transform, bool transformUpdated)
{
    _customCommand.init(_globalZOrder);
    _customCommand.func = CC_CALLBACK_0(DJColumn::onDraw, this,transform,transformUpdated);
    renderer->addCommand(&_customCommand);

}

void DJColumn::onDraw(const kmMat4 &transform, bool transformUpdated)
{
    kmGLPushMatrix();
    kmGLLoadMatrix(&transform);
    CHECK_GL_ERROR_DEBUG();
    
    DrawPrimitives::drawSolidRect(Point(0, 0), Point(getSize().width, getSize().height),Color4F(_djColumnColor.r, _djColumnColor.g, _djColumnColor.b, _djColumnColor.a));
    
    
    
     kmGLPopMatrix();
}

DJColumnChart.h柱图类

//
//  DJColumnChart.h
//  ColumnChart
//
//  Created by 杜甲 on 14-5-15.
//
//

#ifndef __ColumnChart__DJColumnChart__
#define __ColumnChart__DJColumnChart__

#include "cocos2d.h"
#include "ui/CocosGUI.h"
USING_NS_CC;

class DJColumnChart:public ui::Layout{
    
public:
    CREATE_FUNC(DJColumnChart);
    virtual bool init();
    
    CC_SYNTHESIZE(std::vector<std::vector<float>>, _columnValueVec, ColumnValueVec);
    
    CC_SYNTHESIZE(std::vector<Color4B>, _columnColorVec, ColumnColorVec);
    
    void addDJColumnChart();
    
    std:: string fontName;
    
    double getMaxValue(std::vector<float> vec);
    
    
    void draw(cocos2d::Renderer *renderer, const kmMat4 &transform, bool transformUpdated);
    void onDraw(const kmMat4 &transform, bool transformUpdated);
    CustomCommand _customCommand;
    
private:
    float spaceRatio ;  //y轴间距系数
    float leftRatioX;   //x轴左侧间距系数
    int maxValue1;    //数据中的最大值
    
    float  layerHeight1 ;  //图离底部的距离
    
};

#endif /* defined(__ColumnChart__DJColumnChart__) */

DJColumnChart.cpp

//
//  DJColumnChart.cpp
//  ColumnChart
//
//  Created by 杜甲 on 14-5-15.
//
//

#include "DJColumnChart.h"
#include "DJColumn.h"





bool DJColumnChart::init()
{
    bool bRet = false;
    do {
        
        CC_BREAK_IF(!ui::Layout::init());
        
        
        fontName = "huawenxinsong";
        
        
        
        
        bRet = true;
    } while (0);
    return bRet;
}

void DJColumnChart::draw(cocos2d::Renderer *renderer, const kmMat4 &transform, bool transformUpdated)
{
    _customCommand.init(_globalZOrder);
    _customCommand.func = CC_CALLBACK_0(DJColumnChart::onDraw, this,transform,transformUpdated);
    renderer->addCommand(&_customCommand);
    
}
void DJColumnChart::onDraw(const kmMat4 &transform, bool transformUpdated)
{
    kmGLPushMatrix();
    kmGLLoadMatrix(&transform);
    
    spaceRatio = 0.06f;
    leftRatioX = 0.1f;
    
    std::vector<float> v0 = _columnValueVec.at(0);
    std::vector<float> v1 = _columnValueVec.at(1);
    
    
    
    double max1 = getMaxValue(v0);
    double max2 = getMaxValue(v1);
    
    double max  = max2;
    
    if (max1 > max2) {
        max = max1;
    }
    
     int maxValue2 = roundf(max / 100)* 100 ;
  int  maxNum = maxValue2 / 10;
    
    
    
   
    
    DrawPrimitives::setDrawColor4B(0, 255, 255, 255);
    
    float layoutHeight = getSize().height;
    float layoutWidth = getSize().width;
    
    
    
    float betweenDistance = layoutHeight / 13;
    log("AAAAA%f",betweenDistance);
    
    float tempbetweenDistance = betweenDistance;
    
    
    
    
    for (int i = 0; i < 11; i ++) {
        
        Point bPoint = Point(44, tempbetweenDistance);
        Point ePoint = Point(layoutWidth - 30, tempbetweenDistance);
        
        DrawPrimitives::drawLine(bPoint, ePoint);
        
        
        
        ui::Text* text = ui::Text::create(StringUtils::format("%d",maxNum* i), fontName, 20);
        text->setPosition(Point(18, tempbetweenDistance));
        text->setTextHorizontalAlignment(TextHAlignment::CENTER);
        text->setSize(Size(layoutWidth * 0.08, 20));
        addChild(text);
//        Label* labelY = Label::createWithSystemFont(StringUtils::format("%d",i), "huawenxinsong", 20);
//        labelY->setAlignment(TextHAlignment::RIGHT);
//        labelY->setPosition(Point(2, tempbetweenDistance));
//        addChild(labelY);
        
        tempbetweenDistance += betweenDistance;
    }
    
    kmGLPopMatrix();
}


void DJColumnChart::addDJColumnChart()
{
    float betweenDistance = getSize().height / 12;
    log("betweenDistance = %f",betweenDistance);
    
    
    std::vector<float> temp = _columnValueVec.at(0);
  
    std::vector<float> temp1 = _columnValueVec.at(1);
    
    
    Color4B c1 = _columnColorVec.at(0);
    Color4B c2 = _columnColorVec.at(1);
    
    
    
    for (int i = 0; i <temp1.size(); i++) {
        DJColumn* djColumn = DJColumn::create();
        djColumn->setSize(Size(20, temp1.at(i) * 53.846153/30));
        djColumn->setDJColumnColor(c1);
        
        //djColumn->setAnchorPoint(Point::ANCHOR_MIDDLE_BOTTOM);
        djColumn->setPosition(Point(60 * i + getSize().width * 0.1 + 20, betweenDistance ));
        
        addChild(djColumn);
    }
    
    
    
    for (int i = 0; i <temp.size(); i++) {
        DJColumn* djColumn = DJColumn::create();
        djColumn->setSize(Size(20, temp.at(i)  * 53.846153/30));
        djColumn->setDJColumnColor(c2);
        
        //djColumn->setAnchorPoint(Point::ANCHOR_MIDDLE_BOTTOM);
        djColumn->setPosition(Point(60 * i + getSize().width * 0.1 , betweenDistance ));
        
        addChild(djColumn);
        
        
        
        ui::Text* nameText = ui::Text::create("名字", fontName, 20);
        nameText->setPosition(Point(60 * i + getSize().width * 0.1 + 25 , 40));
        addChild(nameText);
        
        
        
        
    }
    
    
}

double DJColumnChart::getMaxValue(std::vector<float> vec)
{
    
    double maxY = 8;
    
    for (int i = 0; i < vec.size(); i++) {
        float num = vec.at(i);
        if (maxY < abs(num)) {
            maxY = abs(num);
        }
    }
    return maxY;
}


















你可能感兴趣的:(柱图,cocos2d-x3.0)