2016-08-27 3 views
0

私はCocos2D(cocos2d-x-3.12)でゲームを開発していますが、私は画像を保存するためにどのデータ構造を使用すべきか疑問に思っています。私はいくつかの状態(各状態が独自の別個のイメージを持つ)を持ち、すべての状態変更時にファイルからイメージをロードしたくないクラスを定義しているので、これが必要です。私のクラスはスプライトから派生しているのでCocos2D Image Storage

(私は、ファイルからの読み込みが性能に影響を与えると思います)、私はそのイメージを変更するスプライトのメンバ関数をチェックして、私は以下のが見つかりました:

  • スプライト:: setTexture()を受け取り、ファイル名や名前やSpriteFrame

のいずれかを受け取るにTexture2D

  • スプライト:: 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

    と使用:画面の中央に画像を置くことになっている以下の例のようにTest Run #2

    sprite->setAnchorPoint(Vec2::ZERO); 
    

    結果は次のようになります

    助けていただけたら幸いです! :) ありがとう...

  • 答えて

    0

    Sprite::setTexture(const std::string &filename)を使用すると、スプライトのテクスチャを変更できます。テクスチャは一度使用するとTextureCacheシングルトンでキャッシュされるためです。より高いパフォーマンスを得るために使用する前にテクスチャをロードしたい場合は、TextureCache::addImage(const std::string &filepath)でテクスチャをロードすることができます。

    +0

    ありがとう!それは私の問題を解決:) – functor

    0

    あなたはこのようSpriteFrameを保存することができます:あなたはまた、TextureCache(SparkJayが言ったように)またはSpriteCacheを使用することができます

    auto frame = Sprite::create("blah.png")->getSpriteFrame();