效果图:

cocos2d-x3.0 柱图_#if

使用类:

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;
}