2011-11-14 14 views
2

問題があります。私はテクスチャを移動させる方法を試しましたが、私の解決策は遅く、機能しません。誰もC#XNAGamestudioを使ってtexture2Dを動かす方法を知っていますか?誰か助けてください!テクスチャの移動方法

EDIT:

GraphicsDeviceManager graphics; 
     SpriteBatch spriteBatch; 
     public Hashtable Objects = new Hashtable(); 
     public Hashtable XPOS = new Hashtable(); 
     public Hashtable YPOS = new Hashtable(); 
     public int NUM = 0; 
     public bool UP = true; 
     public bool DOWN = false; 
     public bool LEFT = false; 
     public bool RIGHT = false; 
    ...... 
protected override void Update(GameTime gameTime) 
     { 
      // Allows the game to exit 
      if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) 
       this.Exit(); 
      this.AddObject("Nameee", "C:\\Box.png"); 
      // TODO: Add your update logic here 
      if (UP) 
      { 
       if (NUM != 25) 
       { 
        AppendObject(new Vector2((float)this.XPOS["Nameee"], (float)this.XPOS["Nameee"] - NUM), "Nameee"); 
        NUM++; 
        Thread.Sleep(100); 
       } 
       else 
        UP = false; 
      } 
      base.Update(gameTime); 
     } 

     /// <summary> 
     /// This is called when the game should draw itself. 
     /// </summary> 
     /// <param name="gameTime">Provides a snapshot of timing values.</param> 
     protected override void Draw(GameTime gameTime) 
     { 
      //GraphicsDevice.Clear(Color.CornflowerBlue); 
      //spriteBatch.Begin(); 

      //spriteBatch.End(); 


      //base.Draw(gameTime); 
     } 
     public void AddObject(string TagName, string ObjectImage) 
     { 
      Texture2D fileTexture; 
      using (FileStream fileStream = new FileStream(@ObjectImage, FileMode.Open)) 
      { 
       fileTexture = Texture2D.FromStream(graphics.GraphicsDevice, fileStream); 
      } 
      if (!this.Objects.ContainsKey(TagName)) 
      { 
       this.Objects.Add(TagName, fileTexture); 
       this.XPOS.Add(TagName, 0.0F); 
       this.YPOS.Add(TagName, 50.0F); 
      } 
     } 
     public void AppendObject(Vector2 pos, string tagName) 
     { 
      spriteBatch.Begin(); 
      spriteBatch.Draw((Texture2D)this.Objects[tagName], new Vector2((float)this.XPOS[tagName], (float)this.YPOS[tagName]), Color.White); 
      spriteBatch.End(); 
     } 
+1

あなたはすでにやっていることのいくつかのコードは非常に参考になる:) –

+0

私はそれを追加しました。 – user35443

+0

各フレームに新しいテクスチャオブジェクトを作成しているようです。それは悪いです。それをしないでください。 – thedaian

答えて

3

あなたはこれに似た何かを行うことができ、あなたが資産をロードするためにコンテンツマネージャを使用する必要があります。それは X軸に沿ってテクスチャを移動する必要がありますように

public class Sprite 
{ 
    public Vector2 Position = Vector2.Zero; 
    public Texture2D Texture; 
    public float Scale = 1; 


    public void LoadAsset(Game game, string asset) 
    { 
     Texture = game.Content.Load<Texture2d>(asset); 
    } 

    public Draw(SpriteBatch batch) 
    { 
     batch.Draw(Texture, Position, null, Color.White, ...,... Scale,...); 
    } 
} 


//In your game: 

List<Sprite> Sprites = new List<Sprite>(); 

Initialize() 
{ 
    base.Initialize(); 
    Sprite myBox = new Box(); 
    myBox.LoadAsset("Box"); 
    Sprites.Add(myBox); 
} 


Update(GameTime gametime) 
{ 
    myBox.Position += Vector2.UnitX * Speed * (float) gametime.elapsed.TotalSeconds; 
} 


Draw() 
{ 
    batch.begin(); 
    foreach (Sprite sprite in Sprites) sprite.Draw(batch); 
    batch.end(); 
} 
+0

+1答えは同じですがコードフォーム –

+0

申し訳ありませんが、私は同意できません。私はこのエラーがあります:http://prntscr.com/41ufk 私を助けてください – user35443

+0

これは擬似コードであり、テストされていないことに注意してください...あなたがinitializeメソッドでスプライトを作成する場合はbase.Initialize( ) 前。私はコードを編集しています... :) – Blau

4

うーん、よく技術的に、これが見えます。

パフォーマンスのためとして、あなたは考慮にこれらの事をしたいことがあります。あなたはすべての更新にthis.AddObject("Nameee", "C:\\Box.png");を呼び出している

  1. 。それは良いことではありません。 LoadContent()メソッドでこれを一度呼び出します。
  2. Thread.Sleep(100);の代わりに、GameTimeで経過時間を追跡することをお勧めします。 (これを行う方法の例が必要な場合はコメントを入力してください)
  3. テクスチャ位置のパスごとに新しいベクトル2を作成しています。そのだけ秒10を作成するので、これはおそらく、(あなたのThread.Sleep(100);のおかげで顕著なパフォーマンスヒットを持っていない、私は同じものを使用することをお勧めしますが。

サイドノートでは、私は完全にこのコードをリファクタリング推薦しますTexture2DとVector2を保持するクラスを作成し、Update()メソッドとDraw(SpriteBatch sb)メソッドを与えてそこで作業を行います。

これは単なる提案です

+0

+1また、コードの読書とパフォーマンスを作る事実の良い説明はひどいです – Blau

2

BlauとjustnSの両方の良い答えです。また、より良いundを得るためにいくつかのXNAチュートリアルを見ることをお勧めしますXNA Frameworkの矛盾とそれがどのように使用されるべきか(すなわち、別途の目的は、Initialize()LoadContent()Update()Draw()などの方法です)。

は先発のためにこれらを試してみてください:

+0

+1、良い提案(特にRiemerの - ***非常に** *初心者には良い) – jadarnel27

関連する問題