标签:cocos2d-x drawprimitives 折线 画图 drawsolidcircle
实现用2dx画折线图,为以后用2dx开发应用做准备
下面记录下使用方法
auto lineView = DJLineChart::create(); std::vector<float> vec; vec.push_back(130); vec.push_back(520); vec.push_back(60); vec.push_back(0); vec.push_back(140); vec.push_back(100); vec.push_back(30); vec.push_back(80); //设置只有正数为true 有负数为false lineView->m_zfBool = true; lineView->setData(vec); lineView->setPosition(Point(0, VisibleRect::center().y)); lineView->setContentSize(Size(VisibleRect::getVisibleRect().size.width, VisibleRect::getVisibleRect().size.height * 2 /3)); addChild(lineView);
DJLineChart.h
// // DJLineChart.h // Test890 // // Created by 杜甲 on 14-4-28. // // #ifndef __Test890__DJLineChart__ #define __Test890__DJLineChart__ #include "cocos2d.h" #include "VisibleRect.h" using namespace cocos2d; using namespace std; class DJLineChart:public Layer { public: CREATE_FUNC(DJLineChart); virtual bool init(); CC_SYNTHESIZE(int, _hInterval, HInterval); CC_SYNTHESIZE(int, _vInterval, VInterval); Vector<float>* firstVec; void draw(cocos2d::Renderer *renderer, const kmMat4 &transform, bool transformUpdated); double getMaxValue(std::vector<Point> vec); std::vector<Point> pointvec; void drawLine(vector<Point> vec,Color4B lineColor,Color4B dotColor); void setData(std::vector<float> data); float spaceRatio ; //y轴间距系数 float leftRatioX; //x轴左侧间距系数 int maxValue1; //数据中的最大值 float layerHeight1 ; //图离底部的距离 bool m_zfBool; //是否有负数的判断 true 为只有正数 false 为有正有负 protected: void onDraw(const kmMat4 &transform, bool transformUpdated); CustomCommand _customCommand; }; #endif /* defined(__Test890__DJLineChart__) */
// // DJLineChart.cpp // Test890 // // Created by 杜甲 on 14-4-28. // // #include "DJLineChart.h" bool DJLineChart::init() { bool bRet = false; do { CC_BREAK_IF(!Layer::init()); // auto layerColor = LayerColor::create(Color4B::GREEN); // addChild(layerColor); bRet = true; } while (0); return bRet; } void DJLineChart::draw(cocos2d::Renderer *renderer, const kmMat4 &transform, bool transformUpdated) { _customCommand.init(1); _customCommand.func = CC_CALLBACK_0(DJLineChart::onDraw, this,transform,transformUpdated); renderer->addCommand(&_customCommand); } void DJLineChart::onDraw(const kmMat4 &transform, bool transformUpdated) { kmGLPushMatrix(); kmGLLoadMatrix(&transform); int maxValue = getMaxValue(pointvec); int maxValue2 = roundf(maxValue / 100)* 100 ; maxValue1 = maxValue2 / 10; spaceRatio = 0.06f; //y轴间距系数 leftRatioX = 0.1f; //x轴左侧间距系数 int fontSize = 20; string fontName = StringUtils::format("Thonburi"); Size layerSize = this->getContentSize(); layerHeight1 = 30; float layerHeight = layerHeight1; float layerWidth = layerSize.width; /***********************画y轴标签*************************************/ DrawPrimitives::setDrawColor4B(0, 255, 255, 255); for (int i = 0; i < 11; i++) { //采用相对数值layerWidth* 0.05f 为了以后适配 Point bPoint = Point(layerWidth* leftRatioX, layerHeight ); Point ePoint = Point(layerWidth * 0.95f, layerHeight ); Label* label = nullptr; if (m_zfBool) { label = Label::createWithSystemFont(StringUtils::format("%d",maxValue1* i).c_str(), fontName.c_str(), fontSize); }else{ label = Label::createWithSystemFont(StringUtils::format("%d",maxValue1 * 2* i - maxValue2).c_str(), fontName.c_str(), fontSize); } label->setPosition(Point(layerWidth* 0.05f, layerHeight )); addChild(label); DrawPrimitives::drawLine(bPoint, ePoint); layerHeight += layerSize.height * spaceRatio; } /***********************画y轴标签***********************************END**/ drawLine(pointvec, Color4B(0, 255, 255, 255),Color4B(255, 0, 255, 255)); CHECK_GL_ERROR_DEBUG(); //end draw kmGLPopMatrix(); } void DJLineChart::drawLine(vector<Point> vec,Color4B lineColor,Color4B dotColor) { Size layerSize = this->getContentSize(); float layerWidth = layerSize.width; float tempWidth = layerSize.height * spaceRatio; float tempWidth2 = 0; float tempHeight1 = maxValue1 ; if (m_zfBool) { }else { tempWidth2 = layerSize.height * spaceRatio * 5; tempHeight1 *= 2 ; } double ratio = tempWidth/tempHeight1; /**********************画线**********************/ std::vector<Point>::iterator beforePoint; std::vector<Point>::iterator currentPoint; beforePoint = vec.begin(); DrawPrimitives::setDrawColor4B(lineColor.r, lineColor.g, lineColor.b, lineColor.a); for (currentPoint = vec.begin() + 1;currentPoint != vec.end() ; currentPoint++) { Point bPoint = *beforePoint; bPoint = Point(bPoint.x + layerWidth* leftRatioX, bPoint.y * ratio + layerHeight1 +tempWidth2); Point ePoint = *currentPoint; ePoint = Point(ePoint.x + layerWidth* leftRatioX, ePoint.y * ratio + layerHeight1 +tempWidth2); DrawPrimitives::drawLine(bPoint, ePoint); beforePoint = currentPoint; } /**********************画线*********************end*/ /********************画点和x轴标签***********************************************/ beforePoint = vec.begin(); DrawPrimitives::setDrawColor4B(dotColor.r, dotColor.g, dotColor.b, dotColor.a); Point bPoint = *beforePoint; bPoint = Point(bPoint.x +layerWidth* leftRatioX, bPoint.y * ratio + layerHeight1 +tempWidth2); DrawPrimitives::drawSolidCircle(bPoint, 8, CC_DEGREES_TO_RADIANS(90), 50, 1.0f, 1.0f); auto labelX = Label::createWithSystemFont(StringUtils::format("%d",1).c_str(), "Thonburi", 20); labelX->setPosition(Point(bPoint.x, 0)); this->addChild(labelX); int i = 2; for (currentPoint = vec.begin() + 1;currentPoint != vec.end() ; currentPoint++) { Point ePoint = *currentPoint; ePoint = Point(ePoint.x + layerWidth* leftRatioX, ePoint.y * ratio + layerHeight1 + tempWidth2); DrawPrimitives::drawSolidCircle(ePoint, 8, CC_DEGREES_TO_RADIANS(90), 50, 1.0f, 1.0f); auto labelX = Label::createWithSystemFont(StringUtils::format("%d",i).c_str(), "Thonburi", 20); labelX->setPosition(Point(ePoint.x, 0)); this->addChild(labelX); i++; } /********************画点和x轴标签*********************************************END**/ } void DJLineChart::setData(std::vector<float> data) { std::vector<float>::iterator it; int i = 0; for (it = data.begin();it != data.end();it++) { float f = *it; pointvec.push_back(Point(50 * (i+1), f)); log("%f",f); i++; } } double DJLineChart::getMaxValue(std::vector<Point> vec) { double maxY = 8; for (int i = 0; i < vec.size(); i++) { float num = vec.at(i).y; if (maxY < abs(num)) { maxY = abs(num); } } return maxY; }
效果2:
例子下载:http://download.csdn.net/detail/qqmcy/7271261
标签:cocos2d-x drawprimitives 折线 画图 drawsolidcircle
原文地址:http://blog.csdn.net/qqmcy/article/details/24723209