我们这节来学习几何图形,即怎样使用Cocos2d-x绘制各种图形。已经贝塞尔曲线

我们查看CCNode中有个draw函数,我们须要将绘制的代码所有写在这个函数里面。写在init函数里是画不出线来的,

draw是有Cocos2d-x内部调用的。详细什么机制我也不知道。初期我们学习的是怎么使用。等以后做出来游戏赚钱了,闲的蛋疼的时候再回过头来钻研吧。学习不论什么东西追求的是高速的做出有用的东西 。

OK   我们在头文件里重写draw

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" class HelloWorld : public cocos2d::CCLayer
{
public:
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init(); // there's no 'id' in cpp, so we recommend returning the class instance pointer
static cocos2d::CCScene* scene(); // implement the "static node()" method manually
CREATE_FUNC(HelloWorld); virtual void draw();
}; #endif // __HELLOWORLD_SCENE_H__

源文件

#include "HelloWorldScene.h"

USING_NS_CC;

CCScene* HelloWorld::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::create(); // 'layer' is an autorelease object
HelloWorld *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 ( !CCLayer::init() )
{
return false;
}
return true;
}
void HelloWorld::draw(){ }

我们这次基本的代码都会先在draw函数中

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVjYmxvZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

这里有各种绘制函数,我们一个个来看

ok  
我们来绘制一个线条

void HelloWorld::draw(){
CCSize visibleSize= CCDirector::sharedDirector()->getVisibleSize();
ccDrawLine(ccp(0,0),ccp(visibleSize.width,visibleSize.height));
}

我们用到了CCDrawLine函数

看凝视draws a line given the origin and destination point measured in points

百度翻译和我说:画线的起点和终点測量点

OK   第一个为起点,第二个为终点。两个点连成一条线

我们从左上角到右下角绘制一条红色的粗线

void HelloWorld::draw(){
CCSize visibleSize= CCDirector::sharedDirector()->getVisibleSize();
ccDrawLine(ccp(0,0),ccp(visibleSize.width,visibleSize.height)); //设置画刷颜色
ccDrawColor4F(255,0,0,255);
//设置线条的宽度
glLineWidth(10);
ccDrawLine(ccp(0,visibleSize.height),ccp(visibleSize.width,0)); }



有问题啊!

怎么我第一次画的线也变为红色了呢?

用过.net或C++或Java事实上都清楚,这个画刷是全局唯一的,当你设置了画刷的属性之后,假设不还原回去,下次另外一个地方使用的话还是先前的画刷属性。

可是,我们设置画刷的属性是在绘制完第一条线之后才设置的,为什么还是这样呢??

这就是Cocos2d-x的机制了,你能够在该函数下CCLog一下,发现程序会不停的调用这个函数,

我在想。这效率不是太低了吗?假设换在手机上,不敢想象啊!

(还是那句话,先学怎么用。赚钱才是硬道理,生活苦逼,么办法啊)



总之。用完画笔之后我们,在方法最后就得还原它

void HelloWorld::draw(){
CCSize visibleSize= CCDirector::sharedDirector()->getVisibleSize();
ccDrawLine(ccp(0,0),ccp(visibleSize.width,visibleSize.height)); //设置画刷颜色
ccDrawColor4F(255,0,0,255);
//设置线条的宽度
glLineWidth(10);
ccDrawLine(ccp(0,visibleSize.height),ccp(visibleSize.width,0)); //还原画笔
glLineWidth(1);
ccDrawColor4B(255,255,255,255);
ccPointSize(1); }

这就正常了。

这里我们接触了一个新的函数,glLineWidth

我们发现,大部分都是CC开头,表示Cocos2d-x   这里的gl

OpenGL的意思,事实上Cocos2d-x底层还是调用的OpenGL来绘制的

绘制一个比較大的点

//绘制一个比較大的点,蓝色的,半透明
ccPointSize(50);
ccDrawColor4B(0,0,255,128);
ccDrawPoint(ccp(visibleSize.width/2,visibleSize.height/2));

ok   这里注意了   ccDrawColor4F 设置半透明没效果

用4B才干够,至于为什么,反正我不关心

总之我们认为4B好用一点。那我们就都用4B吧



//一次绘制多个点
CCPoint points[]={ccp(60,60),ccp(60,70),ccp(70,70),ccp(70,60)};
ccPointSize(2);
ccDrawColor4B(0,255,255,255);
ccDrawPoints(points,sizeof(points)/sizeof(points[0]));

//绘制圆形
glLineWidth(16);
ccDrawColor4B(0, 255, 0, 255);
ccDrawCircle(ccp(visibleSize.width/2,visibleSize.height/2),100,0,1000,false);

