Cocos2dx学习笔记(5)——纹理

哟嚯,新的知识又来了,小伙伴们快坐下!

本文仅供个人记录和复习,不用于其他用途

开头补充

在开始之前,首先要说一下关于窗口设置的问题。

1
2
glview = GLViewImpl::createWithRect("Practice", Rect(0, 0, 480, 320));
director->getOpenGLView()->setDesignResolutionSize(960, 640, ResolutionPolicy::SHOW_ALL);

第一个方法设定窗口的大小,第二个窗口设置显示内容的大小。如果我们加入一张图片,它无法填满960*640,也就意味着有一大块区域是黑色的。那么我们是否能够改变窗口的大小,让图片刚好占据整个窗口呢?但是要注意,上下两个数值都要更改。假如只改窗口大小,那么会出现下图这样的状况:

示例

注意,这个窗口是480*320的,但是由于显示的内容大小还是原来的,所以图片会依据比例缩小,看起来和没改变窗口是一个效果。第二个主要是用于当窗口尺寸不一样时,可以根据比例来缩放窗口。因此改变窗口大小时,一定要记得改掉显示内容的大小。

总而言之,第一个调整窗口大小,第二个调整分辨率。

了解纹理

首先,我们先来看看精灵的创建方法:

1
2
CCSprite *bg = CCSprite::create("sprite/background.jpg");
CCSprite *bg = CCSprite::create("sprite/background.jpg", CCRectMake(0, 0, 400, 320));

第一种方法我们不陌生,至于第二种方法呢,便是规定图片的显示内容。Rect是矩形的意思,使用了UI坐标系,原点从左上角开始,显示长为400宽为320的内容,如下图所示:

示例

那么回归正题,什么是纹理?纹理是OpenGL的词汇,我们去查看底层代码就会发现,Sprite::create()其实就是创建了一个纹理。简单来说,纹理就是图片。

1
2
3
4
5
6
CCImage *image = new CCImage();
image->initWithImageFile("sprite/plant.png");
CCTexture2D *texture = new CCTexture2D();
texture->autorelease();
texture->initWithImage(image);

CCTexture2D没有create()方法,事实上,很多OpenGL的概念都没有create()方法。因此呢,我们需要自己创建对象,并送入自动回收池。至于纹理的初始化则需要图片,这里用到的CCImage同样没有create()方法。

回顾学习笔记(2),sprite除了可以直接用文件初始化以外,还可以用纹理初始化。

1
2
3
4
static CCSprite *create(CCTexture2D *pTexture);
static CCSprite *create(CCTexture2D *pTexture, const CCRect &rect);
bool initWithFile(CCTexture2D *pTexture);
bool initWithFile(CCTexture2D *pTexture, const CCRect &rect);

从本质上来说,Spritecreate()方法本质上是创建了一个纹理。

纹理缓存

在游戏进行过程中,我们不能够加一张图片就渲染一张,那样重复的动作会占据很多资源。事实上,内存区开辟了一块缓存区域,我们可以把常用的图片加载入缓存,需要用的时候可以直接取用。

1
2
3
4
CCTexture2D *texture2 = CCTextureCache::sharedTextureCache()->addImage("sprite/bullet.png");
CCSprite *bullet = CCSprite::createWithTexture(texture2);
bullet->setPosition(ccp(200, winsize.height / 2 + 20));
addChild(bullet);

sharedTextureCache()是一个单例,用于将图片加入缓存。addImage()直接返回一个CCTexture2D的指针,因此直接创建指针接收。接下用纹理创建精灵,并加入到层中。

示例

从缓存拿去图片好比是从书架拿书,方便快捷。而如果我们直接加载图片,那么就好比是到图书馆拿书,繁琐耗时。但是呢,由于书架比较小,所以我们不可能把所有的书全部放入,这也就意味着,程序员需要根据图片用到的时间和频率,合理的利用缓存,而不是一股脑地全部塞进去。