Cocos2d-X直接使用OpenGL接口
Cocos2d-X是基于基于OpenGL ES的2D游戏引擎,所以Cocos2d-X能够直接使用OpenGL接口
首先建立一个Draw类,用于处理OpenGL接口
在Draw.h中加入以下的代码
#ifndef _Draw_H_
#define _Draw_H_ #include "cocos2d.h"
USING_NS_CC; class Draw : public CCLayer
{
public:
static CCScene* scene(); CREATE_FUNC(Draw); bool init(); void draw();
}; #endif
实例1:使用OpenGL接口画一个点
在Draw.cpp中加入以下的代码
#include "Draw.h" CCScene* Draw::scene()
{
CCScene* s = CCScene::create(); Draw* layer = Draw::create(); s->addChild(layer); return s;
} bool Draw::init()
{
CCLayer::init(); return true;
} void Draw::draw()
{
//得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置坐标
CCPoint center = ccp(winSize.width / 2, winSize.height / 2); //点:默认一个像素大小,白色
//ccPointSize设置点的大小
ccPointSize(25); //ccDrawColor4B设置点的颜色
ccDrawColor4B(255, 0, 0, 255); //设置点的位置
ccDrawPoint(center);
}
运行结果:
实例2:使用OpenGL接口画一条线
在Draw.cpp中加入以下的代码
#include "Draw.h" CCScene* Draw::scene()
{
CCScene* s = CCScene::create(); Draw* layer = Draw::create(); s->addChild(layer); return s;
} bool Draw::init()
{
CCLayer::init(); return true;
} void Draw::draw()
{
//得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置坐标
CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
/*center.x = winSize.width / 2
center.y = winSize.height / 2*/ // 线:默认是一个像素宽度。白色
//ccDrawColor4B设置颜色
ccDrawColor4B(255, 255, 0, 255); //glLineWidth是设置线条宽度的函数
glLineWidth(5); ccDrawLine(center,//起始点的位置
ccpAdd(center, ccp(100, 100))//中点的位置
); /*
ccpAdd(center, ccp(100, 100))
表示:center.x + 100, center.y + 100
*/
}
运行结果:
实例3:使用OpenGL接口画多个点
在Draw.cpp中加入以下的代码
#include "Draw.h" CCScene* Draw::scene()
{
CCScene* s = CCScene::create(); Draw* layer = Draw::create(); s->addChild(layer); return s;
} bool Draw::init()
{
CCLayer::init(); return true;
} void Draw::draw()
{
//得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置坐标
CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
/*center.x = winSize.width / 2
center.y = winSize.height / 2*/ //设置点的颜色
ccDrawColor4B(255, 0, 0, 255); //定义一个数组保存点的位置
CCPoint pts[] = {
CCPoint(100, 100),
CCPoint(100, 200),
CCPoint(200, 200),
CCPoint(200, 100)
}; //画点
ccDrawPoints(pts, 4);
}
运行结果:
实例4:使用OpenGL接口画一个有圆心连线的圆
在Draw.cpp中加入以下的代码
#include "Draw.h" CCScene* Draw::scene()
{
CCScene* s = CCScene::create(); Draw* layer = Draw::create(); s->addChild(layer); return s;
} bool Draw::init()
{
CCLayer::init(); return true;
} void Draw::draw()
{
//得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置坐标
CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
/*center.x = winSize.width / 2
center.y = winSize.height / 2*/ //设置圆圈的颜色
ccDrawColor4B(192, 192, 0, 255); /*画圆圈
參数1:圆心
參数2:半径
參数3:初始化时旋转的弧度(3.14=180度)
參数4:线段数。
參数5:是否要圆心连线
*/
ccDrawCircle(center, 100, 1.57, 200, true);
}
运行结果:
实例5:使用OpenGL接口画一个没有圆心连线的圆
在Draw.cpp中加入以下的代码
#include "Draw.h" CCScene* Draw::scene()
{
CCScene* s = CCScene::create(); Draw* layer = Draw::create(); s->addChild(layer); return s;
} bool Draw::init()
{
CCLayer::init(); return true;
} void Draw::draw()
{
//得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置坐标
CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
/*center.x = winSize.width / 2
center.y = winSize.height / 2*/ //设置圆圈的颜色
ccDrawColor4B(192, 192, 0, 255); /*画圆圈
參数1:圆心
參数2:半径
參数3:初始化时旋转的弧度(3.14=180度)
參数4:线段数,
參数5:是否要圆心连线
*/
ccDrawCircle(center, 100, 1.57, 200, false);
}
运行结果:
实例6:使用OpenGL接口画一个封口的多边形
在Draw.cpp中加入以下的代码
#include "Draw.h" CCScene* Draw::scene()
{
CCScene* s = CCScene::create(); Draw* layer = Draw::create(); s->addChild(layer); return s;
} bool Draw::init()
{
CCLayer::init(); return true;
} void Draw::draw()
{
//得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置坐标
CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
/*center.x = winSize.width / 2
center.y = winSize.height / 2*/ //设置点的颜色
ccDrawColor4B(192, 192, 0, 255); //定义一个数组保存点的位置
CCPoint pts[] = {
CCPoint(100, 100),
CCPoint(100, 200),
CCPoint(200, 200),
CCPoint(200, 100),
CCPoint(150, 50)
}; // 画封口的多边形
ccDrawPoly(pts, 5, true);
}
运行结果:
实例7:使用OpenGL接口画一个不封口的多边形
在Draw.cpp中加入以下的代码
#include "Draw.h" CCScene* Draw::scene()
{
CCScene* s = CCScene::create(); Draw* layer = Draw::create(); s->addChild(layer); return s;
} bool Draw::init()
{
CCLayer::init(); return true;
} void Draw::draw()
{
//得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置坐标
CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
/*center.x = winSize.width / 2
center.y = winSize.height / 2*/ //设置点的颜色
ccDrawColor4B(192, 192, 0, 255); //定义一个数组保存点的位置
CCPoint pts[] = {
CCPoint(100, 100),
CCPoint(100, 200),
CCPoint(200, 200),
CCPoint(200, 100),
CCPoint(150, 50)
}; // 画封口的多边形
ccDrawPoly(pts, 5, false);
}
运行结果:
实例8:使用OpenGL接口画一个实心多边形
在Draw.cpp中加入以下的代码
#include "Draw.h" CCScene* Draw::scene()
{
CCScene* s = CCScene::create(); Draw* layer = Draw::create(); s->addChild(layer); return s;
} bool Draw::init()
{
CCLayer::init(); return true;
} void Draw::draw()
{
//得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置坐标
CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
/*center.x = winSize.width / 2
center.y = winSize.height / 2*/ //设置点的颜色
ccDrawColor4B(192, 192, 0, 255); //定义数组保存点的位置
CCPoint pts2[] = {
CCPoint(300, 100),
CCPoint(400, 200),
CCPoint(400, 300)
}; //画实心多边形
ccDrawSolidPoly(pts2, 3, ccc4f(1, 0, 0, 1));
}
运行结果:
实例9:使用OpenGL接口实现Bezier曲线
在Draw.cpp中加入以下的代码
#include "Draw.h" CCScene* Draw::scene()
{
CCScene* s = CCScene::create(); Draw* layer = Draw::create(); s->addChild(layer); return s;
} bool Draw::init()
{
CCLayer::init(); return true;
} void Draw::draw()
{
//得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置坐标
CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
/*center.x = winSize.width / 2
center.y = winSize.height / 2*/ //设置点的颜色
ccDrawColor4B(192, 192, 0, 255); //定义数组保存点的位置
CCPoint pts2[] = {
CCPoint(300, 100),
CCPoint(400, 200),
CCPoint(400, 300)
}; //Bezier曲线
//二阶Bezier曲线
ccDrawQuadBezier(pts2[0], pts2[1], pts2[2], 10); }
运行结果:
实例10:使用OpenGL接口实现二阶Bezier曲线
在Draw.cpp中加入以下的代码
#include "Draw.h" CCScene* Draw::scene()
{
CCScene* s = CCScene::create(); Draw* layer = Draw::create(); s->addChild(layer); return s;
} bool Draw::init()
{
CCLayer::init(); return true;
} void Draw::draw()
{
//得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置坐标
CCPoint center = ccp(winSize.width / 2, winSize.height / 2);
/*center.x = winSize.width / 2
center.y = winSize.height / 2*/ //定义数组保存点的位置
CCPoint pts[] = {
CCPoint(100, 100),
CCPoint(100, 200),
CCPoint(200, 200),
CCPoint(200, 100)
}; //定义数组保存点的位置
CCPoint pts2[] = {
CCPoint(300, 100),
CCPoint(400, 200),
CCPoint(400, 300)
}; // Bezier曲线
// 二阶Bezier曲线
ccDrawQuadBezier(pts2[0], pts2[1], pts2[2], 10); ccDrawColor4B(90, 90, 255, 255);
ccDrawCubicBezier(pts[0], pts[1], pts2[2], pts[3], 10); }
运行结果:
实例11:使用OpenGL接口实现通过鼠标点击画多边形
首先建立一个ActiveDraw类。用于处理OpenGL接口
在ActiveDraw.h中加入以下的代码
#ifndef __ActiveDraw_H__
#define __ActiveDraw_H__ #include "cocos2d.h"
USING_NS_CC; class ActiveDraw : public CCLayer
{
public:
static CCScene* scene(); CREATE_FUNC(ActiveDraw); bool init(); //设置触摸事件
bool ccTouchBegan(CCTouch*, CCEvent*); //保存触摸点
CCPoint _pts[100]; //记录有效的触摸点
int _ptsCount; void draw();
}; #endif
在ActiveDraw.cpp中加入以下的代码
#include "ActiveDraw.h" CCScene* ActiveDraw::scene()
{
CCScene* s = CCScene::create(); s->addChild(ActiveDraw::create()); return s;
} bool ActiveDraw::init()
{
CCLayer::init(); //处理触摸事件
setTouchEnabled(true);
setTouchMode(kCCTouchesOneByOne); _ptsCount = 0; return true;
} bool ActiveDraw::ccTouchBegan(CCTouch* touch, CCEvent* ev)
{
//得到触摸点的坐标
CCPoint pt = touch->getLocation(); // save //将坐标保存到数组中
_pts[_ptsCount++] = pt; return true;
} void ActiveDraw::draw()
{
//得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置点的位置
CCPoint center = ccp(winSize.width / 2, winSize.height / 2); //画多边形
ccDrawPoly(_pts, _ptsCount, true);
}
运行结果:
实例11:使用OpenGL接口实现通过鼠标点击画多边形2.0
首先建立一个ActiveDraw类,用于处理OpenGL接口
在ActiveDraw.h中加入以下的代码
#ifndef __ActiveDraw_H__
#define __ActiveDraw_H__ #include "cocos2d.h"
USING_NS_CC; class ActiveDraw : public CCLayer
{
public:
static CCScene* scene(); CREATE_FUNC(ActiveDraw); bool init(); //设置触摸事件
bool ccTouchBegan(CCTouch*, CCEvent*); //保存触摸点
CCPoint _pts[100]; //记录有效的触摸点
int _ptsCount; //定义精灵
CCSprite* _sprite; void draw();
}; #endif
在ActiveDraw.cpp中加入以下的代码
#include "ActiveDraw.h" CCScene* ActiveDraw::scene()
{
CCScene* s = CCScene::create(); s->addChild(ActiveDraw::create()); return s;
} bool ActiveDraw::init()
{
CCLayer::init(); //处理触摸事件
setTouchEnabled(true);
setTouchMode(kCCTouchesOneByOne); _ptsCount = 0; //创建精灵
_sprite = CCSprite::create();
addChild(_sprite); return true;
} bool ActiveDraw::ccTouchBegan(CCTouch* touch, CCEvent* ev)
{
//得到触摸点的坐标
CCPoint pt = touch->getLocation();
_pts[_ptsCount++] = pt; //得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置精灵的位置(精灵的位置为随机位置)
_sprite->setPosition(ccp(winSize.width*CCRANDOM_0_1(), winSize.height*CCRANDOM_0_1())); return true;
} void ActiveDraw::draw()
{
//得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置点的位置
CCPoint center = ccp(winSize.width / 2, winSize.height / 2); //画多边形
ccDrawPoly(_pts, _ptsCount, true); if(_sprite)
{
//画圆形
ccDrawCircle(_sprite->getPosition(), 20, 0, 100, true);
}
}
运行结果:
实例12:使用OpenGL接口实现画线段
首先建立一个DrawNode类,用于处理OpenGL接口
在DrawNode.h中加入以下的代码
#ifndef _DrawNode_H_
#define _DrawNode_H_ #include "cocos2d.h"
USING_NS_CC; class DrawNode : public CCLayer
{
public:
static CCScene* scene(); CREATE_FUNC(DrawNode); bool init();
}; #endif
#include "DrawNode.h" CCScene* DrawNode::scene()
{
CCScene* s = CCScene::create(); DrawNode* layer = DrawNode::create(); s->addChild(layer); return s;
} bool DrawNode::init()
{
//初始化父类
CCLayer::init(); //创建DrawNode
CCDrawNode* node = CCDrawNode::create(); //得到窗体的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //设置点的坐标
CCPoint center = ccp(winSize.width / 2, winSize.height / 2); //设置node的位置
node->setPosition(center); //画一条线段
node->drawSegment(ccp(0, 0), ccp(100, 100), 2, ccc4f(1, 0, 0, 1)); //加入node
addChild(node); return true;
}
Cocos2d-X直接使用OpenGL接口的更多相关文章
- Cocos2d坐标系转换
Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系(高中数学里面那种). 笛卡尔坐标系 笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenGL坐标系为笛卡尔右 ...
- Cocos2dx中的opengl使用(一)简单介绍
引擎提供了CCGLProgram类来处理着色器相关操作,对当前绘图程序进行了封装,其中使用频率最高的应该是获取着色器程序的接口:const GLuint getProgram(); 该接口返回了当前着 ...
- openGL 提升渲染性能 之 顶点数组 VBO IBO VAO
使用openGL图形库绘制,都需要通过openGL接口向图像显卡提交顶点数据,显卡根据提交的数据绘制出相应的图形. openGL绘制方式有:直接模式,显示列表,顶点数组,顶点索引. 直接模式:最简单, ...
- 1.openGL 初探
GLEW, GLFW和GLM介绍 现在你有了工程,就让我们开始介绍下工程所用到的开源库和为啥需要这些. The OpenGL Extension Wrangler (GLEW)是用来访问OpenGL ...
- CSharpGL(0)一个易学易用的C#版OpenGL
+BIT祝威+悄悄在此留下版了个权的信说: CSharpGL(0)一个易学易用的C#版OpenGL CSharpGL是我受到SharpGL的启发,在整理了SharpGL,GLM,SharpFont等开 ...
- 【OpenGL】 第一篇 OpenGL概览
---------------------------------------------------------------------------------------------------- ...
- Android OpenGL 编写简单滤镜
Android 上使用Opengl进行滤镜渲染效率较高,比起单纯的使用CPU给用户带来的体验会好很多.滤镜的对象是图片,图片是以Bitmap的形式表示,Opengl不能直接处理Bitmap,在Andr ...
- Android OpenGL 学习笔记 --开始篇
转自: http://www.cnblogs.com/TerryBlog/archive/2010/07/09/1774475.html 1.什么是 OpenGL? OpenGL 是个专业的3D程序接 ...
- OpenGL学习之路(一)
1 引子 虽然是计算机科班出身,但从小对几何方面的东西就不太感冒,空间想象能力也较差,所以从本科到研究生,基本没接触过<计算机图形学>.为什么说基本没学过呢?因为好奇(尤其是惊叹于三维游戏 ...
随机推荐
- C#:设置webBrowser框架与系统相对应的IE内核版本
通常情况下,我们直接调用C#的webBrowser控件,默认的浏览器内核是IE7. 那么如何修改控件调用的默认浏览器版本呢? /// <summary> /// 修改注册表信息来兼容当前 ...
- MyBatis动态条件、一对多、整合spring(二)
输入映射和输出映射 Mapper.xml映射文件定义了操作数据库的sql,每一个sql是一个statement,映射文件是mybatis的核心. parameterType输入类型 1.传递简单类型 ...
- Redis配置文件各项参数说明及性能调优
Redis配置文件参数说明: 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运行时,Redis默 ...
- JDBC: 批量处理提高SQL处理速度
引用:忘了 当需要成批插入或者更新记录时.可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率 JDBC的批量处理语句包括下面两个方法: a ...
- SQLite-编译指示
SQLite – 编译指示 SQLite编译指示命令(PRAGMA)是一个特殊的命令是用于控制各种环境变量和状态标志在SQLite的环境.编译指示值可以读取,也可以根据需求设置. 语法: 查询当前的编 ...
- C#访问Win 32的一些尝试
使用C#调用Win 32 Api大部分情况下基本只涉及到参数类型的转变,但在遇到Win 32 Api返回LPVOID *lpBuff 时会遇到一些解析遍历难题.lpBuff为二维指针,*lpBuff是 ...
- 初识cocos creator的一些问题
本文的cocos creator版本为v1.9.01.color赋值cc.Label组件并没有颜色相关的属性,但是Node有color的属性. //如果4个参数,在ios下有问题let rgb = [ ...
- CryptoJS简单使用(request.js) 拦截器的使用
首先准备一份明文和秘钥: var plaintText = 'aaaaaaaaaaaaaaaa'; // 明文var keyStr = 'bbbbbbbbbbbbbbbb'; // 一般key为一个字 ...
- 2.Eclipse中绑定Tomcat
1.下载并成功安装Eclipse和Tomcat(该步骤有问题请查看我的相关经验): 2.打开Eclipse,单击“window”菜单,选择下方的“Preferences”: 3.找到Server下方的 ...
- 彻底禁用chrome请停用以开发者模式运行的扩展程序弹框
首先上图 怎么解决呢? 进入安装目录-->下图目录(一串数字的目录) 2. 找到chrome.dll 3.下载patch.exe 下载网址 https://itdocs.pipipan.co ...