绘制圆须要说一下

第一个參数:  圆的中心点

第二个參数:  圆半径

第三个參数: 圆的逆时针旋转角度  (搞不懂就是0)

第四个參数:圆的平均分段   (越大越平滑。但始终有锯齿,这个非常纠结)

//绘制多边形
ccDrawColor4B(255, 255, 0, 255);
glLineWidth(10);
CCPoint vertices[] = {ccp(50,50), ccp(100,50), ccp(100,100), ccp(50,100) };
//须要绘制多边形的点,參数2。点的个数 參数3 是否须要起点和终点闭合
ccDrawPoly(vertices,sizeof(vertices)/sizeof(vertices[0]),true); //绘制实心的多边形
glLineWidth(1);
CCPoint filledVertices[] = { ccp(0,120), ccp(50,120), ccp(50,170), ccp(25,200), ccp(0,170) };
//须要绘制多边形的点,參数2。点的个数 參数3 填充的颜色
ccDrawSolidPoly(filledVertices,sizeof(filledVertices)/sizeof(filledVertices[0]),ccc4f(0, 255, 0, 255));

	//绘制矩形
//參数1 起点 參数2 终点 參数3 填充的颜色
//打开绘图工具画个矩形 事实上起点就是左上角 终点就是右下角
ccDrawSolidRect(ccp(visibleSize.width-70,visibleSize.height-20),ccp(visibleSize.width-20,visibleSize.height-70),ccc4f(0, 255, 0, 255));

源代码连接http://download.csdn.net/detail/q269399361/7391247

Cocos2D-X2.2.3学习笔记10(几何图形)的更多相关文章

  1. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  2. 《C++ Primer Plus》学习笔记10

    <C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...

  3. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  4. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  5. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

  6. Hadoop学习笔记(10) ——搭建源码学习环境

    Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...

  7. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  8. SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传

    SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...

  9. mybatis学习笔记(10)-一对一查询

    mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...

随机推荐

  1. UVALive - 3211 (2-SAT + 二分)

    layout: post title: 训练指南 UVALive - 3211 (2-SAT + 二分) author: "luowentaoaa" catalog: true m ...

  2. NOI 1.5编程基础之循环控制 44:第n小的质数

    描述 输入一个正整数n,求第n小的质数. 输入 一个不超过10000的正整数n. 输出 第n小的质数. 样例输入 10 样例输出 29

  3. Hibernate 配置文件precision与scale

    Oracle使用标准.可变长度的内部格式来存储数字.这个内部格式精度可以高达38位. NUMBER数据类型可以有两个限定符,如: column NUMBER ( precision, scale) 表 ...

  4. 【块状树】【LCA】bzoj1787 [Ahoi2008]Meet 紧急集合

    分块LCA什么的,意外地快呢…… 就是对询问的3个点两两求LCA,若其中两组LCA相等,则答案为第三者. 然后用深度减一减什么的就求出距离了. #include<cstdio> #incl ...

  5. 【矩阵乘法+快速乘】BZOJ2875-[NOI2012]随机数生成器

    [题目大意] 已知Xn+1=(aXn+c) mod m,求Xn mod g. [思路] get到了longlong乘法的正确方法,快速乘.什么是快速乘呢? 简单来讲,快速幂就是模拟了二进制的竖式乘法. ...

  6. [USACO2015DEC]Max Flow

    题目大意: 给你一棵n个点的树,有m次操作,每次将给定的路径上所有点的点权+1. 问最后最大的点权是多少. 思路: #include<cstdio> #include<cctype& ...

  7. Scala实战高手****第16课:Scala implicits编程彻底实战及Spark源码鉴赏

    隐式转换:当某个类没有具体的方法时,可以在该类的伴生对象或上下文中查找是否存在隐式转换,将其转换为可以调用该方法的类,通过代码简单的描述下 一:隐式转换 1.定义类Man class Man(val ...

  8. Android中的动态字符串的处理

    1.效果显示 2. MainAcitivity.java package com.example.app2; import android.support.v7.app.AppCompatActivi ...

  9. ubuntu使用ssh远程登录服务器及上传本地文件到服务器

    1. ubuntu 远程登录   首先你的ubuntu要能够支持ssh,如果不能,自行百度! 打开终端,输入 ssh  root@115.159.200.13(你的服务器的IP地址) 回车就会让你输入 ...

  10. 修复XCode7 Beta版无法使用iOS8.4真机调试的Bug

        在XCode7 Beta2下如果使用iOS8.4版的真机进行调试,XCode会提示:   "Could not find Developer Disk Image"   解 ...