cocos2d-x 画线
/*
//绘制矩形 (‘起始点’ , ‘目标点’ , ‘填充颜色’)
auto rect=DrawNode::create();
rect->drawRect(Vec2(0,0),Vec2(100,150), Color4F(1.0,0,0,1.0));
this->addChild(rect);
//绘制指定曲率的曲线 ('点数组','张力','段落','颜色')
//参数说明:
//congfig:点数组
//tension:张力
//segments:段落
//color:颜色
auto cardinalspline=DrawNode::create();
auto array = PointArray::create(4);
array->addControlPoint(Vec2(20, 20));
array->addControlPoint(Vec2(40, 10));
array->addControlPoint(Vec2(-10, 10));
array->addControlPoint(Vec2(60, -10));
array->addControlPoint(Vec2(10, 50));
cardinalspline->drawCardinalSpline(array, 3, 10, Color4F(1.0,1.0,1.0,1));
this->addChild(cardinalspline);
//绘制默认曲率的曲线
auto cat=DrawNode::create();
cat->drawCatmullRom(array, 20, Color4F(1.0, 1.0, 1.0, 1.0));
this->addChild(cat);
//绘制圆 参数说明: (‘原点’,‘半径’,‘弧度’,‘分段(越大越接近圆)’,‘原点到弧度的线(bool)’,‘线条x缩放’,‘线条y缩放’,‘颜色’)
auto circle=DrawNode::create();
circle->drawCircle(Vec2(0, 0), 100, 45, 100, false, 1.0, 1.0, Color4F(1.0,1.0,1.0,1));
this->addChild(circle);
//绘制线段 (‘起点’ , ‘终点’ , ‘半线宽’ , ‘填充颜色’)
auto segment=DrawNode::create();
segment->drawSegment(Vec2(0, 0), Vec2(20, 20), 3.0, Color4F(0.4,0.6,0.8,1));
this->addChild(segment);
//绘制三角形 (‘顶点1′ , ‘顶点2′ , ‘顶点3′ , ‘填充颜色’)
auto triangle=DrawNode::create();
triangle->drawTriangle(Vec2(20,11), Vec2(133,44), Vec2(44,133), Color4F(0.5,0.6,0.7,1));
this->addChild(triangle);
//绘制多边形 (‘顶点数组’ , ‘顶点个数’ , ‘填充颜色’ , ‘轮廓粗细’ , ‘轮廓颜色’)
auto polygon=DrawNode::create();
Vec2 verts[]={Vec2(12,22),Vec2(56,66),Vec2(88,98),Vec2(124,54),Vec2(144,88)};//顶点数组
polygon->drawPolygon(verts, 5, Color4F(1.0,0,0,1), 2, Color4F(0,0,1.0,1));
this->addChild(polygon);
//绘制二次贝塞尔图形 (‘起点’ , ‘控制点’ , ‘终点’ , ‘分段数’ , ‘填充颜色’)
auto quad=DrawNode::create();
quad->drawQuadBezier(Vec2(12,10), Vec2(22,33), Vec2(111,111), 20, Color4F(0.1,1.0,0.2,1));
this->addChild(quad);
//绘制三次贝塞尔图形 (‘起点’ , ‘控制点1′ , ‘控制点2′ , ‘终点’ , ‘分段数’ , ‘填充颜色’)
auto cubic=DrawNode::create();
cubic->drawCubicBezier(Vec2(0,0), Vec2(33,23), Vec2(75,96), Vec2(44,33), 22, Color4F(0.7,0,0,1));
this->addChild(cubic);
//绘制线段 ('起点','终点','宽度','颜色')
auto dsegment=DrawNode::create();
dsegment->drawSegment(Vec2(20, 22), Vec2(20,100), 2, Color4F(1.0,0.1,0.8,1));
this->addChild(dsegment);
//绘制线 ('起点','终点','颜色')
auto line=DrawNode::create();
line->drawLine(Vec2(33,33), Vec2(222,222), Color4F(1.0,1.0,0.2,1));
this->addChild(line);
//绘制圆点 (‘位置’ , ‘圆点半径’ , ‘填充颜色’)
auto dot=DrawNode::create();
dot->drawDot(Vec2(0,0), 5, Color4F(1.0, 1.0, 1.0, 1.0));
rect->addChild(dot);
//设置坐标位置
rect->setPosition(visibleSize/2);//设置矩形位置居中
dot->setPosition(Vec2(0, 0));//设置圆点的位置
cardinalspline->setPosition(visibleSize/2);//设置曲线位置
circle->setPosition(visibleSize/2);
segment->setPosition(visibleSize/2);
triangle->setPosition(visibleSize/2);
polygon->setPosition(visibleSize/5);
quad->setPosition(Vec2(230,20));
cubic->setPosition(visibleSize/2);
dsegment->setPosition(Vec2(22,22));
line->setPosition(Vec2(44,22));
cat->setPosition(Vec2( visibleSize.width/2+50,visibleSize.height/2+20));
最近在用cocos2d-x做鱼在水池里游动,直线游动比较容易实现,但是要使鱼转弯,绕着圆弧游动就有点难度了,
不仅鱼的位置是圆的轨迹点,它的方向也要跟着相应变化,并且要准确控制它是顺时针转还是逆时针。
搞了大半天,不断试验不断修改,终于把它封装成一个CCArcBy的action, 以后可以直接拿来用了。 CCArcBy的初始化方法是
bool initWithDuration(ccTime duration, float radius, float angle, bool clockwise);
只要给定转弯的半径,角度,时针方向和时间,就可以让node绕着圆弧进行运动,
并且相应改变它的方向。具体原理是运行该action时候,会根据当前node的position和rotation创建直线方程lq,
创建垂直于直线lq并且相交于position的直线方程lq2, 根据时针方向创建与直线lq平行并且距离为radius的直线方程lq3,
计算lq2和q3的交点就是圆弧的圆心位置了。
在圆弧运动每次update过程中,调用框架自带的ccpRotateByAngle方法就能得到当前node的位置了,
而node的方向要减去转弯的角度,这样鱼就能正常转弯游动了,还能不时拜摆摆尾巴!
*/
// 创建一个圆弧
//void drawArc(cocos2d::DrawNode* drawNode, const cocos2d::Vec2& center, float radius, float startAngle, float endAngle, int segments, float width) {
// // segments 是圆弧分割的线段数,增加segments可以使得弧线更加平滑
// // width 是弧线的宽度
// const float coef = 2.0f * (float)M_PI / segments;
//
// // 计算起始点
// cocos2d::Vec2 point = center + cocos2d::Vec2(radius * cos(startAngle), radius * sin(startAngle));
//
// drawNode->moveTo(point);
// for (int i = 1; i < segments; ++i) {
// float angle = startAngle + i * coef;
// point = center + cocos2d::Vec2(radius * cos(angle), radius * sin(angle));
// drawNode->lineTo(point);
// }
//
// // 画圆弧的结束点
// point = center + cocos2d::Vec2(radius * cos(endAngle), radius * sin(endAngle));
// drawNode->lineTo(point);
//}
//绘制矩形 (‘起始点’ , ‘目标点’ , ‘填充颜色’)
auto rect=DrawNode::create();
rect->drawRect(Vec2(0,0),Vec2(100,150), Color4F(1.0,0,0,1.0));
this->addChild(rect);
//绘制指定曲率的曲线 ('点数组','张力','段落','颜色')
//参数说明:
//congfig:点数组
//tension:张力
//segments:段落
//color:颜色
auto cardinalspline=DrawNode::create();
auto array = PointArray::create(4);
array->addControlPoint(Vec2(20, 20));
array->addControlPoint(Vec2(40, 10));
array->addControlPoint(Vec2(-10, 10));
array->addControlPoint(Vec2(60, -10));
array->addControlPoint(Vec2(10, 50));
cardinalspline->drawCardinalSpline(array, 3, 10, Color4F(1.0,1.0,1.0,1));
this->addChild(cardinalspline);
//绘制默认曲率的曲线
auto cat=DrawNode::create();
cat->drawCatmullRom(array, 20, Color4F(1.0, 1.0, 1.0, 1.0));
this->addChild(cat);
//绘制圆 参数说明: (‘原点’,‘半径’,‘弧度’,‘分段(越大越接近圆)’,‘原点到弧度的线(bool)’,‘线条x缩放’,‘线条y缩放’,‘颜色’)
auto circle=DrawNode::create();
circle->drawCircle(Vec2(0, 0), 100, 45, 100, false, 1.0, 1.0, Color4F(1.0,1.0,1.0,1));
this->addChild(circle);
//绘制线段 (‘起点’ , ‘终点’ , ‘半线宽’ , ‘填充颜色’)
auto segment=DrawNode::create();
segment->drawSegment(Vec2(0, 0), Vec2(20, 20), 3.0, Color4F(0.4,0.6,0.8,1));
this->addChild(segment);
//绘制三角形 (‘顶点1′ , ‘顶点2′ , ‘顶点3′ , ‘填充颜色’)
auto triangle=DrawNode::create();
triangle->drawTriangle(Vec2(20,11), Vec2(133,44), Vec2(44,133), Color4F(0.5,0.6,0.7,1));
this->addChild(triangle);
//绘制多边形 (‘顶点数组’ , ‘顶点个数’ , ‘填充颜色’ , ‘轮廓粗细’ , ‘轮廓颜色’)
auto polygon=DrawNode::create();
Vec2 verts[]={Vec2(12,22),Vec2(56,66),Vec2(88,98),Vec2(124,54),Vec2(144,88)};//顶点数组
polygon->drawPolygon(verts, 5, Color4F(1.0,0,0,1), 2, Color4F(0,0,1.0,1));
this->addChild(polygon);
//绘制二次贝塞尔图形 (‘起点’ , ‘控制点’ , ‘终点’ , ‘分段数’ , ‘填充颜色’)
auto quad=DrawNode::create();
quad->drawQuadBezier(Vec2(12,10), Vec2(22,33), Vec2(111,111), 20, Color4F(0.1,1.0,0.2,1));
this->addChild(quad);
//绘制三次贝塞尔图形 (‘起点’ , ‘控制点1′ , ‘控制点2′ , ‘终点’ , ‘分段数’ , ‘填充颜色’)
auto cubic=DrawNode::create();
cubic->drawCubicBezier(Vec2(0,0), Vec2(33,23), Vec2(75,96), Vec2(44,33), 22, Color4F(0.7,0,0,1));
this->addChild(cubic);
//绘制线段 ('起点','终点','宽度','颜色')
auto dsegment=DrawNode::create();
dsegment->drawSegment(Vec2(20, 22), Vec2(20,100), 2, Color4F(1.0,0.1,0.8,1));
this->addChild(dsegment);
//绘制线 ('起点','终点','颜色')
auto line=DrawNode::create();
line->drawLine(Vec2(33,33), Vec2(222,222), Color4F(1.0,1.0,0.2,1));
this->addChild(line);
//绘制圆点 (‘位置’ , ‘圆点半径’ , ‘填充颜色’)
auto dot=DrawNode::create();
dot->drawDot(Vec2(0,0), 5, Color4F(1.0, 1.0, 1.0, 1.0));
rect->addChild(dot);
//设置坐标位置
rect->setPosition(visibleSize/2);//设置矩形位置居中
dot->setPosition(Vec2(0, 0));//设置圆点的位置
cardinalspline->setPosition(visibleSize/2);//设置曲线位置
circle->setPosition(visibleSize/2);
segment->setPosition(visibleSize/2);
triangle->setPosition(visibleSize/2);
polygon->setPosition(visibleSize/5);
quad->setPosition(Vec2(230,20));
cubic->setPosition(visibleSize/2);
dsegment->setPosition(Vec2(22,22));
line->setPosition(Vec2(44,22));
cat->setPosition(Vec2( visibleSize.width/2+50,visibleSize.height/2+20));
最近在用cocos2d-x做鱼在水池里游动,直线游动比较容易实现,但是要使鱼转弯,绕着圆弧游动就有点难度了,
不仅鱼的位置是圆的轨迹点,它的方向也要跟着相应变化,并且要准确控制它是顺时针转还是逆时针。
搞了大半天,不断试验不断修改,终于把它封装成一个CCArcBy的action, 以后可以直接拿来用了。 CCArcBy的初始化方法是
bool initWithDuration(ccTime duration, float radius, float angle, bool clockwise);
只要给定转弯的半径,角度,时针方向和时间,就可以让node绕着圆弧进行运动,
并且相应改变它的方向。具体原理是运行该action时候,会根据当前node的position和rotation创建直线方程lq,
创建垂直于直线lq并且相交于position的直线方程lq2, 根据时针方向创建与直线lq平行并且距离为radius的直线方程lq3,
计算lq2和q3的交点就是圆弧的圆心位置了。
在圆弧运动每次update过程中,调用框架自带的ccpRotateByAngle方法就能得到当前node的位置了,
而node的方向要减去转弯的角度,这样鱼就能正常转弯游动了,还能不时拜摆摆尾巴!
*/
// 创建一个圆弧
//void drawArc(cocos2d::DrawNode* drawNode, const cocos2d::Vec2& center, float radius, float startAngle, float endAngle, int segments, float width) {
// // segments 是圆弧分割的线段数,增加segments可以使得弧线更加平滑
// // width 是弧线的宽度
// const float coef = 2.0f * (float)M_PI / segments;
//
// // 计算起始点
// cocos2d::Vec2 point = center + cocos2d::Vec2(radius * cos(startAngle), radius * sin(startAngle));
//
// drawNode->moveTo(point);
// for (int i = 1; i < segments; ++i) {
// float angle = startAngle + i * coef;
// point = center + cocos2d::Vec2(radius * cos(angle), radius * sin(angle));
// drawNode->lineTo(point);
// }
//
// // 画圆弧的结束点
// point = center + cocos2d::Vec2(radius * cos(endAngle), radius * sin(endAngle));
// drawNode->lineTo(point);
//}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2020-11-27 Boost 时间处理
2019-11-27 Android Studio奇淫巧技
2019-11-27 Unity HOME
2019-11-27 Unity Document
2019-11-27 安卓Unity3d游戏的逆向破解
2019-11-27 Unity Log Path