Как заставить текстуру двигаться - PullRequest
2 голосов
/ 14 ноября 2011

У меня проблема. Я пытался заставить мою текстуру двигаться, но мое решение медленное, и оно не работает. Кто-нибудь знает, как заставить texture2D двигаться с помощью C # XNAGamestudio. Кто-нибудь, пожалуйста, помогите мне!

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();
        }

Ответы [ 3 ]

4 голосов
/ 14 ноября 2011

Хм, технически это выглядит так: должен перемещать текстуру вдоль оси X.

Что касается производительности, вы можете принять во внимание следующее:

  1. Вы звоните this.AddObject("Nameee", "C:\\Box.png"); при каждом обновлении.Это не очень хорошая вещь.Вызовите это один раз в вашем методе LoadContent ().
  2. Вместо использования Thread.Sleep(100);, я бы посоветовал отслеживать время, прошедшее с GameTime. (Нажмите на комментарий, если вам нужен пример того, как это сделать)
  3. Вы создаете новый вектор2 на каждом проходе для позиции текстуры.Хотя это, вероятно, не имеет заметного снижения производительности, поскольку создает всего 10 секунд (благодаря вашему Thread.Sleep(100);, я бы предложил использовать тот же самый.

На заметке сторон, я быРекомендую полностью рефакторинг этого кода для более объектно-ориентированного подхода. Создайте класс, который содержит Texture2D и Vector2. Затем предоставьте ему метод Update () и метод Draw (SpriteBatch sb) и выполните там свою работу.

Это всего лишь предложение.

3 голосов
/ 14 ноября 2011

Вы можете сделать что-то похожее на это, и вы должны использовать менеджер контента для загрузки ресурсов.

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();   
}
2 голосов
/ 14 ноября 2011

Оба хороших ответа от Blau и justnS.Я бы также посоветовал взглянуть на некоторые учебные пособия по XNA, чтобы лучше понять платформу XNA и то, как ее следует использовать (т. Е. Назначение отдельных Initialize(), LoadContent(), Update(), Draw(),и т. д.).

Попробуйте для начала:

...