[解決済み] sfmlの派生クラスでテクスチャを一度初期化する
質問
最近、テクスチャを使ったSFMLの演習を試みています。しかし、いくつかの問題に遭遇しました。SFMLのサイトでは、テクスチャを使うにはスプライトを更新するのが一番効率的だと書かれています。そうでないと、メモリを大量に消費してしまいます。ベースクラスが1つあり、そこから派生したクラスが2つあります。どのように私の
texture
この変数があれば、派生クラスはそのスプライトを使用することができますか?テクスチャを初期化するために
Base
というのも、1つのコンストラクタを2回呼び出すのはナンセンスだからです。というのも、私はステートパターンを使っていて、動的に割り当てられるオブジェクトを大量に生成しているからだ。
#include <iostream>
class Base
{
protected:
sf::Texture texture; //How to initialize this?
sf::Sprite sprite;
public:
Base();
};
class Derived1 : public Base
{
public:
Derived1()
{
sprite.setTexture(texture);
}
};
class Derived2 : public Base
{
public:
Derived2()
{
sprite.setTexture(texture);
}
};
解決方法は?
フライウェイトパターン
<ブロッククオートSFMLのサイトによると、テクスチャを最も効率的に使う方法は、スプライトを更新することだそうです。そうでないと、プログラムが大量のメモリを消費する可能性があります。
そうです、この関係で
sf::Sprite
と
sf::Texture
は
フライウェイトパターン
構造的なデザインパターンである。
について
sf::Texture
は、一種の
ヘビー級
オブジェクトのデータは、可能な限り共有し、メモリを節約したい。また
sf::Sprite
は
フライ級
オブジェクトと、複数の
sf::Sprite
オブジェクトは、同じ
sf::Texture
オブジェクトを作成し、そのデータを共有することができます。
は
sf::Sprite
は、参照するテクスチャの特定の用途に特化した情報(例えば、テクスチャの位置、回転、サイズなど)のみを含みます。
外部状態
. また
sf::Texture
オブジェクトはデータ(つまりテクスチャ画像そのもの)を含み、複数の
sf::Sprite
オブジェクトを作成します。
固有状態
が共有する、すべての
sf::Sprite
を参照するオブジェクトは、同じ
sf::Texture
.
SFML ライブラリでは、このパターンが
sf::Text
/
sf::Font
と
sf::Sound
/
sf::SoundBuffer
.
フライ級をあきらめない
上記で公開されたパターンを念頭に置きながら、デザインもそれに倣ってみてはいかがでしょうか。
class Base {
public:
Base(const sf::Texture& texture): sprite(texture) {}
protected:
sf::Sprite sprite;
};
class Derived: public Base {
public:
Derived(const sf::Texture& texture): Base(texture) {}
// ...
};
は
sprite
のデータメンバが初期化されます。
sf::Texture
コンストラクタに参照渡しされ、複数の
Base
と
Derived
オブジェクトは、同じ
sf::Texture
.
例として
sf::Texture myTexture;
myTexture.loadFromFile("myImageFile.png");
Base b1(myTexture), b2(myTexture);
Derived d1(myTexture), d2(myTexture);
b1
,
b2
,
d1
と
d2
はすべて同じ
sf::Texture
インスタンス
myTexture
:
もちろん、これらのオブジェクトはいずれも
myTexture
.
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件