Cocos2D 图片存储
Cocos2D Image Storage
我正在 Cocos2D (cocos2d-x-3.12) 开发一款游戏,我想知道应该使用哪种数据结构来存储图像;我需要这个,因为我正在定义一个 class ,它有几个状态(每个状态都有自己单独的图像)并且不想在每次状态更改时从文件加载图像。 (我想从文件中读取会影响性能)
由于我的class是从Sprite派生的,所以我查看了Sprite的成员函数来改变它的图像,发现如下:
- Sprite::setTexture() 接收文件名或 Texture2D
- 接收名称或 SpriteFrame 的 Sprite::setSpriteFrame()
我已经像这样尝试过 Texture2D:
auto img = new Image();
img->initWithImageFile("blah.png");
auto txtr = new Texture2D();
txtr->initWithImage(img);
sprite->setTexture(txtr);
但是没用。所以我只剩下 SpriteFrame 选项:
auto img = new Image();
img->initWithImageFile("blah.png");
auto frame = SpriteFrame::create("blah.png", Rect (0, 0, img->getWidth(), img->getHeight()));
sprite->setSpriteFrame(frame);
这确实有效,但我无法找出 Rect 部分的工作原理。也会影响定位。就像下面的例子,它应该把图像放在屏幕的中央:
auto img = new Image;
string fileAddr = "HelloWorld.png";
img->initWithImageFile(fileAddr);
auto sprite = Sprite::create();
auto frame = SpriteFrame::create(fileAddr, Rect (0, 0, img->getWidth(), img->getHeight()));
sprite->setSpriteFrame(frame);
// position the sprite on the center of the screen
sprite->setAnchorPoint(Vec2 (0.5, 0.5));
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
但结果为:Test Run #1
并使用:
sprite->setAnchorPoint(Vec2::ZERO);
结果如下:Test Run #2
如有任何帮助,我们将不胜感激! :)
谢谢...
您可以只使用 Sprite::setTexture(const std::string &filename)
来更改精灵的纹理。因为一个纹理一旦你使用它就会被 TextureCache
单例缓存。如果你想在使用它之前加载纹理以获得更高的性能,你可以通过 TextureCache::addImage(const std::string &filepath)
.
加载纹理
你可以这样存储SpriteFrame:
auto frame = Sprite::create("blah.png")->getSpriteFrame();
您还可以使用 TextureCache(如 SparkJay 所说)或 SpriteCache。
我正在 Cocos2D (cocos2d-x-3.12) 开发一款游戏,我想知道应该使用哪种数据结构来存储图像;我需要这个,因为我正在定义一个 class ,它有几个状态(每个状态都有自己单独的图像)并且不想在每次状态更改时从文件加载图像。 (我想从文件中读取会影响性能)
由于我的class是从Sprite派生的,所以我查看了Sprite的成员函数来改变它的图像,发现如下:
- Sprite::setTexture() 接收文件名或 Texture2D
- 接收名称或 SpriteFrame 的 Sprite::setSpriteFrame()
我已经像这样尝试过 Texture2D:
auto img = new Image();
img->initWithImageFile("blah.png");
auto txtr = new Texture2D();
txtr->initWithImage(img);
sprite->setTexture(txtr);
但是没用。所以我只剩下 SpriteFrame 选项:
auto img = new Image();
img->initWithImageFile("blah.png");
auto frame = SpriteFrame::create("blah.png", Rect (0, 0, img->getWidth(), img->getHeight()));
sprite->setSpriteFrame(frame);
这确实有效,但我无法找出 Rect 部分的工作原理。也会影响定位。就像下面的例子,它应该把图像放在屏幕的中央:
auto img = new Image;
string fileAddr = "HelloWorld.png";
img->initWithImageFile(fileAddr);
auto sprite = Sprite::create();
auto frame = SpriteFrame::create(fileAddr, Rect (0, 0, img->getWidth(), img->getHeight()));
sprite->setSpriteFrame(frame);
// position the sprite on the center of the screen
sprite->setAnchorPoint(Vec2 (0.5, 0.5));
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
但结果为:Test Run #1
并使用:
sprite->setAnchorPoint(Vec2::ZERO);
结果如下:Test Run #2
如有任何帮助,我们将不胜感激! :) 谢谢...
您可以只使用 Sprite::setTexture(const std::string &filename)
来更改精灵的纹理。因为一个纹理一旦你使用它就会被 TextureCache
单例缓存。如果你想在使用它之前加载纹理以获得更高的性能,你可以通过 TextureCache::addImage(const std::string &filepath)
.
你可以这样存储SpriteFrame:
auto frame = Sprite::create("blah.png")->getSpriteFrame();
您还可以使用 TextureCache(如 SparkJay 所说)或 SpriteCache。