cocos2d-x 源码剖析(17)

这节本来是打算接着上一篇发的,但是那天实在太晚了就拖了下来。没想到昨天在邮箱里面赫然发现了《炉石传说》的封测兑换码,节奏立马就变了。昨天和今天体验了一把,策略性很强,不过如果你玩到一定阶段就是拼人品和卡牌了。我相信之后《炉石传说》之后会加入四人对战模式,双人对战策略略显单薄了些。今天连胜五把,解锁了2个新英雄,来篇文章纪念下。

上一篇其实还没有将CCTexture讲完。cocos2d-x在很多地方,为了使用的方便把一些概念上分开的东西整合到了一起,比如CCTexture是维护Texture用的,但是里面却有两个绘制函数:

/** draws a texture at a given point */
void drawAtPoint(const CCPoint& point);
/** draws a texture inside a rect */
void drawInRect(const CCRect& rect);

这节之所以单独来讲,是因为这是整个2D引擎中最核心的所在——绘制一张图片。如果你是用原生的OpenGL来做到这一步,那是相当的繁琐。但是现在cocos2d-x把那些脏活累活都做完了,显示一张图片就变得很简单了。我们使用CCTexture来讲图片的绘制,是为了以后讲CCSprite做铺垫。知道如何显示图片,是了解如何显示更复杂内容的基础。先来看看代码:

void CCTexture2D::drawAtPoint(const CCPoint& point)
{
  GLfloat    coordinates[] = {    
    0.0f,    m_fMaxT,
    m_fMaxS,m_fMaxT,
    0.0f,    0.0f,
    m_fMaxS,0.0f };
 
  GLfloat    width = (GLfloat)m_uPixelsWide * m_fMaxS,
  height = (GLfloat)m_uPixelsHigh * m_fMaxT;
 
  GLfloat        vertices[] = {    
    point.x,            point.y,
    width + point.x,    point.y,
    point.x,            height  + point.y,
    width + point.x,    height  + point.y };
 
  ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position | kCCVertexAttribFlag_TexCoords );
  m_pShaderProgram->use();
  m_pShaderProgram->setUniformsForBuiltins();
 
  ccGLBindTexture2D( m_uName );
 
#ifdef EMSCRIPTEN
  setGLBufferData(vertices, 8 * sizeof(GLfloat), 0);
  glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, 0);
 
  setGLBufferData(coordinates, 8 * sizeof(GLfloat), 1);
  glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, 0);
#else
  glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices);
  glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, coordinates);
#endif // EMSCRIPTEN
 
  glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}

  • 第一步初始化了一个纹理坐标。
  • 第二步初始化了一个定点坐标。
  • 第三步开启顶点坐标和纹理坐标。
  • 第四步指定shader程序
  • 第五步绑定当前纹理,这步就是纹理的核心了,也就是那个m_uNane。
  • 第六步传输顶点坐标和纹理坐标。
  • 第七步绘制图形。
简单的绘制一个图片就是这个流程,如果没有cocos2d-x的帮助,想要自己写一套还真要费不少事情。当然这个API要到OpenGL的上下文中才能执行。而cocos2d-x的OpenGL上下文只有在Node的draw中才有,所以我们写一个简单的demo来看看效果,为了省事我直接拿HelloCpp来改了,相关的函数如下:

bool HelloWorld::init()
{
  earth_ = new CCTexture2D();
  auto image = new CCImage();
  image->initWithImageFile("earth.jpg");
  earth_->initWithImage(image);
  CC_SAFE_DELETE(image);
  return true;
}
 
void HelloWorld::draw() {
  CCLayer::draw();
  earth_->drawAtPoint(CCPointZero);
}

同样没做错误处理,希望大家不要介意,下面是显示效果:

QQ20131114-1@2x


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的体育馆管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此体育馆管理系统利用当下成熟完善的SpringBoot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理收货地址管理、购物车管理、场地管理、场地订单管理、字典管理、赛事管理、赛事收藏管理、赛事评价管理、赛事订单管理、商品管理、商品收藏管理、商品评价管理、商品订单管理、用户管理、管理员管理等功能。体育馆管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:体育馆管理系统;SpringBoot框架;Mysql;自动化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值