教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教育文库 >

深入分析Cocos2d-x 2.0中的“纹理”(4)

来源:网络收集 时间:2026-10-03
导读: for(unsigned int i = 0; i length; ++i, ++inPixel32) { *outPixel8++ = (*inPixel32 24) 0xFF; // A if (hasAlpha pixelFormat == kCCTexture2DPixelFormat_RGB888) { // 转换 RGBA8888 到 RGB888,同理,不再赘述

for(unsigned int i = 0; i < length; ++i, ++inPixel32) { *outPixel8++ = (*inPixel32 >> 24) & 0xFF; // A

if (hasAlpha && pixelFormat == kCCTexture2DPixelFormat_RGB888) { // 转换 RGBA8888 到 RGB888,同理,不再赘述 // Convert "RRRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA" to "RRRRRRRRGGGGGGGGBBBBBBBB" inPixel32 = (unsigned int*)image->getData(); tempData = new unsigned char[width * height * 3]; unsigned char *outPixel8 = tempData;

for(unsigned int i = 0; i < length; ++i, ++inPixel32)

396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. } } } }

{ *outPixel8++ = (*inPixel32 >> 0) & 0xFF; // R *outPixel8++ = (*inPixel32 >> 8) & 0xFF; // G *outPixel8++ = (*inPixel32 >> 16) & 0xFF; // B }

//因为最终相应像素格式的数据都存放在 tempData 中,所以这里通过像素数据来生成 OpenGL 贴图。 initWithData(tempData, pixelFormat, width, height, imageSize); //如果是以上相应格式,则 tempData 都是新申请的内存块,则在这里释放申请的内存。 if (tempData != image->getData()) { delete [] tempData;

//取得是否有 ALPHA 渐变通道数据 m_bHasPremultipliedAlpha = image->isPremultipliedAlpha(); return true;

// 从字符串中创建 OpenGL 贴图。 //参 1:字符串 //参 2:字体名称 //参 3:字体大小 bool CCTexture2D::initWithString(const char *text, const char *fontName, float fontSize) { return initWithString(text, CCSizeMake(0,0), kCCTextAlignmentCenter, kCCVerticalTextAlignmentTop, fontName, fontSize);

// 从字符串中创建 OpenGL 贴图,可指定更多参数。 //参 1:字符串 //参 2:返回参数,代表在屏幕上占用的区域大小 //参 3:文字的横向对齐方式 //参 4:文字的纵向对齐方式 //参 5:字体名称 //参 6:字体大小 bool CCTexture2D::initWithString(const char *text, const CCSize& dimensions, CCTextAlignment hAlignment, CCVerticalTextAlignm ent vAlignment, const char *fontName, float fontSize)

430. 431. 432. 433. 434. 435. 436. 437. 438. 439.

{ //如果定义使用可变纹理 #if CC_ENABLE_CACHE_TEXTURE_DATA // cache the texture data VolatileTexture::addStringTexture(this, text, dimensions, hAlignment, vAlignment, fontName, fontSize); #endif //定义一个 CCImage 实例对象 CCImage image; //定义一个 CCImage 进行由字符串创建图片时指定的文字对齐方式的变量 eAlign CCImage::ETextAlign eAlign;

440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455. 456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. }

//如果文字纵向对齐

方式为顶部对齐。 if (kCCVerticalTextAlignmentTop == vAlignment) { //根据文字横向对齐方式的不同分别对 eAlign 进行设置。 eAlign = (kCCTextAlignmentCenter == hAlignment) ? CCImage::kAlignTop : (kCCTextAlignmentLeft == hAlignment) ? CCImage::kAlignTopLeft : CCImage::kAlignTopRight; } //如果文字纵向对齐方式为居中对齐。 else if (kCCVerticalTextAlignmentCenter == vAlignment) { //根据文字横向对齐方式的不同分别对 eAlign 进行设置。 eAlign = (kCCTextAlignmentCenter == hAlignment) ? CCImage::kAlignCenter : (kCCTextAlignmentLeft == hAlignment) ? CCImage::kAlignLeft : CCImage::kAlignRight; } //如果文字纵向对齐方式为底部对齐。 else if (kCCVerticalTextAlignmentBottom == vAlignment) { //根据文字横向对齐方式的不同分别对 eAlign 进行设置。 eAlign = (kCCTextAlignmentCenter == hAlignment) ? CCImage::kAlignBottom : (kCCTextAlignmentLeft == hAlignment) ? CCImage::kAlignBottomLeft : CCImage::kAlignBottomRight; } else { //其它对齐方式不应存在,故打印错误。 CCAssert(false, "Not supported alignment format!"); } //调用 CCImage 的成员函数由字符串创建出图片数据。 if (!image.initWithString(text, (int)dimensions.width, (int)dimensions.height, eAlign, fontName, (int)fontSize)) { return false; } //再由 CCImage 实例对象来创建出 OpenGL 贴图,初始化纹理。 return initWithImage(&image);

// 在指定的位置绘制贴图。 void CCTexture2D::drawAtPoint(const CCPoint& point) { //定义贴图中图像区域的 UV 坐标。从左上至右下。 GLfloat 0.0f, coordinates[] = { m_fMaxT,

m_fMaxS,m_fMaxT, 0.0f, 0.0f,

m_fMaxS,0.0f }; //取得贴图中图像区域的宽高

485. 486. 487. 488. 489. 490. 491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. 521. 522. 523. 524. 525. 526. 527. 528. 529. }

GLfloat

width = (GLfloat)m_uPixelsWide * m_fMaxS,

height = (GLfloat)m_uPixelsHigh * m_fMaxT; //定义对应的顶点坐标 GLfloat point.x, width + point.x, point.x, width + point.x, vertices[] = { point.y, point.y, height height + point.y, + point.y };

//Shader 中使用位置和纹理坐标通道。 ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position | kCCVertexAttribFlag_TexCoords ); //后面的代码便用 Shader 进行渲染 m_pShaderProgram->use(); //设置 Shader 使用的最终结果矩阵 m_pShaderProgram->setUniformForModelViewProjectionMatrix(); //将贴图绑定 ccGLBindTexture2D( m_uName );

//将 vertices 设置为顶点位置参数 glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices); //将 coordinates 设置为顶点的纹理坐标参数 glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, coordinates); //绘制三角形,参 1 为绘图方式,参 2 为顶点起始索引,参 3 为三角形面数。 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

//绘制纹理上的一个

区域。 void CCTexture2D::drawInRect(const CCRect& rect) { //定义贴图中图像区域的 UV 坐标。从左上至右下。 GLfloat 0.0f, coordinates[] = { m_fMaxT,

m_fMaxS,m_fMaxT, 0.0f, 0.0f,

m_fMaxS,0.0f }; //绘制到的区域 GLfloat vertices[] = { rect.origin.x, rect.origin.y, rect.origin.y, rect.origin.y + rect.size.height, rect.origin.y + rect.size.height, /*0.0f,*/ /*0.0f,*/ /*0.0f,*/ /*0.0f*/ };

rect.origin.x + rect.size.width, rect.origin.x, rect.origin.x + rect.size.width, //Shader 中使用位置和纹理坐标通道。

ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position …… 此处隐藏:3480字,全部文档内容请下载后查看。喜欢就下载吧 ……

深入分析Cocos2d-x 2.0中的“纹理”(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/111599.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150份
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150份
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)