cocos2d-x 4.0 学习之路(八)创建精灵的几种方法

精灵是cocos2dx里面最最最最常用的类。我们今天就来说说它。

精灵首先是一个2维图片,但我们可以改变其属性(包括旋转、位置、比例、颜色等),还可以给它制作动画。

你可以把精灵理解成游戏里的怪物,主人公,或者所有能动的东西。

创建精灵的几种方法

方法一:直接用create加图片创建。

这个之前我们已经接触过很多次了。

auto sprite = Sprite::create("HelloWorld.png");

不过,create还有更多的功能,比如,我只想显示这个精灵的眼睛(截取一部分图像),那就在create函数里加Rect()参数就可以了:

auto sprite = Sprite::create("HelloWorld.png", Rect(30, 120, 130, 50));

Rect(x, y, width, height)的4个参数:

x, y:是相对于图片的左上角的坐标,指定(0, 0)就是图片的左上角。

width, height:是宽度高度。那么这个单位是多少?我上面的例子用的窗口大小是480, 320,如果你换成1024, 768,再用上面的4个参数试试,是这个结果:画乱了。

为什么?原因是在不同分辨率的情况下,图片的大小也不一样。

我们做个试验:我们不指定Rect,分别在480,320和1024,768分辨率下,打印出图片的大小。

auto sprite = Sprite::create("HelloWorld.png");
auto size = sprite->getContentSize();
log("sprite size: width = %f, height = %f", size.width, size.height);

结果是:

480,320:sprite size: width = 195.000000, height = 270.000000
1024,768:sprite size: width = 91.406242, height = 126.562492

可以得出,分辨率变大,图片在程序中的大小会变小。Rect()四个参数的值都会受到这个的影响。

那么,解决方法的话,要么计算分标率的比例,要么干脆不用Rect(),直接截取图片。

看似创建精灵很简单,里面的逻辑其实挺复杂。

方法二:用纹理(Texture2D)创建

效果和用create时一样的。

函数定义:

Sprite* Sprite::createWithTexture(Texture2D *texture);
Sprite* Sprite::createWithTexture(Texture2D *texture, const Rect& rect, bool rotated);

调用的时候,可以直接定义Texture2D的实例:

    Image* img = new Image();
    img->initWithImageFile("HelloWorld.png");
    Texture2D* texture = new Texture2D();
    texture->initWithImage(img);
    auto sprite = Sprite::createWithTexture(texture);
    // or 
    // auto sprite = Sprite::createWithTexture(texture, Rect(30, 120, 130, 50));

也可以,通过getTextureCache()的addImage方法:

auto sprite = Sprite::createWithTexture(Director::getInstance()->getTextureCache()->addImage("HelloWorld.png"));

那么,create和createWithTexture有什么区别?其实,你看一下源码就会发现,create里面就是用Texture2D实现的。为了用户便于使用和理解,所以create把Texture2D又包了一层。

那它俩什么时候使用?图片过大,不常用的,create直接创建;游戏场景内频繁使用的,纹理创建。

方法三:帧缓存(SpriteFrameCache)

这个适用于,帧动画、图集管理等。游戏中的精灵一般数量会很多,我们一个一个加未免有点二乎,这时候就会用到帧缓存。

由于内容比较多,下一篇博客再讲解。

发布了104 篇原创文章 · 获赞 8 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/sunnyboychina/article/details/105080417