フライウェイトパターン:すべてのオブジェクトパラメータが更新と同じようになりました -- c# フィールド と design-patterns フィールド と xna フィールド 関連 問題

FlyWeight Pattern: every object parameters became same as updated












0
vote

問題

日本語

こんにちは君はフライ級パターンに問題を抱えている;

私は私のスプライトクラスにフライ級パターンを実装しようとします。各スプライトオブジェクトのみの違反のみは位置とフレームです。

im私のコードに問題がある場合は、1スプライトの↑設定(位置またはフレーム)を設定します。↓すべてのオブジェクト属性も変更されていません。 。

これはコードです:

<事前> <コード> public enum Type { sprite, None, }; public class FactorySprite { private LinkList SpriteList = new LinkList(); private Hashtable Sprites = new Hashtable(); public FactorySprite() { // SpriteList.AddtoBegining(new Sprite()); Sprites.Add(Type.sprite, new Sprite()); } public GameSprite getSprite(Type type) { // return (Sprite)SpriteList.Search(O); GameSprite gamesprite = null; if(Sprites.ContainsKey(type)) { gamesprite =( GameSprite)Sprites[type]; } return gamesprite; } } public abstract class GameSprite { protected Texture2D texture; // protected Vector2 position; protected Texture loadTexture; // protected int frame; protected Vector2 Speed; protected Rectangle SourceRectangle; protected Color color; public Type type; protected SpriteBatch spriteBatch; public abstract void Draw(); public abstract void Update(); public abstract void setframe(int frame_number); public abstract void setPosition(int x,int y); } public class Sprite : GameSprite { private int frame; private Vector2 position; public Sprite() { frame =0; type = Type.sprite; spriteBatch = Game1.GameInstance.spriteBatch; texture = Texture.Instance().GetTexture(); Speed = new Vector2(0, 1); color = Color.White; } public override void Draw() { spriteBatch.Draw(texture,position,Image.Instance().drawframe(this.frame), color); } public override void setframe(int frame_number) {this.frame = frame_number; } public override void setPosition(int x, int y) {this.position = new Vector2(x, y); } public Type getType() { return type; } public override void Update(){} }

これはマニンです。←作成

を作成する工場のFlayweightと各オブジェクトを作成するマニンです。 <事前> <コード> SpriteManager sm = SpriteManager.Instance(); FactorySprite factory = new FactorySprite(); Sprite s1 = (Sprite)factory.getSprite(Type.sprite); s1.setframe(6); s1.setPosition(200, 300); sm.AddSprite(s1); Sprite s2 = (Sprite)factory.getSprite(Type.sprite); s2.setframe(5); s2.setPosition(100, 100); sm.AddSprite(s2);

問題ここでの問題をより明確にするS1とS2は同じフレームと位置(奇妙なものが最後に更新される他のすべてのオブジェクトは同じになる)

英語

Hello everyone ı have a problem with flyweight patter ;

I try to implement flyweight patter to my sprite class. There are tons of smilarty as attributes each Sprite object only diffirences are Position and frame;

Im my code ı have a problem, whenever ı set(Position or frame) of one sprite , every other objects attribute also change, ı dont want that ı want most of attributes are same but frame and position is diffrent for each object.

Here is the code:

public enum Type     {         sprite,         None,      };     public class FactorySprite      {         private LinkList SpriteList = new LinkList();         private Hashtable  Sprites = new Hashtable();         public FactorySprite()          {            // SpriteList.AddtoBegining(new Sprite());             Sprites.Add(Type.sprite, new Sprite());         }         public GameSprite getSprite(Type type)          {             //  return (Sprite)SpriteList.Search(O);             GameSprite gamesprite = null;             if(Sprites.ContainsKey(type))             {                 gamesprite =( GameSprite)Sprites[type];              }           return gamesprite;         }      }       public abstract class GameSprite      {         protected Texture2D texture;        // protected Vector2 position;         protected Texture loadTexture;        // protected int frame;         protected Vector2 Speed;         protected Rectangle SourceRectangle;         protected Color color;         public Type type;         protected SpriteBatch spriteBatch;          public abstract void Draw();         public  abstract void Update();         public abstract void setframe(int frame_number);         public abstract void setPosition(int x,int y);      }      public  class Sprite : GameSprite     {        private  int frame;        private Vector2 position;         public Sprite()         {             frame =0;             type = Type.sprite;             spriteBatch = Game1.GameInstance.spriteBatch;             texture = Texture.Instance().GetTexture();              Speed = new Vector2(0, 1);             color = Color.White;          }          public override void Draw()         {              spriteBatch.Draw(texture,position,Image.Instance().drawframe(this.frame), color);          }         public override void setframe(int frame_number) {this.frame = frame_number; }         public override void setPosition(int x, int y)  {this.position = new Vector2(x, y); }         public  Type getType()          {              return type;         }          public override void Update(){}     } 

Here is manin that ı create factory flayweight and each object that ı create

SpriteManager sm = SpriteManager.Instance();  FactorySprite factory = new FactorySprite(); Sprite s1 = (Sprite)factory.getSprite(Type.sprite); s1.setframe(6); s1.setPosition(200, 300); sm.AddSprite(s1); Sprite s2 = (Sprite)factory.getSprite(Type.sprite); s2.setframe(5); s2.setPosition(100, 100); sm.AddSprite(s2); 

Problem here to be more clear s1 and s2 has same frame and position(whic one is last updated all other object become same)

</div
        

回答リスト

4
 
vote

フライ級パターンについてのこのことは、あなたが1人に尋ねるたびに同じインスタンスを得ることです。したがって、あなたがgetSpriteを呼び出すたびにあなたはコピーではなく同じものではなく同じものを返します。

だからあなたがそれを2回呼び出すと、同じオブジェクトへの2つの参照があります。 2つが同じことであるため、一箇所で変更した場合は、もう一方の場所で変わります。それは実際にはフライ級パターンの点です。

あなたがあなたがするようにさまざまなオブジェクトを必要とするこのパターンを使用しないことをお勧めします。

Trhisの一方の方法は、新しいクラスに変わらないスプライトのすべてのビットを抽出することです。これは、フライウェイトパターンをオンにすることができます。変更可能なビットはスプライトクラスに留まり、あなたの新しい「iMatablesPlite」インスタンスへの参照を追加しました。

 

This thing about the FlyWeight pattern is that every time you ask for one, you get the same instance. Thus every time you call GetSprite you are returning the same one, not a copy but the same one.

So if you call it twice, you now have two references to the same object. If you change it in one place it will change in the other because the two ARE THE SAME THING! That's actually the point of the FlyWeight pattern.

I would suggest that you don't use this pattern where you need different objects as you do.

One way around trhis is to extract all this bits of a Sprite which do not ever change into a new class, which you can then use the FlyWeight pattern on. The changeable bits would stay in the Sprite class, with the addition of a reference to your new 'ImutableSprite' instance.

</div
 
 
2
 
vote

フライ級パターンはここには適用されません。

Flyweightは、この特定の値が必要なすべての場合に特定のすべてのケースで同じオブジェクトを使用することを意味します。明らかに、あなたがある場所で価値を変更した場合、変更はどこでも表示されます。

スプライト数を減らしたい場合は、不変セマンティクスを使用できます。異なるセットを持つスプライトを使用しているときに、特定の位置セット、フレームの一連のスプライトインスタンスを使用します。

 

The Flyweight pattern doesn't apply here.

Flyweight means that you use the same object with a specific in all cases where you want this specific value. Obviously, if you change the value in one place, the change will appear everywhere.

If you want to reduce the number of sprites, you could use immutable semantics: Use a single Sprite instance for a specific set of Position,Frame and create a copy when you want a Sprite with a different set.

</div
 
 

関連する質問

6  変換のシーケンス:射影テクスチャリング(HLSL)  ( Sequence of transformations projective texturing hlsl ) 
NVIDIAの射影テクスチャリング(9.3.2)の記事、私はこのグラフに出会いました: ( nvidia.com ) 変換が書かれている順序は私に混乱します。これは、私が左から右への行列乗算を読み取ることを学んだからであり、また変換のシーケンスがこ...

35  Spriteに続くXNA 2Dカメラエンジン  ( Xna 2d camera engine that follows sprite ) 
XNAゲームで視差効果を作成する最善の方法は何ですか?私はそれが世界中に動くにつれて私のスプライトに追従するようにカメラが好きです、そのように私はズーム、パン、揺れ、その他の効果のような効果を築くことができます。誰もが、これがどのように行われているか、好まし...

1  四四石戸、モデルを回転させ、方向と整列させる  ( Quaternions rotate a model and align with a direction ) 
3Dモデルの回転を説明する四元数があるとします。 私がやりたいことは、(回転業者、側面ベクトル...)オブジェクトを考えると、それを目標点に合わせたいです。 宇宙船の場合、私はコックピットがターゲットを指すようにしたいです。 これは私が持っているいくつかのコ...

2  XNA .XNBリソースはEXEまたはDLLに埋め込むことができますか?  ( Can xna xnb resources be embedded into an exe or dll ) 
XNAコンテンツパイプラインによって生成された.xnbリソースファイルは、ルーズファイルとして 'Content'フォルダにダンプされるのではなく、アプリケーション(EXE)またはライブラリ(DLL)に埋め込むことができますか? そうであれば、このプロセスを...

2  XNAゲームコンポーネント  ( Xna game components ) 
私は、1 GameComponentから別のGameComponentから別の変数の値を渡す方法について混乱しています。 私はXNA 4.0を使用しています。 私は2つのGameComponents、DrawStringとInputManagerを作成しました...

0  メインページクラスのコンストラクタからボタンの背景イメージを変更する  ( Change buttons background image from constructor of mainpage class ) 
以下のコードは 360 を投げています。ボタンの背景をトグルボタンの状態を比較して保持したいです。 <事前> <コード> 361 ...

0  XNA:SPRITEBATCH.DRAGH(...)色のみが不透明ピクセルにのみ適用  ( Xna applying spritebatch draw color only to non transparent pixels ) 
私はアルファチャンネルを持つPNGからスプライトを搭載しています。画像には不透明なディスクが含まれており、残りの部分は透明です。 color <コード> color 引数を使用して、ディスクの色合いを変更します。ただし、デフォルトのブレンディング動作はスプ...

1  敵を撃つ、発射体の次の位置を計算する方法  ( Shooting the enemy how to calculate the next position of the projectile ) 
私は十分に近づくとターゲットを撮影する位置ベクトル2の塔を覆っています。発射体はそれが起動のようにタワーの位置を継承し、次にそれを打つと思われるターゲットベクトル2を取得します。 発射体が独自の位置と目標位置とスピードを知っているときに、すべての更新で新しい位...

9  連続2D空間における障害物回避による基本的な経路  ( Basic pathfinding with obstacle avoidance in a continuous 2d space ) 
私は、クリーチャーオブジェクトが環境内の他の任意のオブジェクトに向かって移動できるシミュレーションを書いています。インテリジェントな経路を実行するのではなく、障害物の周りを滑ります。 1つの一般的な方向に移動し、障害物の周りに跳ね返るために、 plan>パスを...

1  私のプラットフォームスプライトの上に私のプレーヤースプライトを作る  ( Making my player sprite land on top of my platform sprite ) 
私のXNAゲームで(途中でXNAにとってはかなり新しい)私は自分のプレイヤースプライトがプラットフォームの上に着地したいと思います。私の通常のスプライトクラスから継承したプレイヤースプライトクラスと通常のスプライトクラスがあります。 ボックス、背景のもの、プラ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有